大家好,我正在实现 Stupid Backoff (第 2 页,等式 5)我正在从事的项目的平滑技术,我对其实现有疑问。这是 NLP 中使用的平滑算法,Good-Turing 是我猜最广为人知的类似算法。
该算法的简要说明是:
当试图找到单词出现在句子中的概率时,它首先会在 n-gram 级别寻找单词的上下文,如果没有那个大小的 n-gram,它将递归到 (n-1)-gram并将其分数乘以 0.4。递归在 unigrams 处停止。
因此,如果我想在“晴天”的上下文中找到“天”的概率,它会首先查看语料库中是否存在三元组“晴天”,如果不存在,则尝试与二元组“晴天”,最后它只会得到“天”的频率除以语料库大小(训练数据中的单词总数)。
我的问题是:每次减少 n-gram 的大小时,我是否将分数乘以 0.4?
因此,在上面的示例中,如果我们无法找到三元组或二元组,则最终分数将是:
0.4 * 0.4 * 频率(天)/语料库大小?
或者我只是在最终级别乘以一次,所以无论我必须进行多少退避,我都只将最终分数乘以 0.4?
最佳答案
基本上我读到了你在上面的数学中描述的等式 5。
因此,对于没有观察到实例的“晴天”,您将计算 S("day"| "a sunly")。找不到三元组“晴天”,您将在等式 5 中采用案例二,并将 S("day"| "a sunny") 估计为 alpha * S("day"| "sunny")。
如果再一次,您没有记录“晴天”的纪念日,您会将 S("day"| "sunny") 近似为 alpha * S("day"),这是终端情况 f("day")/N(观察到的 unigrams 的数量)。
通过将 alpha 设置为 0.4,您将得到上面写的内容。
希望这可以帮助。
-bms20
关于nlp - 愚蠢的退避实现说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16383194/