我想比较一个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'的一些引用之外,我没有找到第二种方法。但是,这是三卦!
如何更改上面的代码来计算它?必须从开发集中估计此方法的参数。
在这个答案中,我只是澄清了一些我刚刚发现的关于你的问题的事情,但我无法提供编码解决方案。
KneserNeyProbDist
你似乎是指这个问题的python实现:https://kite.com/python/docs/nltk.probability.KneserNeyProbDistmodified Kneser-Ney
:
使用插值代替退避。对一个和两个计数使用单独的折扣,而不是对所有计数的单个折扣。估计对保留数据的折扣,而不是使用基于培训计数的公式。
实验表明,所有三个修改都提高了性能。
改良的Kneser-Ney始终具有最佳性能。
遗憾的是,该文件中没有解释修改后的版本。Modified Kneser–Ney smoothing
在本文件的第370页有解释:http://u.cs.biu.ac.il/~yogo/courses/mt2013/papers/chen-goodman-99.pdf。
我将这里最重要的文字和公式复制为截图:所以Modified Kneser–Ney smoothing
现在已知并且似乎是最好的解决方案,只需在运行代码中翻译公式旁边的描述仍然是一步。在原始链接文档中显示的文本(屏幕截图上方)下方仍然有一些解释可能有助于理解原始描述。