概率语言模型:N-gram

接近实际情况的概率语言模型实现

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=3Trigram模型…

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

1
2
3
4
5
6
7
8
9
10
11
dct = defaultdict(Counter)
for i in range(0, len(ls)-2):
context = ls[i] + ',' + ls[i+1]
word = ls[i+2]
dct[context][word] += 1
print len(dct)
print dct
for key in dct:
print dct[key].items()
print dct.keys()
dct.values()

在不停测试的时候遇到一个TypeError错误,才算是比较清楚的理解dct里面存的是什么。
dct其实是个字典,特殊的字典,他的keycontext文本,value是对word做的Counter

既是每一个dct[key]都是一个Counter类型,每一个dct[context]其实是对word做的词频统计。对应于概率语言模型的理解,有了前文context,接下来最有可能出现的是哪一个word