中文文章无字典新词发现

该文章主要基于《基于改进互信息和邻接熵的微博新词发现方法》[1],以及博客文章《互联网时代的社会语言学:基于SNS的文本数据挖掘》[2]

我参考其两篇文章并用Nodejs实现了其算法,当然,我提供了我实现的代码[3],该代码包含了高于ES5的语法,所以如果你需要运行其代码可能需要使用到Babel转换,该代码提供了基于ES6的import语法导出的接口,你可以直接使用。

该文章主要是针对于文章进行算法运算后,可以做到不基于任何词典进行发现中文新词,中文分词相对于英文分词来说是非常困难的,首先英文分词有空格来分隔每个单词,并完全能够准确切割,但是中文分词来说是非常困难的,比如说"所以如果你需要运行其代码可能需要使用"这段话,让计算机很难区分到底是两个字为一个词还是三个字为一个词。

所以基于上述的问题,国内有非常多的人在着手解决,有很多则是使用机器学习进行训练,采用大量的单词数据进行训练,而还有一部分则是自然语言处理(NLP),而本文章以及参考的文章都是属于NLP范围。

目录

文章主要的算法围绕着下面的三个点进行阐述,而下面的三个点也对应了相应的顺序,并在之后对三个点作出详细的解释以及代码分解后的演示:

  1. N-Gram算法
  2. 互信息
  3. 邻接熵

N-Gram算法

N-Gram算法的基本思想在于将待处理的语料,按照预定大小N的滑动窗口进行切分,按照窗口进行切分后的语料称为一个gram,并统计所有gram的词频率,比如下面的文本,因为词的基本单位为2个字符,所以我将起始值设置为2,最大的宽度为3,即切分文本最长为3个字符组成字符串,通过N-Gram算法,可以很容易的将一段文章切分为词:

原始文本:国内有非常
窗口大小为2的切分结果:国内、内有、有非、非常
窗口大小为3的切分结构:国内有、内有非、有非常

统计词频的意义在于一篇文章的主题在其文章中会多次出现,所以通过控制其词频率,即可以筛选出一批不合格的词,还可以为后期的筛选输入优质的备选词。比如该链接的文章主题为"防敏感信息泄露",然后该"信息泄露"词在整个文章中出现了14次,而我挑选了一个非主题词"场景"只在整篇文章中出现了两次,这个样的单词很明显是属于不需要的词,因为该词与当前文章的关联不高,即使发现出来新词也毫无意义。

互信息

互信息:互信息的作用在于判断一个词在预料中的内部凝固程度,即这个词是偶然拼在一起的还是确实是一个完整的词,而计算互信息实际上就是计算词的整体概率除以词的多种组合的概率,比如北京京后这两个词,北京明显对比京后更像是一个词,而京后这个词更像是偶然拼接到一起的。

比如直接借鉴参考文中的数据,如果“电影”和“院”真的是各自独立地在文本中随机出现,它俩正好拼到一起的概率会有多小。在整个 2400 万字的数据中,“电影”一共出现了 2774 次,出现的概率约为 0.000113 。“院”字则出现了 4797 次,出现的概率约为 0.0001969 。如果两者之间真的毫无关系,它们恰好拼在了一起的概率就应该是 0.000113 × 0.0001969 ,约为 2.223 × 10-8 次方。但事实上,“电影院”在语料中一共出现了 175 次,出现概率约为 7.183 × 10-6 次方,是预测值的 300 多倍。类似地,统计可得“的”字的出现概率约为 0.0166 ,因而“的”和“电影”随机组合到了一起的理论概率值为 0.0166 × 0.000113 ,约为 1.875 × 10-6 ,这与“的电影”出现的真实概率很接近——真实概率约为 1.6 × 10-5 次方,是预测值的 8.5 倍。计算结果表明,“电影院”更可能是一个有意义的搭配,而“的电影”则更像是“的”和“电影”这两个成分偶然拼到一起的。

而通过上面的方式,然后结合其N-Gram分词后的结果,然后计算其互信息,就能够得到一批内部凝固程度高的词,其公式为:

邻接熵

邻接熵:邻接熵的作用在于判断一个词是否是完整词,汉字很难去区分到底是否为完整的词,而邻接熵可以很好的解决这个问题,而邻接熵是基于信息熵来判断,信息熵能够反映一个事情的结果能带来多大的信息量,如果一个已发生的结果概率为p,那么信息熵就为-log(p),而p越小则信息量越大,比如说有一段下面的预料:

原始:说四川省今天天四川省今天听四川省后天

整理后:
说四川省今
天四川省明
听四川省后

这个时候判断四川是否是一个完整的词,可以先列出两边的字并组成一个列表,大概结果如下:

左:[说,天,听]
右:[省,省,省]

而从上面来看,明显可以看出其左边的列表信息量比右边的列表信息量大很多,因为左边的列表有三个不一样的字,而右边则三个一样,所以反向来思考,则可以理解为该词四川左边属于一个完整词开始,而右边则很有可能存在还存在一个字会将四川这个词构造得更完整。而从上面的文本中确实也是这样,因为在这篇语料中四川省更像一个完整的词。

而通过上面的方式,然后结合其互信息筛选后的结果,然后再计算其邻接熵,就能够得到一批整体度很高的一批词,其公式为:

左邻接熵:

右邻接熵:

阀值

从上面三个步骤中都可以设置其阈值,通过N-Gram中的词频来进行设置阈值可以达到让一些偶然出现在文章中的词去除掉,因为这个词在文章中意义不大,即使我们筛选到,而通过互信息则可以筛选出一批内部凝固程度很高的词,最后在通过其设置邻接熵的阈值,可以筛选出一批完整度高的词。

对于邻接熵,在我代码实现的时候,我做了如果不满足我的邻接熵阈值,那么则向相应的方向进行扩展1个字,共扩展4个字,如果还是不满足则丢弃,这样的好处是在于尽量可能的去挖掘去完整的词。

最后附上参考文中的算法流程图,结合上面的信息能够很明白的看懂这张图:

mbn-gram

Footnotes
  1. 基于改进互信息和邻接熵的微博新词发现方法》于2016年发表于计算机应用,作者为:夭荣朋, 许国艳, 宋健. 

  2. 互联网时代的社会语言学:基于SNS的文本数据挖掘》该文章为《基于改进互信息和邻接熵的微博新词发现方法》初版,作者为:Matrix67 

  3. WordsGuess》是基于互信息和邻接熵实现的新词发现工具 

发表评论

电子邮件地址不会被公开。 必填项已用*标注