推荐:http://spaces.ac.cn/archives/3491/

http://www.matrix67.com/blog/archives/5044

http://www.hankcs.com/nlp/new-word-discovery.html

其实很多人都已经知道这个算法了,是由Matrix67牛人提出来的,实现的方式也有很多人解决了。我只是写个最简单的介绍和实现方式给自己做做笔记罢。该算法最主要是基于互信息和左右熵的计算规则,而这两个概念都是出自信息论的范畴,其一者称内部凝和度,其二者称外部自由度或者边界自由度。

这里有三个阈值

第一是最小互信息,因为互信息越大说明相关度越大,将n-gram分好的词计算互信息,如果低于阈值,则说明不能成词。

第二是最小熵值,因为熵也是越大说明周边词越丰富,计算其左熵和右熵的最小值,如果最小值低于阈值,则说明不能成词。

第三个是最少出现次数,为什么有这个数呢?假设前后两个词是完全相关的,出现400次,总共8000词,那么互信息=log((400/8000)/(400/8000)*(400/8000)),约掉之后剩下log(8000/400)。但是一个词如果从头到尾出现了一次,但是并不是单词,则互信息为=log((1/8000)/(1/8000)*(1/8000))=log(8000/1),那么它的互信息会更大。取最少出现次数也会出现问题,就是一些低频率的词不能发现。

我拿了三体去做了新词发现,结果如下:

['丰富', '记录','喜欢','魔鬼','宫殿','告诉我','地摇摇头','专业','苏醒后','油膜','启动了','帮助','悬崖','毕竟是','灵魂','状态下','消失在','曹彬','副舰长','泰勒','概念','汉语','借助','听证会','在周围','三体组织','反物质','怀疑','置身于','清楚地','妈妈','乔纳森','怎么可能','即使在','星环集团','抬头看','咨询','草坪','银河系','美国代表'...]

这里发现‘地摇摇头’、‘置身于’,'毕竟是','状态下'...等变成新词发现出来,类似这些固定搭配的动词性短语确实很难拆开,而且已经识别为二元新词之后,包含该词的二元新词和三元新词是否正确也无法判断,还需要加入一些新的规则继续识别。

代码如下:

from nltk.probability import FreqDist
f=open(r"C:\Users\user\Documents\Downloads\santi.txt")
text=f.read()stop_word=['【','】',')','(','、',',','“','”','。','\n','《','》',' ','-','!','?','.','\'','[',']',':','/','.','"','\u3000','’','.',',','…','?']
for i in stop_word:text=text.replace(i,"")min_entropy=0.8
min_p=7
max_gram=4
count_appear=20def gram(text,max_gram):t1=[i for i in text]loop=len(t1)+1-max_gramt=[]for i in range(loop):t.append(text[i:i+max_gram])if max_gram==1:return t1else:return t
import math
def pro(word):len_word=len(word)total_count=len(word_all[len_word])pro=freq_all[len_word][word]/total_countreturn pro
def entropy(alist):f=FreqDist(alist)ent=(-1)*sum([i/len(alist)*math.log(i/len(alist)) for i in f.values()])return entfreq_all=[0]
word_all=[0]
for i in range(1,max_gram+1):t=gram(text,i)freq=FreqDist(t)word_all.append(t)freq_all.append(freq)#筛选一部分符合互信息的单词
final_word=[]
for i in range(2,max_gram+1):for j in word_all[i]:if freq_all[i][j]<count_appear:passelse:p=min([pro(j[:i])*pro(j[i:]) for i in range(1,len(j))])if math.log(pro(j)/p)>min_p:final_word.append(j)
final_word=list(set(final_word))
#筛选左右熵
import re
final_word2=[]
for i in final_word:lr=re.findall('(.)%s(.)'%i,text)left_entropy=entropy([w[0] for w in lr])right_entropy=entropy([w[1] for w in lr])if min([right_entropy,left_entropy])>min_entropy:final_word2.append(i)

去掉常常出现地一些介词和助词,结果如下:

二字词:'曹彬','捕获','恢复','嘿嘿','欺骗','田园','网络','爆炸','杰森','沙漠','胶卷','灵魂','瞄准','宽敞','泡沫','褚岩',...

三字词:国政府','治安军','普通人','绿眼镜','草坪上','常伟思','审问者','大规模','听证会','肥皂泡','猜疑链','PIA','反射镜','追随者','机械臂','大低谷',...

四字词:'球状闪电', '无影无踪', '战略计划', '突然出现', '长长短短', '罗辑博士', '危机纪元', '亚洲舰队', '空灵画师', '曲率引擎', '东方延绪', '同步轨道', '三体问题', '群星计划'...

