接近实际情况的概率语言模型实现
N-gram模型,详细内容可参考维基百科:N-gram
上一节,有概率论条件概率公式:
P(w1,w2) = P(w2|w1)✖️P(w1)
条件多的时候:
P(w1,w2,w3) = P(w1,w2)✖️P(w3|w1,w2) = P(w1)✖️P(w2|w1)✖️P(w3|w1,w2)
累乘起来:
P(w1,w2,…wn) = ∏P(wi|w1,w2,…wi-1)
i的取值区间[1,n]。在上一节,直接将
P(wi|w1,w2,…wi-1)≈P(wi)
这样损失很大,不符合实际情况,所以N-gram模型采用以下公式:
P(wi|w1,w2,…wi-1)≈P(wi|wi-k,…wi-1)
在这里,N-gram模型里面的N,是指公式里面的k。
k=n=2,既是Bigram模型,也叫双字母组,链接参考:Bigram
k=n=3,Trigram模型…
Solution: Add More Context!
● Unigram model ignored context:
P(wi∣w0…wi−1)≈P(wi)
● Bigram model adds one word of context
P(wi∣w0…wi−1)≈P(wi∣wi−1)
● Trigram model adds two words of context
P(wi∣w0…wi−1)≈P(wi∣wi−2wi−1)
● Four-gram, five-gram, six-gram, etc…
NLP Programming Tutorial 2 – Bigram
自己用了一个很Naive的list测试一下Bigram模型
ls是自己随机生成的一个list
在不停测试的时候遇到一个TypeError错误,才算是比较清楚的理解dct里面存的是什么。
dct其实是个字典,特殊的字典,他的key是context文本,value是对word做的Counter
既是每一个dct[key]都是一个Counter类型,每一个dct[context]其实是对word做的词频统计。对应于概率语言模型的理解,有了前文context,接下来最有可能出现的是哪一个word。