资讯专栏INFORMATION COLUMN

用python实现新词发现程序——基于凝固度和自由度

worldligang / 2790人阅读

摘要:一个好的新词发现程序对做自然预言处理来说是非常重要的。计算字组合的自由度分别计算它的左邻居信息熵和右邻居信息熵,取其中较小的为该组合的自由度。

互联网时代,信息产生的数量和传递的速度非常快,语言文字也不断变化更新,新词层出不穷。一个好的新词发现程序对做NLP(自然预言处理)来说是非常重要的。

N-Gram加词频

最原始的新词算法莫过于n-gram加词频了。简单来说就是,从大量语料中抽取连续的字的组合片段,这些字组合片段最多包含n个字,同时统计每个字组合的频率,按照词频并设置一个阈值来判断一个字组合片段是否为词汇。

该方法简单处理速度快,它的缺点也很明显,就是会把一些不是词汇但出现频率很高的字组合也当成词了。

凝固度和自由度

这个算法在文章《互联网时代的社会语言学:基于SNS的文本数据挖掘》 里有详细的阐述。

凝固度就是一个字组合片段里面字与字之间的紧密程度。比如“琉璃”、“榴莲”这样的词的凝固度就非常高,而“华为”、“组合”这样的词的凝固度就比较低。

自由度就是一个字组合片段能独立自由运用的程度。比如“巧克力”里面的“巧克”的凝固度就很高,和“巧克力”一样高,但是它自由运用的程度几乎为零,所以“巧克”不能多带带成词。

Python实现

根据以上阐述,算法实现的步骤如下:

n-gram统计字组合的频率

如果文本量很小,可以直接用Python的dict来统计n-gram及其频率。一段文本n-gram出来的字组合的大小大约是原始文本的(1+n)*n/2倍,字组合的数量也非常惊人。比如,“中华人民共和国”的首字n-gram是(n=5):

中
中华
中华人
中华人民
中华人民共

n-gram统计字组合频率的同时还要统计字组合的左右邻居,这个用来计算自由度。

如果文本量再大一些,Python的dict经常会碰到最好使用trie tree这样的数据结构。双数组Trie Tree有很多非常好的开源实现,比如,cedar、darts等等。Trie Tree使用的好处是,它天然包含了字组合的右邻居信息,因为这个数据结构一般是前缀树。要统计左邻居信息时,只需要把字组合倒序放入另外一个Trie Tree即可。
使用cedar Trie Tree的时候,5-gram统计30M的文本大约使用6GB左右的内存。

如果文本量更大,这就要借助硬盘了,可以使用leveldb这样的key-value数据库来实现。实验下来,trie tree统计30M的文本用几十秒,而同样的用leveldb统计却要6个多小时!!!应该还有比leveldb更合适的数据库来做这件事情,有时间再说。
当然,为了发现新词,几十MB的文本文本足够了。

计算字组合的凝固度;

有了上述的统计结果,计算每个字组合的凝固度就比较简单了。
首先,把字组合切分成不同的组合对,比如’abcd’可以拆成(‘a’, ‘bcd’), (‘ab’, ‘cd’), (‘abc’, ‘d’),
然后,计算每个组合对的凝固度:D(s1, s2) = P(s1s2) / (P(s1) * P(s2))
最后,取这些组合对凝固度中最小的那个为整个字组合的凝固度。

计算字组合的自由度;

分别计算它的左邻居信息熵和右邻居信息熵,取其中较小的为该组合的自由度。

阈值的选择

整个过程涉及到三个阈值的选择:

组合的词频:频率很低的组合成词的可能性很小
组合的凝固度:凝固度越大成词的可能性越大
组合的自由度:自由度越大成词的可能性越大
经验值:30M文本,词频>200, 凝固度>10**(n-1), 自由度>1.5

小窍门:词频>30, 凝固度>20**(n-1)也能发现很多低频的词汇。

文章来源于:猿人学网站的python教程。

版权申明:若没有特殊说明,文章皆是猿人学原创,没有猿人学授权,请勿以任何形式转载。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43727.html

相关文章

  • 分词,难在哪里?科普+解决方案!

    摘要:分词的算法中文分词有难度,不过也有成熟的解决方案。例如通过人民日报训练的分词系统,在网络玄幻小说上,分词的效果就不会好。三的优点是开源的,号称是中,最好的中文分词组件。 showImg(https://segmentfault.com/img/remote/1460000016359704?w=1350&h=900); 题图:by Lucas Davies 一、前言 分词,我想是大多数...

    Steven 评论0 收藏0
  • LSTM分类相关

    摘要:而检验模型用到的原材料,包括薛云老师提供的蒙牛牛奶的评论,以及从网络购买的某款手机的评论数据见附件。不同行业某些词语的词频会有比较大的差别,而这些词有可能是情感分类的关键词之一。这是由于文本情感分类的本质复杂性所致的。 文本情感分类--传统模型(转) showImg(https://segmentfault.com/img/bVKjWF?w=2192&h=534); 传统的基于情感词典...

    MartinHan 评论0 收藏0
  • Python的C/C++扩展——SWIG封装C++为Python模块

    摘要:所以,最大的好处就是将脚本语言的开发效率和的运行效率有机的结合起来。前面的文章提到一个实现的双数组的实现,它在中文分词新词发现等算法中的应用。本文以的封装实现来说明的使用。编译生成动态库编译生成的使用的,可以参考的编写。 如果觉得文章对你有帮助,你也可以访问老猿的个人博客https://www.yuanrenxue.com/ Python调用C/C++代码的利器除了boost_pyt...

    邹强 评论0 收藏0
  • 【好东西传送门日报】2017-12-27 星期三

    摘要:机器学习云端可视化机器学习深度学习量化平台自动由切换为而实现更好的泛化性能联合提出最新百万规模视频动作理解数据集马尔可夫链蒙特卡洛方法入门指南深度学习框架大事记新技术与新应用无人机助力大气环境立体监测忆阻器制成神经网络更高效北京工业大学让 【机器学习】 1) 云端可视化机器学习/深度学习量化平台 http://t.cn/RHb9PxI 2) SWATS:自动由Adam切换为SGD而实现...

    tabalt 评论0 收藏0

发表评论

0条评论

worldligang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<