在自然语言处理的相关问题中,如何表示句子是建模分析的关键。与传统的图像、音频等天然可转化为计算机编码的元素不同,自然语言需要经过复杂编码才能被计算机识别。并且,这种编码是机械式的简单排列,设计初衷是为了解决自然语言的存储问题,编码本身不带有任何语言层面的信息。因此,直接使用自然语言的编码对文字进行转换而后建模是不可靠的,过程中丢失了太多的信息。语言模型正是解决了这样的问题。
语言模型有很多种,计算机领域常用的有统计语言模型和神经语言模型,本篇先只描述统计语言模型。
统计语言模型定义
假设句子可以表示为:
S=w1w2...wn
S
=
w
1
w
2
.
.
.
w
n
其中wi,i=1,2,...,n w i , i = 1 , 2 , . . . , n 为组成句子的基本单位(可以为字、词等划分单位,下文统称为词)。那么以该句子的出现的概率P(S) P ( S ) 来描述该句子的合理性。
可以看到,该定义用概率对语言建模,而不需要进行语言层面的分析。这其实是机器学习解决问题的典型思路,自然界的事物规律可以由概率表达,概率大的事件更加可能出现、更合理,反之亦然。概率本身就可以描述语言现象的合理性。
P(S) P ( S ) 的具体定义
在自然语言中,上下文是相关的。如果以句子为单位,很容易发现,下文是依赖于上文的。比如在对话过程中,人们往往能根据对方已说出的话,来推测接下来对方要说什么。使用条件概率来刻画这种依赖是十分合适的,于是可以定义概率如下:
P(S)=p(w1)p(w2|w1)p(w3|w1w2)...p(wn|w1w2...wn−1)
P
(
S
)
=
p
(
w
1
)
p
(
w
2
|
w
1
)
p
(
w
3
|
w
1
w
2
)
.
.
.
p
(
w
n
|
w
1
w
2
.
.
.
w
n
−
1
)
wi w i 的概率由w1w2...wi−1 w 1 w 2 . . . w i − 1 决定,后者也叫做wi w i 的历史。
问题简化——n元文法
可以看到,原始定义的概率论意义是十分完备的,每个词都基于历史。但这样是有问题的。建模过程中,需要具体计算形如p(wi|w1w2...wi−1) p ( w i | w 1 w 2 . . . w i − 1 ) 的参数。假设词汇表的大小为L L ,那么w1w2...wi−1w1w2...wi−1的不同排列组合有Li−1 L i − 1 种,而这只是计算wi w i 所需要的参数。
因此,我们采取简化的方法,只考虑与该词最近的一段历史(马尔可夫的思路),比如最近的一个词,此时称作二元文法(2-gram):
P(S)=p(w1)p(w2|w1)p(w3|w2)...p(wn|wn−1)
P
(
S
)
=
p
(
w
1
)
p
(
w
2
|
w
1
)
p
(
w
3
|
w
2
)
.
.
.
p
(
w
n
|
w
n
−
1
)
这样的概率处理在语言学上也是说得通的,距离当前词越近的词,造成的影响越大,而距离较远的词,往往产生的影响较小。当然,这不是绝对的,语言现象中有许多反例。但是,借由这种处理,我们达到了“合理建模”与“模型可计算”的巧妙折中。
当认为一个词由前面的n−1 n − 1 个词决定时,称作n元文法。显而易见,随着n的增大,参数量呈指数增加。现实中往往取n=2,3 n = 2 , 3 ,工业界一般会取n=4 n = 4 。
针对某一个句子,通常增加开始符<BOS> < B O S > <script type="math/tex" id="MathJax-Element-13929"> </script>和结束符 <EOS> < E O S > <script type="math/tex" id="MathJax-Element-13930"> </script>使得概率定义更加完备,举例改写二元文法为:
P(S)=p(<BOS>|w1)p(w2|w1)...p(wn|wn−1)p(<EOS>|wn)
P
(
S
)
=
p
(
<
B
O
S
>
|
w
1
)
p
(
w
2
|
w
1
)
.
.
.
p
(
w
n
|
w
n
−
1
)
p
(
<
E
O
S
>
|
w
n
)
参数计算与平滑
一般使用极大似然估计来进行参数估计,即使用已有的采样数据(训练集)来估计模型参数,使得训练集的语言现象得到最大可能性的复现。显然,极大似然在n元文法的场景下就是通过频数来得到概率参数。此时有(以二元文法举例):
P(wi|wi−1)=∑Count(wi−1wi)∑Count(wi)
P
(
w
i
|
w
i
−
1
)
=
∑
C
o
u
n
t
(
w
i
−
1
w
i
)
∑
C
o
u
n
t
(
w
i
)
其中,Count(wi−1wi) C o u n t ( w i − 1 w i ) 表示子串wi−1wi w i − 1 w i 的出现次数,同理Count(wi) C o u n t ( w i ) 。
语言现象是丰富的,即使训练集再庞大,也不可能包括所有子串。当测试集中出现了训练集中没有的词或子串时,句子概率会等于0,但这显然是不科学的。因此我们需要对概率进行平滑,使得即使是没有出现的句子,在模型中计算得到的概率不为0,转而设置为一微小量。
参数平滑方法有很多:加一法(additive smoothing)、折扣法(discounting)、删除减值法等。在各个领域都是适用,这里就暂不详述了。
缺陷
上一部分已经看到,即使是很大的训练集也无法覆盖全部的语言现象,从而导致0概率问题的出现。使用概率进行建模的弊端也在此:依赖语言现象出现的频数。而频数是语料敏感的,不同的语料集之间差异巨大,比如新闻语料和微博语料对于语言的使用风格差异巨大,由此统计而来的频数规律肯定大不相同。在某些场景下,频数甚至无法反映语言现象,如情感分析中,表达情感的词通常是低频出现的,这时统计语言模型无法很好建模。