概率语言模型:Naive

Naive的概率语言模型实现

上一节,引出概率语言模型的时候给出的计算句子出现的概率的公式:
计算句子的概率:P(S)=P(w1,w2,w3,…,wn)

在对公式进行拆解的时候,有:
P(w1w2)=P(w2|w1)*P(w1)
在此基础上,进行粗糙的假设:P(w2|w2)≈P(w2)

这里的假设很Naive,舍弃了很多,最终得到的肯定和理想偏差很多,可是我们可以从这样的公式里面得到后面对N-gram模型的构建。
假设以后,上面的计算句子概率公式变成:
P(S)=P(w1)P(w2)…P(wn),既是每一个词同时出现的概率。


直接上代码:

1
2
3
s = float(sum(l_model.values()))
for key, cnt in l_model.items():
l_model[key] /= s

这一段是计算一份语料里面每一个词出现的频率,其中:l_model既是Naive的语言模型,里面统计的是每一个词出现的频次。

1
2
3
4
5
6
7
def generate(l_model):
r = random.random()
s = 0.0
for (word, prob) in l_model.most_common():
s += prob
if s >= r:
return word

定义一个生成器,设置一个随机数做这里的阈值,达到这个阈值,表示随机抽样抽中了,直接return。

这里的模型比较Naive,得到的语言模型基本上不通。
下一节介绍N-gram模型的学习