互联网时代,信息产生的数量和传递的速度非常快,语言文字也不断变化更新,新词层出不穷。一个好的新词发现程序对做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. (二)Asp.net web api中的坑-【http get请求中的参数】

    webapi主要的用途就是把[指定的参数]传进[api后台],api接收到参数,进行[相应的业务逻辑处理],[返回结果].所以怎么传参,或者通俗的说,http请求应该怎么请求api,api后台应该怎么 ...

  2. 安装CCS提示错误Windows8.1-KB2999226-x64安装提示 此更新不适用你的计算机

    问题如图所示: 解决方案: 放在D:\目录下 windows键+X  选择  命令提示符(管理员)  一定要是管理员 打开cmd 分别执行下面两句.红色部分就是自己的更新程序了.其他安装同理 例如Wi ...

  3. go context源码解析

    go 的context贯穿整个goroutine的运行控制的中枢,可以实现执行的生命周期的控制. Context是一个接口,他派生了context.emptyCtx(TODO),cancelCtx,t ...

  4. Ant 构建 Jmeter脚本报错详解

    在搭建Ant构建Jmeter脚本的时候,小组成员遇到了各种问题. 再这里总结一下,遇到类似问题的可以做个参考 1.提示 does not exist 解决方案: 出现这种的问题原因有很多. 先排除权限 ...

  5. linux中查看磁盘容量的常用操作

    linux中查看磁盘容量常用操作 实验室有GPU集群,用户跑数据时候跑着跑着会出现集群挂掉的问题,原因就是,在跑数据时,用户上传文件,数据集,系统产生缓存等一系列操作,消耗了集群空间,师兄让我清理下服 ...

  6. IO-file-04 文件的创建

    1. package com.bwie.io; import java.io.File; import java.io.IOException; public class FileDemo4 { /* ...

  7. 第一周006------Java 三大版本含义——Java ME和安卓开发的关系

    Java ME 和安卓开发没有任何关系 Java  SE(Java Standard Edition):标准版,定位在个人计算机的应用(桌面系统 QQ  游戏)Java  EE(Java Enterp ...

  8. jquery实现微博输入和发布

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. [转帖]postgres csv日志和查看用户权限

    postgres csv日志和查看用户权限 最近在使用postgres 时遇到的2个问题,顺便记录一下查到的比较好的资料. 怀疑postgres在执行SQL时报错,程序日志中有无明确异常信息.通过查看 ...

  10. Spring 启动加载资源到内存

    前言 在一些业务场景中,当容器初始化完成之后,需要处理一些操作,比如一些数据的加载.初始化缓存.特定任务的注册等等.我找到了三种方式解决下面的问题. 1.使用PostConstruct注解 这种解决方 ...