python3实现互信息和左右熵的新词发现
python3 实现的中文分词新词发现
关于中文新词发现有多种方法,经过比较之后发现利用互信息和左右熵来做新词发现效果最好,先上实验效果
初始语句:
蔡英文在昨天应民进党当局的邀请,准备和陈时中一道前往世界卫生大会,和谈有关九二共识问题
单纯使用jieba分词的结果
蔡/ 英文/ 在/ 昨天/ 应/ 民进党/ 当局/ 邀请/ 准备/ 和/ 陈时/ 中/ 一道/ 前往/ 世界卫生/ 大会/ 和谈/ 有关/ 九二/ 共识/ 问题/
使用了新词发现后的结果
蔡英文/ 在/ 昨天/ 应/ 民进党当局/ 邀请/ 准备/ 和/ 陈时中/ 一道/ 前往/ 世界卫生大会/ 和谈/ 有关/ 九二共识/ 问题/
测试样本为
台湾“中时电子报”26日报道称,蔡英文今日一早会见“世卫行动团”,她称,台湾虽然无法参加WHA(世界卫生大会),但“还是要有贡献”。于是,她表示要捐100万美元给WHO对抗埃博拉病毒 对于台湾为何不能,蔡英文又一次惯性“甩锅”,宣称“中国对台湾的外交打压已无所不用其极”。
......
原理介绍
方法主要依托于互信息和左右熵,代码实现的数据结构是trie树,下面将分为三点来介绍
互信息
我们使用的是点间互信息,其定义如下:
![](https://img.haomeiwen.com/i12379570/7c7355505813d673.png)
其中$p(x,y)$是两个词一起出现的概率,p(x)是单个词出现的概率。具体例子:4G
, 上网卡
,4G上网卡
;如果4G
的词频是2,上网卡
的词频是10,4G上网卡
的词频是1,那么记单单词的总数有N个,双单词的总数有M个,则有下面的公式
![](https://img.haomeiwen.com/i12379570/cffaffa65370395c.png)
- 点间互信息可以很好的反映两个词的凝聚力
- 以 2 求 log 的原因来自信息论,可以简单理解为,取 log 之后就将一个概率转换为了信息量,以 2 为底时可以简单理解为用多少个 bits 可以表示这个变量。
左右熵
我们这里使用左右熵来衡量主要是想表示预选词的自由程度(4G上网卡
为一个预选词),左右熵越大,表示这个词的左边右边的词换的越多,那么它就很有可能是一个单独的词。
我们这里的左右熵定义为(以左熵为例):
![](https://img.haomeiwen.com/i12379570/8fde5681d363a868.png)
这里我们还是举一个具体的例子来理解它
假设4G上网卡
左右有这么几种搭配
[买4G上网卡
, 有4G上网卡
,有4G上网卡
, 丢4G上网卡
]
那么4G上网卡
的左熵为
![](https://img.haomeiwen.com/i12379570/f211ccd821872e20.png)
这里A = [买
, 有
, 丢
]
字典树
原来讲明白了剩下的就是具体实现了,最适合存储和计算词频的数据结构就是字典树,这里给一个讲解的很清楚的链接
具体代码
代码已开源,需要的点击这个Github