【问题标题】:Python : Unable to return correct count when searching counter with variable as keyPython:以变量为键搜索计数器时无法返回正确的计数
【发布时间】:2018-06-13 18:59:55
【问题描述】:

我正在使用正则表达式来查找与计数器键对应的字符串,并且我正在尝试使用包含这些字符串之一的变量来访问此计数器。它与键相同,但是当我直接使用变量而不是键时,计数返回一个 integer 等于零。例如,变量ngram_b 包含字符串('long,'),它是我计数器中的一个键。使用下面的代码,proba_b 将等于零,我得到除以零错误,但 proba_b = probas.ngrams[order][('long,')] 返回正确答案 0.006.

for ngram, count in joint_probas.items():
    ngram_b = re.search(r'(?<=\), ).*\)(?=\))',str(ngram),re.DOTALL)
    ngram_b= ngram_b.group(0)
    order = int(ngram_b.count('\'')/2)
    proba_b = probas.ngrams[order][ngram_b]
    if proba_b == 0 :
        print(ngram_b, order)
    proba_joint = joint_probas[ngram]
    condi_prob[ngram] = proba_joint / proba_b

这对我来说真的很奇怪,关于字典的工作原理,我一定有什么不明白的地方,希望有人能看到我缺少的东西。

编辑:Joint_probas 是一个计数器,包含两个 ngram 的联合概率,键的格式(对于一个带有二元语法的一元语法):(('word1',), ('word2', 'word3'))Probas 是一个计数器,包含所有 ngram 的概率,格式为 ('word2', 'word3') 为一个二元组。我试图在joint_probas 的每个条目中查找第二项的单一概率以计算条件概率。

谢谢

【问题讨论】:

  • 很难从你的例子中看出,因为joint_probas和probas没有定义,但是如果你看到字符串('long,')可能是一个包含字符串而不是包含括号。您应该将示例更新为人们可以运行而无需猜测某些字典的输入数据或值的示例。
  • Joint_probas 是一个计数器,包含两个 ngram 的联合概率,键的格式(对于一个带有一个二元的一元):(('word1',), ('word2', 'word3'))Probas 是一个计数器,包含所有 ngram 的概率,格式为 ('word2', 'word3') 用于二元组。我正在尝试在joint_probas 的每个条目中查找第二项的单一概率以计算条件概率。
  • 'long,' 包裹在括号中似乎是多余的,因为type(('long,')) 产生str。不是元组,因为它没有尾随逗号。关于丢失的输入数据似乎仍然有点不清楚,因为您的 Joint_probas 看起来像一个元组的元组,而 Probas 是一个单一的元组,而不是字典。能给我们Joint_probas的字典结构吗?
  • 我认为我的问题来自于我假设字典中的键是简单字符串的事实。难道它们仍然是元组,我正在尝试访问一个键,它是一个具有相同字符串的元组。

标签: python dictionary counter


【解决方案1】:

您还没有给出probas 的数据结构,所以我只能猜测它的成员是字典列表,其键是元组,如下所示:

>>> class Foo:
>>>     ngrams = [ { ('word2', 'word3') : 11 }, { ('word2', 'word3') : 12 }, { ('word2', 'word3') : 13 } ]
>>> probas = Foo()

定义一个元组类型的键,以及它的字符串版本:

>>> key = ('word2','word3')
>>> type(key)
<type 'tuple'>
>>> strKey = str(key)
>>> type(strKey)
<type 'str'>

然后:

>>> probas.ngrams[2][key]
13
>>> probas.ngrams[2][strKey]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: "('word2', 'word3')"

我怀疑这是你的问题,因为在正则表达式之后, ngram_b 将是一个字符串,而你正在使用它来查找一个元组的键。不过,如果没有完整的示例,则无法确定,顺便说一句,这可以为大家节省一些时间。

【讨论】:

  • 没错,我对 python 字典很陌生,我认为键是过去元组的简单字符串表示,这就是为什么我努力尝试用正则表达式提取 ngram 而我可以做一个简单的 ngram_b[1] 因为键仍然是一个元组。感谢您的帮助!
  • 请推荐或选择任何有用的 cmets 或答案。下次还要发布一个完整的独立代码示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 2015-12-20
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多