新词发现&判断一个词是否为词

什么样的词才能算作词

1. 算法简介

  • 词语的左右邻字要足够丰富
    如果一个字符组合可以成词,它应当出现在丰富的语境中,也就是说,拥有丰富的左右邻字。举个例子,同样是在文本中出现6000+次的副总裁人工智,字符组合的左邻词都在6左右,但副总裁的右邻字包括 { 张,王,说, ...... } 等147个词,而人工智的右邻字只有 { 能,障 }两种,显然人工智不能称作一个词
    新词发现&判断一个词是否为词_第1张图片

    信息熵是对信息量多少的度量,信息熵越高,表示信息量越丰富、不确定性越大。因此字符组合左右邻字的丰富程度,可以用信息熵(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)=wnWNeighbor P(wnw)log2P(wnw)


  • 词语的内部凝聚程度要足够高

    如果某些字符经常出现在一起,我们会认为这些字符可以成词,这并不意味着我们可以用字符组合出现的频数作为判断标准。
    新词发现&判断一个词是否为词_第2张图片
    如上图所示,在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()=19001042502190010432272=2.24107

    演唱者”的实际出现概率为 p ( 演唱者 ) = 117 1900 ∗ 1 0 4 = 6.16 ∗ 1 0 − 6 p(演唱者)=\frac{117}{1900*10^4}=6.16*10^{-6} p(演唱者)=1900104117=6.16106,是它的27倍
    同理 p ( p( p( ) p ( ) p( )p( 演唱 ) = 3.07 ∗ 1 0 − 6 )=3.07 * 10^{-6} )=3.07106,“的演唱”实际出现概率为它的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=xXyYp(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)=logLERELEeRE+REeLE

由于点间互信息的值会受到候选词长度的影响(候选词越长,互信息取值偏大),我们使用平均互信息(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)

参考

"新词发现"算法探讨与优化-SmoothNLP
smoothNLP-githup

你可能感兴趣的:(自然语言处理,算法,机器学习,人工智能)