我想比较两种用于bigram模型的平滑方法:
对于第一种方法,我找到了一些代码。
def calculate_bigram_probabilty(self, previous_word, word):
bigram_word_probability_numerator = self.bigram_frequencies.get((previous_word, word), 0)
bigram_word_probability_denominator = self.unigram_frequencies.get(previous_word, 0)
if self.smoothing:
bigram_word_probability_numerator += 1
bigram_word_probability_denominator += self.unique__bigram_words
return 0.0 if bigram_word_probability_numerator == 0 or bigram_word_probability_denominator == 0 else float(
bigram_word_probability_numerator) / float(bigram_word_probability_denominator)
但是,除了“ KneserNeyProbDist”的一些参考文献之外,我没有发现第二种方法。但是,这是用于卦的!
如何更改上面的代码以进行计算?该方法的参数必须从开发集中进行估算。
答案 0 :(得分:1)
在此答案中,我只是整理了一些有关您的问题的发现,但我无法提供编码解决方案。
KneserNeyProbDist
中,您似乎指的是该问题的python实现:https://kite.com/python/docs/nltk.probability.KneserNeyProbDist 上面的文章链接了本教程:https://nlp.stanford.edu/~wcmac/papers/20050421-smoothing-tutorial.pdf,但这在最重要的第29页上有一个小错误,明文是这样的:
改良的Kneser-Ney
Chen和Goodman介绍了modified Kneser-Ney
:
- 使用插值而不是退避。对一个和两个计数使用单独的折扣,而不对所有计数使用一个折扣。估算保留数据的折扣,而不使用公式 根据训练次数。
- 实验表明,这三个修改均可以改善性能。
- 改良的Kneser-Ney始终表现最佳。
该文档未解释可修改版本的遗憾。
Modified Kneser–Ney smoothing
:http://u.cs.biu.ac.il/~yogo/courses/mt2013/papers/chen-goodman-99.pdf。因此Modified Kneser–Ney smoothing
现在是众所周知的,并且似乎是最好的解决方案,只是在运行代码中在公式旁边翻译说明仍然是一个步骤。
在原始链接文档中显示的文本下方(屏幕快照上方)仍然是一些有助于理解原始描述的解释,可能会有所帮助。