gpt4 book ai didi

python - 使用 Witten Bell Smoothing 在 nltk 中使用 NgramModel 训练和评估二元组/三元组分布

转载 作者:行者123 更新时间:2023-11-28 17:47:39 25 4
gpt4 key购买 nike

我想在一组句子上训练 NgramModel,使用 Witten-Bell 平滑来估计看不见的 ngram,然后用它来获得由该分布生成的测试集的对数似然。我想做与此处文档示例几乎相同的事情:http://nltk.org/_modules/nltk/model/ngram.html ,但改为使用 Witten-Bell 平滑。这里有一些玩具代码试图做我想做的事情:

from nltk.probability import WittenBellProbDist
from nltk import NgramModel

est = lambda fdist, bins: WittenBellProbDist(fdist)
fake_train = [str(t) for t in range(3000)]
fake_test = [str(t) for t in range(2900, 3010)]

lm = NgramModel(2, fake_train, estimator = est)

print lm.entropy(fake_test)

不幸的是,当我尝试运行它时,出现以下错误:

Traceback (most recent call last):
File "ngram.py", line 8, in <module>
lm = NgramModel(2, fake_train, estimator = est)
File "/usr/lib/python2.7/dist-packages/nltk/model/ngram.py", line 63, in __init__
self._model = ConditionalProbDist(cfd, estimator, len(cfd))
File "/usr/lib/python2.7/dist-packages/nltk/probability.py", line 2016, in __init__
**factory_kw_args)
File "ngram.py", line 4, in <lambda>
est = lambda fdist, bins: WittenBellProbDist(fdist)
File "/usr/lib/python2.7/dist-packages/nltk/probability.py", line 1210, in __init__
self._P0 = self._T / float(self._Z * (self._N + self._T))
ZeroDivisionError: float division by zero

是什么导致了这个错误?据我所知,我根据文档正确使用了所有内容,并且当我使用 Lidstone 而不是 Witten-Bell 时效果很好。

作为第二个问题,我有一组不相交句子的数据。我怎样才能像字符串列表一样使用句子,或者做一些会产生相同分布的等价物? (也就是说,我当然可以只使用一个列表,其中包含所有句子,并用虚拟标记分隔后续句子,但这不会产生相同的分布。)文档在一个地方说允许使用字符串列表,但后来我发现了一个错误报告,其中文档应该被编辑以反射(reflect)这是不允许的(当我只是尝试一个字符串列表列表时我得到一个错误)。

最佳答案

这显然是 almost 3 years 的已知问题. ZeroDivisionError 的原因是因为 __init__ 中的以下几行,

if bins == None: 
bins = freqdist.B()
self._freqdist = freqdist
self._T = self._freqdist.B()
self._Z = bins - self._freqdist.B()

只要未指定 bins 参数,它默认为 None 所以 self._Z 实际上只是 freqdist.B( ) - freqdist.B()

self._P0 = self._T / float(self._Z * (self._N + self._T))

减少到,

self._P0 = freqdist.B() / 0.0

此外,如果您将 bins 指定为大于 freqdist.B() 的任何值,则在执行这行代码时,

print lm.entropy(fake_test)

您将收到 NotImplementedError,因为在 WittenBellProbDist 类中,

def discount(self): 
raise NotImplementedError()

discount 方法显然也用于 NgramModel 类的 problogprob 所以你不会也无法调用它们。

在不更改 NLTK 的情况下解决这些问题的一种方法是继承 WittenBellProbDist 并覆盖相关方法。

关于python - 使用 Witten Bell Smoothing 在 nltk 中使用 NgramModel 训练和评估二元组/三元组分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15697623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com