互信息和左右熵的新词发现(笔记)相关推荐

  1. 信息论复习笔记(1):信息熵、条件熵,联合熵,互信息、交叉熵,相对熵

    文章目录 1.1 信息和信息的测量 1.1.1 什么是信息 1.1.1 信息怎么表示 1.2 信息熵 1.3 条件熵和联合熵 The Chain Rule (Relationship between ...

  2. 新词发现:中文新词识别技术简介

    一.前言 新词识别,也可称为未登录词识别,严格来说,新词是指随时代发展而新出现或旧词新用的词,如:给力.山寨等:而未登录词是在词典中未存在的词,但实际使用中,两者并没有严格的区分,下文均以新词指代. ...

  3. python实现词语填空_python简单实现新词发现

    基于新信息熵的新词发现原理<互联网时代的社会语言学:基于SNS的文本数据挖掘>这篇文章已经讲得非常清楚了,在这里主要是通过代码复现这篇文章. 实现的模块主要分为四个部分:从文章中提取所有可 ...

  4. 无监督构建词库:更快更好的新词发现算法

    作者丨苏剑林 单位丨追一科技 研究方向丨NLP,神经网络 个人主页丨kexue.fm 新词发现是 NLP 的基础任务之一,主要是希望通过无监督发掘一些语言特征(主要是统计特征),来判断一批语料中哪些字 ...

  5. 文献记录(part66)--一种基于交叉熵的社区发现算法

    学习笔记,仅供参考,有错必纠 关键词:复杂网络:社区发现:交叉熵: 一种基于交叉熵的社区发现算法 摘要 作为复杂网络中的一个极其重要的研究领域,社区结构的搜寻和发现研究具有重要的应用价值 . 该文将信 ...

  6. Python自然语言处理相,新词发现,主题模型,隐马尔模型词性标注,Word2Vec,情感分析...

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 代码环境:python --version 3.5.2 tensorflow keras 代码 ...

  7. 【Pytorch神经网络理论篇】 21 信息熵与互信息:联合熵+条件熵+交叉熵+相对熵/KL散度/信息散度+JS散度

    1 信息熵 熵 (Entropy),信息熵:常被用来作为一个系统的信息含量的量化指标,从而可以进一步用来作为系统方程优化的目标或者参数选择的判据. 1.1 信息熵的性质 单调性,发生概率越高的事件,其 ...

  8. python | 高效统计语言模型kenlm:新词发现、分词、智能纠错

    之前看到苏神[重新写了之前的新词发现算法:更快更好的新词发现]中提到了kenlm,之前也自己玩过,没在意,现在遇到一些大规模的文本问题,模块确实好用,前几天还遇到几个差点"弃疗"的 ...

  9. 切切切词!新词发现算法TopWORDS的原理及实现|实在智能AI+RPA学院

    切切切词!新词发现算法TopWORDS的原理及实现|实在智能AI+RPA学院 一.介绍 TopWORDS [参考文献1]是发表在PNAS的一种新词发现算法,它在没有任何先验知识的条件下,快速地从大规模 ...

最新文章

  1. 程序员:提高编程效率的技巧
  2. cisco设备运维常用命令 总结-1
  3. python常见错误-python常见的错误提示有什么
  4. 038_Steps步骤条
  5. 2018 GDCPC 省赛总结
  6. Android动态布局
  7. native react 更新机制_react-native热更新全方位讲解
  8. 建议重写equals方法时也一并重写hashCode方法
  9. Python天气预报查询
  10. 热烈祝贺龙芯Loongarch OpenJDK8开源,已编译完成
  11. c语言程序设计支持win10,win tc 64位下载-wintc C语言编译器64位下载 1.9.1 win10兼容版 - 河东下载站...
  12. win7升级Internet Explorer 11 先决条件更新
  13. IDM chrome插件找不到
  14. js获取屏幕、浏览器、页面的高度宽度
  15. 微波雷达感应模块,智能洗衣机雷达技术方案,自动感应开门应用
  16. 每日学点python之六(列表与元组)
  17. 永磁同步直线电机驱动控制原理与matlab建模仿真
  18. plotwidget横坐标日期_求助x轴为日期时间的图形绘制
  19. 如何用Matlab做一个3D头像
  20. iOS TCP UDP通信

热门文章

  1. H264马赛克、延时的优化
  2. html 星空效果,HTML5JSstar_动态星空效果
  3. 低效能程序员的行为与思维
  4. ALG 求单峰的位置
  5. SQL 提取数字并转换为数字格式
  6. 新生儿取名:撩人于无形的女宝宝名字,任你挑选
  7. 桌面快捷图标变成白色处理方案
  8. 理想电压源VS实际电压源、理想电流源VS实际电流源
  9. EasyExcel报错空指针异常
  10. NVIDIA CUDA 高度并行处理器编程(一):CUDA简介