应用场景
- 判断一句话是否通顺(是不是人话)
- 自动生成句子,诗句,作文,等
- 单词纠错
- 等等
种类
- Unigram-Model
- Bigram-Model
- N-gram-Model
计算方式
Unigram-Model:
p
(
w
1
,
w
2
,
w
3
…
…
,
w
n
)
=
p
(
w
1
)
p
(
w
2
)
p
(
w
3
)
…
…
p
(
w
n
)
p(w_1,w_2,w_3……,w_n)=p(w_1)p(w_2)p(w_3)……p(w_n)
p(w1,w2,w3……,wn)=p(w1)p(w2)p(w3)……p(wn)
Bigram-Model:
p
(
w
1
,
w
2
,
w
3
,
…
…
,
w
n
)
=
p
(
w
1
)
p
(
w
2
∣
w
1
)
p
(
w
3
∣
w
2
)
…
…
p
(
w
n
∣
w
n
−
1
)
p(w_1,w_2,w_3,……,w_n)=p(w_1)p(w_2|w_1)p(w_3|w_2)……p(w_n|w_{n-1})
p(w1,w2,w3,……,wn)=p(w1)p(w2∣w1)p(w3∣w2)……p(wn∣wn−1)
Trigram-Model: N=3 的 N-gram-Model
p
(
w
1
,
w
2
,
w
3
,
w
4
…
…
,
w
n
)
=
p
(
w
1
)
p
(
w
2
∣
w
1
)
p
(
w
3
∣
w
1
w
2
)
p
(
w
4
∣
w
2
w
3
)
…
…
p
(
w
n
∣
w
n
−
1
w
n
−
2
)
p(w_1,w_2,w_3,w_4……,w_n)=p(w_1)p(w_2|w_1)p(w_3|w_1w_2)p(w_4|w_2w_3)……p(w_n|w_{n-1}w_{n-2})
p(w1,w2,w3,w4……,wn)=p(w1)p(w2∣w1)p(w3∣w1w2)p(w4∣w2w3)……p(wn∣wn−1wn−2)
举例说明
需要的数据
S
1
=
S_1=
S1=“今天好吃的真晚饭”
S
2
=
S_2=
S2=“今天的晚饭真好吃”
分词:[‘今天’,‘好吃’,‘的’,‘真’,‘晚饭’]
每个分词计算出来的概率(语料库中单词出现的概率,通过训练数据计算):
p
(
今
天
)
=
0.53
p(今天)=0.53
p(今天)=0.53
p
(
好
吃
)
=
0.28
p(好吃)=0.28
p(好吃)=0.28
p
(
今
天
∣
好
吃
)
=
0.08
p(今天|好吃)=0.08
p(今天∣好吃)=0.08
p
(
真
∣
好
吃
)
=
0.16
p(真|好吃)=0.16
p(真∣好吃)=0.16
……等等
如果我们要计算上边两句话哪句更通顺:
Unigram-Model:
P
S
1
=
p
(
今
天
)
p
(
好
吃
)
p
(
的
)
p
(
真
)
p
(
晚
饭
)
P_{S_1}=p(今天)p(好吃)p(的)p(真)p(晚饭)
PS1=p(今天)p(好吃)p(的)p(真)p(晚饭)
P
S
2
=
p
(
今
天
)
p
(
的
)
p
(
晚
饭
)
p
(
真
)
p
(
好
吃
)
P_{S_2}=p(今天)p(的)p(晚饭)p(真)p(好吃)
PS2=p(今天)p(的)p(晚饭)p(真)p(好吃)
在两句话包含的词完全一样,只是顺序不同的情况下可以看出 P S 1 = P S 2 P_{S_1}=P_{S_2} PS1=PS2,Unigram-Model是无法计算出哪句更通顺的。
Bigram-Model:
P
S
1
=
p
(
今
天
)
p
(
好
吃
∣
今
天
)
p
(
的
∣
好
吃
)
p
(
晚
饭
∣
的
)
p
(
∣
晚
饭
)
P_{S_1}=p(今天)p(好吃|今天)p(的|好吃)p(晚饭|的)p(|晚饭)
PS1=p(今天)p(好吃∣今天)p(的∣好吃)p(晚饭∣的)p(∣晚饭)
P
S
2
=
p
(
今
天
)
p
(
的
∣
今
天
)
p
(
晚
饭
∣
的
)
p
(
真
∣
晚
饭
)
p
(
好
吃
∣
真
)
P_{S_2}=p(今天)p(的|今天)p(晚饭|的)p(真|晚饭)p(好吃|真)
PS2=p(今天)p(的∣今天)p(晚饭∣的)p(真∣晚饭)p(好吃∣真)
上边像
p
(
好
吃
∣
真
)
p(好吃|真)
p(好吃∣真)这样的概率怎么理解呢?
在概率中
p
(
B
∣
A
)
p(B|A)
p(B∣A)的意思是:事件A发生的前提下,事件B发生的概率。
对于
p
(
好
吃
∣
真
)
p(好吃|真)
p(好吃∣真)可以理解为,“好吃”这个词前边的词是“真”的概率。
当有充足合适,并且符合我们日常语言的的语料库时,对比
p
(
好
吃
∣
真
)
p(好吃|真)
p(好吃∣真)和
p
(
好
吃
∣
今
天
)
p(好吃|今天)
p(好吃∣今天)两种概率一定是
p
(
好
吃
∣
真
)
p(好吃|真)
p(好吃∣真)更大的。
像这样计算每个组合的概率的乘积后,可以得出
P
S
1
<
P
S
2
P_{S_1}<P_{S_2}
PS1<PS2,也就是第二句话更通顺,它的通顺度是
P
S
2
P_{S_2}
PS2
Trigram-Model:
P
S
1
=
p
(
今
天
)
p
(
好
吃
∣
今
天
)
p
(
的
∣
今
天
好
吃
)
p
(
晚
饭
∣
好
吃
的
)
p
(
∣
的
晚
饭
)
P_{S_1}=p(今天)p(好吃|今天)p(的|今天好吃)p(晚饭|好吃的)p(|的晚饭)
PS1=p(今天)p(好吃∣今天)p(的∣今天好吃)p(晚饭∣好吃的)p(∣的晚饭)
P
S
2
=
p
(
今
天
)
p
(
的
∣
今
天
)
p
(
晚
饭
∣
今
天
的
)
p
(
真
∣
的
晚
饭
)
p
(
好
吃
∣
晚
饭
真
)
P_{S_2}=p(今天)p(的|今天)p(晚饭|今天的)p(真|的晚饭)p(好吃|晚饭真)
PS2=p(今天)p(的∣今天)p(晚饭∣今天的)p(真∣的晚饭)p(好吃∣晚饭真)
和Bigram-Model的区别是N-gram-Model要考虑前方更多的词与当前词相连的概率。
如果我们要根据词库生成一句话:
Unigram-Model:
假设词库里只有[‘今天’,‘好吃’,‘的’,‘真’,‘晚饭’] 五个词,
从中随机选词组成句子,最后的结果应该都一样,无法保证语序正确
P
S
1
=
p
(
今
天
)
p
(
好
吃
)
p
(
的
)
p
(
真
)
p
(
晚
饭
)
P_{S_1}=p(今天)p(好吃)p(的)p(真)p(晚饭)
PS1=p(今天)p(好吃)p(的)p(真)p(晚饭)
Bigram-Model:
假设词库里只有[‘今天’,‘好吃’,‘的’,‘真’,‘晚饭’] 五个词
Bigram-Model是要考虑前后文的,因此有个上下文概率矩阵,如下:
今天 | 好吃 | 的 | 真 | 晚饭 | #END | |
---|---|---|---|---|---|---|
#START | 0.4 | 0.2 | 0.15 | 0.22 | 0.13 | 0.01 |
今天 | 0 | 0.11 | 0.45 | 0.25 | 0.13 | 0.2 |
好吃 | 0.1 | 0 | 0.3 | 0.2 | 0.1 | 0.55 |
的 | 0.1 | 0.2 | 0 | 0.1 | 0.5 | 0.02 |
真 | 0.32 | 0.56 | 0.23 | 0 | 0.1 | 0.02 |
晚饭 | 0.2 | 0.1 | .022 | 0.62 | 0 | 0.2 |
(表格中的数据都是编的)
大致逻辑:
如果要生成一句话可以先把#START(起始位标识符)取出来,然后找到最大的
p
(
X
∣
#
S
T
A
R
T
)
p(X|\#START)
p(X∣#START)或相对大的一个,
如
p
(
今
天
∣
#
S
T
A
R
T
)
=
0.4
p(今天|\#START)=0.4
p(今天∣#START)=0.4在表中是最大的,可以理解为,以“今天”这个词作为开头相对其他词更合适。
然后可以去看
p
(
X
∣
今
天
)
p(X|今天)
p(X∣今天)的概率,找出“今天”这个词后边跟哪个词概率更大,或相对较大。可以看出
p
(
的
∣
今
天
)
=
0.45
p(的|今天)=0.45
p(的∣今天)=0.45还可以,所以可以选定“的”放在今天的后边,这样就得到了“今天的”这个字符串。
后边也是以此推类,找出
p
(
X
∣
的
)
p(X|的)
p(X∣的)的合适概率
p
(
晚
饭
∣
的
)
p(晚饭|的)
p(晚饭∣的)。
……省略相同步骤
最后寻找 p ( X ∣ 好 吃 ) p(X|好吃) p(X∣好吃)时遇到了 p ( # E N D ∣ 好 吃 ) p(\#END|好吃) p(#END∣好吃)说明好吃后面为#END(结束位标识符)概率最大,说明这句话就结束了。最后能得到句子“今天的晚饭真好吃”。
如果词库够丰富,用随机的方式取值,选通顺度相对高的词,也可以造出其他符合人类语感句子。
N-gram-Model:
比如N=3的Trigram-Model相对于Bigram-Model,Trigram-Model是三个词之间的先后关系概率,道理是一样的。但是感觉N太多可能会过拟合,生产句子“创意”会下降。
##ps
学习中,如有问题感谢指正,欢迎交流。