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),既是每一个词同时出现的概率。
直接上代码:123s = float(sum(l_model.values()))for key, cnt in l_model.items(): l_model[key] /= s
这一段是计算一份语料里面每一个词出现的频率,其中:l_model既是Naive的语言模型,里面统计的是每一个词出现的频次。1234567def 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模型的学习