什么样的词才能算作词
1. 算法简介
-
词语的左右邻字要足够丰富
如果一个字符组合可以成词,它应当出现在丰富的语境中,也就是说,拥有丰富的左右邻字。举个例子,同样是在文本中出现6000+次的副总裁
和人工智
,字符组合的左邻词都在6左右,但副总裁
的右邻字包括{ 张,王,说, ...... }
等147个词,而人工智
的右邻字只有{ 能,障 }
两种,显然人工智
不能称作一个词
信息熵是对信息量多少的度量,信息熵越高,表示信息量越丰富、不确定性越大。因此字符组合左右邻字的丰富程度,可以用信息熵(Entropy)来表示
Entropy ( w ) = − ∑ w n ∈ W Neighbor P ( w n ∣ w ) log 2 P ( w n ∣ w ) \operatorname{Entropy}(w)=-\sum_{w_{n} \in W_{\text {Neighbor }}} P\left(w_{n} \mid w\right) \log _{2} P\left(w_{n} \mid w\right) Entropy(w)=−∑wn∈WNeighbor P(wn∣w)log2P(wn∣w)
-
词语的内部凝聚程度要足够高
如果某些字符经常出现在一起,我们会认为这些字符可以成词,这并不意味着我们可以用字符组合出现的频数作为判断标准。
如上图所示,在1900万字的新闻中,如果单纯地以字符的共现为标准判断,由于的,在
这些常用字的存在,会产生大量噪声词。这些噪声词(如"你的","亚马逊的"
)虽然为文本中十分常见,我们并不会把它们判定为合理的中文词汇。因为"的","在"
的出现太过频繁,就像日常出门营业的social王,它可能和任何人出现在同一场合。只有两个社恐手拉手一起出门,我们才能做出二人是真爱的判断。可以对字符有类似的内部凝聚程度的定义。如果字符中的"社恐"同时出现,我们可以认为这样的字符组合就是一个合理的词汇。比如
“演唱者”
出现117次,“的演唱”
出现275次,从出现频数来看,“的演唱”
更像是一个词。但是如果把字符的共现看作随机事件的话,“演唱”
和“者”
在文本中分别出现2502,32272次,二者恰好拼在一起的概率
p ( 演唱 ) p ( 者 ) = 2502 1900 ∗ 1 0 4 ∗ 32272 1900 ∗ 1 0 4 = 2.24 ∗ 1 0 − 7 p(演唱)p(者)=\frac{2502}{1900*10^4}*\frac{32272}{1900*10^4}=2.24*10^{-7} p(演唱)p(者)=1900∗1042502∗1900∗10432272=2.24∗10−7演唱者”的实际出现概率为 p ( 演唱者 ) = 117 1900 ∗ 1 0 4 = 6.16 ∗ 1 0 − 6 p(演唱者)=\frac{117}{1900*10^4}=6.16*10^{-6} p(演唱者)=1900∗104117=6.16∗10−6,是它的27倍
同理 p ( p( p( 的 ) p ( ) p( )p( 演唱 ) = 3.07 ∗ 1 0 − 6 )=3.07 * 10^{-6} )=3.07∗10−6,“的演唱”实际出现概率为它的4.7倍,此我们有理由相信,“的演唱”这一词语的出现,是常用字“的”日常出门营业,而与一个动词意外拼在一起的结果,“演唱者”才是组成成分之间凝聚程度高的合理中文词汇为了量化字符组合的凝聚程度,我们用字符组合出现的概率除以每一个组成成分出现的概率。这听起来很像互信息(mutual information)的形式:
M I = ∑ x ∈ X ∑ y ∈ Y p ( x , y ) log 2 p ( x , y ) p ( x ) p ( y ) M I=\sum_{x \in X} \sum_{y \in Y} p(x, y) \log _{2} \frac{p(x, y)}{p(x) p(y)} MI=x∈X∑y∈Y∑p(x,y)log2p(x)p(y)p(x,y)上面提到的“演唱者”,内部凝聚程度可以表示为: p ( 演唱者 ) log 2 p ( 演唱者 ) p ( 演 ) p ( 唱 ) p ( 者 ) p(演唱者) \log _{2} \frac{p(演唱者 )}{p(\text { 演 }) p(\text { 唱 }) p(\text { 者 })} p(演唱者)log2p( 演 )p( 唱 )p( 者 )p(演唱者)
-
综合考虑
我们要判断一个字符组合是一个“词”,对于左右邻字丰富程度和内部凝聚程度的考虑,二者缺一不可。如果只看内部凝聚程度的话,无法将“人工智”,“工智能”这样的词删去;而只保留左右邻字丰富的词,会出现“公司的”,“在北京”这样的词汇。
并且,左右邻字丰富程度,会受到字符组合出现频数的影响。例如显然无意义的词“己的”,因为在文本中出现1万次以上,RE(右词熵)高达8.7。因此我们在度量一个字符组合的左右邻字丰富程度时,也要注意到LE(左词熵)和RE的差距。比如取二者的最小值,或者将LE与RE差的绝对值(|LE-RE|)纳入考虑范围
2. 算法细节
(1)生成候选词
生成候选词的方法有两种:将文本切词后的结果拼接为候选词,和直接将文本按字符分割后拼接为候选词。这里我们选择了第二种方法。
我们把文本按标点切分成句,然后提取每句话的2元组,3元组,…,k元组作为候选词(一般k<=5就够用了)。比如“专注于自然语言处理技术”这句话产生的2元候选词有:[“专注”、“注于”、“于自”、“自然”、“然语”、“语言”、“言处”、“处理”、“理技”、“技术”]
。
第一种方法的新词抽取结果,很大程度上依赖于分词的效果。有的分词工具将“楚乔传播出之前”
切成了“楚乔/传播/出/之/前”
,这样一来,就算之后的工作做得再好,想要抽出“楚乔传
”一词也是无力回天
(2) 候选词得分计算
我们为每个候选词计算一个得分,表示它成词的可能性
为了度量左右邻字丰富程度,我们综合考虑候选词左右信息熵(LE,RE)的大小、LE与RE差的绝对值(|LE-RE|),构造统计量如下
L
(
W
)
=
log
L
E
⋅
e
R
E
+
R
E
⋅
e
L
E
∣
L
E
−
R
E
∣
L(W)=\log \frac{L E \cdot e^{R E}+R E \cdot e^{L E}}{|L E-R E|}
L(W)=log∣LE−RE∣LE⋅eRE+RE⋅eLE
由于点间互信息的值会受到候选词长度的影响(候选词越长,互信息取值偏大),我们使用平均互信息(AMI)作为词语内聚程度的度量。AMI的公式如下:
A
M
I
=
1
n
log
p
(
W
)
p
(
c
1
)
⋯
p
(
c
n
)
A M I=\frac{1}{n} \log \frac{p(W)}{p\left(c_{1}\right) \cdots p\left(c_{n}\right)}
AMI=n1logp(c1)⋯p(cn)p(W)
最后候选词得分
score
=
A
M
I
+
L
(
W
)
\text { score }=A M I+L(W)
score =AMI+L(W)