什么是语言模型
本文参考维基百科语言模型 language model
统计语言模型是一个单词序列上的概率分布,对于一个给定长度为m的序列,它可以为整个序列产生一个概率 P(w_1,w_2,…,w_m) 。其实就是想办法找到一个概率分布,它可以表示任意一个句子或序列出现的概率。
目前在自然语言处理相关应用非常广泛,如语音识别(speech recognition) , 机器翻译(machine translation), 词性标注(part-of-speech tagging), 句法分析(parsing)等。传统方法主要是基于统计学模型,最近几年基于神经网络的语言模型也越来越成熟。
Unigram models
Unigram models也即一元文法模型,它是一种上下文无关模型。该模型仅仅考虑当前词本身出现的概率,而不考虑当前词的上下文环境。概率形式为 P ( w 1 , w 2 , . . . , w m ) = P ( w 1 ) ∗ P ( w 2 ) ∗ . . . ∗ P ( w m ) P(w_1,w_2,...,w_m)=P(w_1)*P(w_2)*...*P(w_m) P(w1,w2,...,wm)=P(w1)∗P(w2)∗...∗P(wm),即一个句子出现的概率等于句子中每个单词概率乘积。
以一篇文档为例,每个单词的概率只取决于该单词本身在文档中的概率,而文档中所有词出现的概率和为1,每个词的概率可以用该词在文档中出现的频率来表示,如下表中
Terms | Probability |
---|---|
a | 0.1 |
world | 0.2 |
likes | 0.05 |
we | 0.03 |
share | 0.26 |
… | … |
对于这篇文档中,所有概率和相加为1,即 ∑ P ( t e r m ) = 1 \sum P(term) = 1 ∑P(term)=1
n-gram模型
n-gram models也即n元语言模型,针对一个句子 w 1 , w 2 , . . . , w m w_1,w_2,...,w_m w1,w2,...,wm 的概率表示如下:
P ( w 1 , w 2 , . . . , w m ) = ∏ i = 1 m P ( w i ∣ w 1 , . . . , w i − 1 ) = ∏ i = 1 m P ( w i ∣ w i − ( n − 1 ) , . . . , w i − 1 ) P(w_1,w_2,...,w_m)= \prod_{i=1}^{m}P(w_i|w_1,...,w_{i-1})=\prod_{i=1}^{m}P(w_i|w_{i-(n-1),...,w_{i-1}}) P(w1,w2,...,wm)=i=1∏mP(wi∣w1,...,wi−1)=i=1∏mP(wi∣wi−(n−1),...,wi−1) 这里可以理解为当前词的概率与前面的n个词有关系,可以理解为上下文有关模型。
n-gram模型中的条件概率可以用词频来计算:
P ( w i ∣ w i − ( n − 1 ) , . . . , w i − 1 ) = c o u n t ( w i − ( n − 1 ) , . . . , w i − 1 , w i ) c o u n t ( w i − ( n − 1 ) , . . . , w i − 1 ) P(w_i|w_{i-(n-1)},...,w_{i-1})=\frac{count(w_{i-(n-1)},...,w_{i-1},w_i)}{count(w_{i-(n-1)},...,w_{i-1})} P(wi∣wi−(n−1),...,wi−1)=count(wi−(n−1),...,wi−1)count(wi−(n−1),...,wi−1,wi) 这里举个栗子:我们的原始文档是 doc = “我不想写代码了” ,经过中文分词处理后为 words = [“我”, “不想”, “写”, “代码”, “了”]。
那么产生原始文档doc的概率为:
P(我, 不想, 写, 代码, 了) = P(我) x P(不想|我) x P(写|我, 不想) x P(代码|我, 不想, 写) x P (了|我, 不想, 写, 代码)
相乘的每个概率可以通过统计词频来获得:
n-gram | probability |
---|---|
P(不想|我) = | count(我, 不想) / count(我) |
P(写|我, 不想) = | count(我, 不想, 写) / count(我, 不想) |
P(代码|我, 不想, 写) = | count(我, 不想, 写, 代码) / count(我, 不想, 写) |
P(了|我, 不想, 写, 代码) = | count(我, 不想, 写, 代码, 了) / count(我, 不想, 写, 代码) |
如果像上面这样去计算,会疯掉的。。。这种计算太复杂了,所以我们是否可以简化只考虑少数的词呢,如二元bigram模型,当前词只与它前面的一个词相关,这样概率求解就简化很多:
P ( w 1 , w 2 , . . . , w m ) = ∏ i = 1 m P ( w i ∣ w i − ( n − 1 ) , . . . , w i − 1 ) = ∏ i = 1 m P ( w i ∣ w w i − 1 ) P(w_1,w_2,...,w_m)=\prod_{i=1}^{m}P(w_i|w_{i-(n-1),...,w_{i-1}}) = \prod_{i=1}^{m}P(w_i|w_{w_{i-1}}) P(w1,w2,...,wm)=i=1∏mP(wi∣wi−(n−1),...,wi−1)=