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

N-Gram加词频

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

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

凝固度和自由度

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

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

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

Python实现

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

1. 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的文本文本足够了。

2. 计算字组合的凝固度;

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

3. 计算字组合的自由度;

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

4. 阈值的选择

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

  • 组合的词频:频率很低的组合成词的可能性很小
  • 组合的凝固度:凝固度越大成词的可能性越大
  • 组合的自由度:自由度越大成词的可能性越大

经验值:30M文本,词频>200, 凝固度>10**(n-1), 自由度>1.5

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

文章首发于我的个人博客:猿人学

用python实现新词发现程序——基于凝固度和自由度的更多相关文章

  1. 使用python对py文件程序代码复用度检查

    #!/user/bin/env python # @Time :2018/6/5 14:58 # @Author :PGIDYSQ #@File :PyCheck.py from os.path im ...

  2. 【新词发现】基于SNS的文本数据挖掘、短语挖掘

    互联网时代的社会语言学:基于SNS的文本数据挖掘 python实现 https://github.com/jtyoui/Jtyoui/tree/master/jtyoui/word  这是一个无监督训 ...

  3. 基于大规模语料的新词发现算法【转自matix67】

    最近需要对商品中的特有的词识别,因此需新词发现算法,matrix的这篇算法很好. 对中文资料进行自然语言处理时,我们会遇到很多其他语言不会有的困难,例如分词——汉语的词与词之间没有空格,那计算机怎么才 ...

  4. Pytest权威教程-更改标准(Python)测试发现

    目录 更改标准(Python)测试发现 在测试收集过程中忽略路径 测试期间收集的测试取消 保留从命令行指定的重复路径 更改目录递归 更改命名约定 将cmdline参数解释为Python包 找出收集的东 ...

  5. [python]用profile协助程序性能优化

    转自:http://blog.csdn.net/gzlaiyonghao/article/details/1483728 本文最初发表于恋花蝶的博客http://blog.csdn.net/lanph ...

  6. 小程序基于疼讯qcloud的nodejs开发服务器部署

        腾讯,疼讯,很疼. 请慎重看腾讯给出的文档,最好做一个笔记. 我只能说我能力有限,在腾讯云小程序的文档中跳了n天. 最后还是觉得记录下来,以防止我的cpu过载给烧了. 此文档是对<小程序 ...

  7. 【转】Python用数据说明程序员需要掌握的技能

    [转]Python用数据说明程序员需要掌握的技能 https://blog.csdn.net/HuangZhang_123/article/details/80497951 当下是一个大数据的时代,各 ...

  8. OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  9. [转]python实现RESTful服务(基于flask)

    python实现RESTful服务(基于flask) 原文: https://www.jianshu.com/p/6ac1cab17929  前言 上一篇文章讲到如何用java实现RESTful服务, ...

随机推荐

  1. sehll变量比较

    1.比较符号解释 $# 表示提供到shell脚本或者函数的参数总数: $1 表示第一个参数. -ne 表示 不等于 $?是shell变量,表示"最后一次执行命令"的退出状态.0为成 ...

  2. Tinymce在ASP.NET中的使用方法

    现在做网页,用FCKEditor用得比较多,它的实现原理是在要加入FCKEditor的地方加入一个iframe,并将其src指向FCKeditor/editor/fckeditor.html?Inst ...

  3. Yarn使用笔记

    1.安装需要下载安装包(这里只介绍windows系统的安装) 安装成功,会如图提示! 版本号:Yarn安装包-yarn-0.24.6 安装包下载地址:链接:http://pan.baidu.com/s ...

  4. Spring Aop(十五)——Aop原理之Advised接口

    转发地址:https://www.iteye.com/blog/elim-2398726 Spring Aop原理之Advised接口 通过之前我们介绍的ProxyFactory我们知道,Spring ...

  5. iOS-tabBar切换不同控制器封装(自定义导航+自定义uiviewcontroler+系统自带tabbar+自定义tabbarController)

    首先,一个app的搭建环境非常重要.既要实现基本功能,又要考虑后期优化的性能. 现在很多应用不仅仅是系统自带的控制器,由于需求复杂,基本上需要自定义多控制器来管理. 新建一个BasicNavigati ...

  6. Flutter布局--appbar导航栏和状态栏

    MaterialApp 先看下上图的具体用法:1. title:标题2. actions:表示右侧的按钮的动作3. leading:表示左侧的按钮的动作4. flexibleSpace:5. back ...

  7. Flutter 踩坑之build函数返回了null

    今天遇到一个bug,内容都正常显示没问题,但是控制台里报错,如图: 翻译了下,说是函数不能返回空值,搜索了下,网上相同问题的是少写了个return,我检查了下也没发现少return的,后来突然发现if ...

  8. Windows Server 2012 R2蓝屏

    最近发现某个医院客户Windows Server 2012 R2 DataCenter的系统频繁蓝屏重启,重启没过一天再一次出现,反反复复折腾好几天,提示信息ntoskrnl.exe.mssmbios ...

  9. 最新 二六三网络通信java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 二六三网络通信等10家互联网公司的校招Offer,因为某些自身原因最终选择了 二六三网络通信.6.7月主要是做系统复习.项 ...

  10. Zookeeper开源客户端Curator之事件监听详解

    Curator对Zookeeper典型场景之事件监听进行封装,提供了使用参考.这篇博文笔者带领大家了解一下Curator的实现方式. 引入依赖 对于Curator封装Zookeeper的典型场景使用都 ...