python3实现互信息和左右熵的新词发现

python3 实现的中文分词新词发现

关于中文新词发现有多种方法,经过比较之后发现利用互信息和左右熵来做新词发现效果最好,先上实验效果
初始语句:

蔡英文在昨天应民进党当局的邀请,准备和陈时中一道前往世界卫生大会,和谈有关九二共识问题

单纯使用jieba分词的结果

蔡/ 英文/ 在/ 昨天/ 应/ 民进党/ 当局/ 邀请/ 准备/ 和/ 陈时/ 中/ 一道/ 前往/ 世界卫生/ 大会/ 和谈/ 有关/ 九二/ 共识/ 问题/

使用了新词发现后的结果

蔡英文/ 在/ 昨天/ 应/ 民进党当局/ 邀请/ 准备/ 和/ 陈时中/ 一道/ 前往/ 世界卫生大会/ 和谈/ 有关/ 九二共识/ 问题/

测试样本为

台湾“中时电子报”26日报道称,蔡英文今日一早会见“世卫行动团”,她称,台湾虽然无法参加WHA(世界卫生大会),但“还是要有贡献”。于是,她表示要捐100万美元给WHO对抗埃博拉病毒 对于台湾为何不能,蔡英文又一次惯性“甩锅”,宣称“中国对台湾的外交打压已无所不用其极”。
......


原理介绍

方法主要依托于互信息和左右熵,代码实现的数据结构是trie树,下面将分为三点来介绍

互信息

我们使用的是点间互信息,其定义如下:


互信息

其中$p(x,y)$是两个词一起出现的概率,p(x)是单个词出现的概率。具体例子:4G上网卡4G上网卡;如果4G的词频是2,上网卡的词频是10,4G上网卡的词频是1,那么记单单词的总数有N个,双单词的总数有M个,则有下面的公式

具体例子

  • 点间互信息可以很好的反映两个词的凝聚力
  • 以 2 求 log 的原因来自信息论,可以简单理解为,取 log 之后就将一个概率转换为了信息量,以 2 为底时可以简单理解为用多少个 bits 可以表示这个变量。

左右熵

我们这里使用左右熵来衡量主要是想表示预选词的自由程度(4G上网卡为一个预选词),左右熵越大,表示这个词的左边右边的词换的越多,那么它就很有可能是一个单独的词。
我们这里的左右熵定义为(以左熵为例):

左熵

这里我们还是举一个具体的例子来理解它
假设4G上网卡左右有这么几种搭配
[买4G上网卡, 有4G上网卡有4G上网卡丢4G上网卡]
那么4G上网卡的左熵为

具体例子

这里A = [, , ]

字典树

原来讲明白了剩下的就是具体实现了,最适合存储和计算词频的数据结构就是字典树,这里给一个讲解的很清楚的链接

具体代码

代码已开源,需要的点击这个Github

你可能感兴趣的:(python3实现互信息和左右熵的新词发现)