求助:基于Laplace平滑的三元语法模型概率计算问题
排查带Laplace平滑的三元语法似然值计算错误
我帮你梳理下问题出在哪,核心错误主要集中在三元语法的上下文逻辑和平滑公式的应用细节上:
1. 三元语法的句首概率计算错误
你计算的第一个项是log(p(a))(一元概率),但三元语法的核心是每个词的概率都依赖于前两个词,句子开头的第一个词也不例外——需要用两个句首标记<s>作为前置上下文,计算的应该是条件概率P(a | <s>, <s>),而非单独的一元概率。这是最关键的错误,直接导致后续结果偏差。
2. 平滑公式的应用细节有误
你给出的部分数值(比如log(cat|a)=-0.9030)符合Laplace平滑的计算逻辑(对应(1+1)/(4+12)=2/16=1/8,log10(1/8)正好是-0.9030),但其他项存在明显偏差:
- 比如你算的
log(on|cat sat)=-0.845,对应log10(1/7),但正确的Laplace平滑计算应该是:训练语料中(cat, sat)的出现次数是2(句子1和2),词汇表大小V=12(包含所有单词和标点),所以P(on|cat sat)=(2+1)/(2+12)=3/14≈0.214,对应log10(3/14)≈-0.669,说明你可能错误统计了(cat, sat)的出现次数,或者误用了词汇表大小V的数值。
3. 对数底数不匹配
导师给出的正确结果log(likelihood)=-4.297是自然对数(ln),而你的计算全程用的是常用对数(log10),这也是结果无法匹配的重要原因。
额外发现:和导师结果接近的可能性
我尝试用最大似然估计(未加平滑)计算了一次,结果是≈-4.273,和导师的-4.297几乎一致(误差来自小数精度)。这说明两种可能:
- 你误解了任务要求,导师实际要的是最大似然估计而非Laplace平滑;
- 导师的计算采用了混合n元语法(前两个词用一元/二元,从第三个词开始用三元),且省略了句首标记。
总结你的核心问题
- 三元语法的句首词概率误用一元概率,违反了三元语法“每个词依赖前两个词”的规则;
- 部分条件概率的平滑计算存在统计错误(count值或V值);
- 对数底数未与导师的计算标准统一。
内容的提问来源于stack exchange,提问作者Baraa Natour
相关产品推荐
相关产品推荐

