用python实现新词发现程序——基于凝固度和自由度
互联网时代,信息产生的数量和传递的速度非常快,语言文字也不断变化更新,新词层出不穷。一个好的新词发现程序对做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实现新词发现程序——基于凝固度和自由度的更多相关文章
- 使用python对py文件程序代码复用度检查
#!/user/bin/env python # @Time :2018/6/5 14:58 # @Author :PGIDYSQ #@File :PyCheck.py from os.path im ...
- 【新词发现】基于SNS的文本数据挖掘、短语挖掘
互联网时代的社会语言学:基于SNS的文本数据挖掘 python实现 https://github.com/jtyoui/Jtyoui/tree/master/jtyoui/word 这是一个无监督训 ...
- 基于大规模语料的新词发现算法【转自matix67】
最近需要对商品中的特有的词识别,因此需新词发现算法,matrix的这篇算法很好. 对中文资料进行自然语言处理时,我们会遇到很多其他语言不会有的困难,例如分词——汉语的词与词之间没有空格,那计算机怎么才 ...
- Pytest权威教程-更改标准(Python)测试发现
目录 更改标准(Python)测试发现 在测试收集过程中忽略路径 测试期间收集的测试取消 保留从命令行指定的重复路径 更改目录递归 更改命名约定 将cmdline参数解释为Python包 找出收集的东 ...
- [python]用profile协助程序性能优化
转自:http://blog.csdn.net/gzlaiyonghao/article/details/1483728 本文最初发表于恋花蝶的博客http://blog.csdn.net/lanph ...
- 小程序基于疼讯qcloud的nodejs开发服务器部署
腾讯,疼讯,很疼. 请慎重看腾讯给出的文档,最好做一个笔记. 我只能说我能力有限,在腾讯云小程序的文档中跳了n天. 最后还是觉得记录下来,以防止我的cpu过载给烧了. 此文档是对<小程序 ...
- 【转】Python用数据说明程序员需要掌握的技能
[转]Python用数据说明程序员需要掌握的技能 https://blog.csdn.net/HuangZhang_123/article/details/80497951 当下是一个大数据的时代,各 ...
- OpenCV + python 实现人脸检测(基于照片和视频进行检测)
OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...
- [转]python实现RESTful服务(基于flask)
python实现RESTful服务(基于flask) 原文: https://www.jianshu.com/p/6ac1cab17929 前言 上一篇文章讲到如何用java实现RESTful服务, ...
随机推荐
- LSTM改善RNN梯度弥散和梯度爆炸问题
我们给定一个三个时间的RNN单元,如下: 我们假设最左端的输入 为给定值, 且神经元中没有激活函数(便于分析), 则前向过程如下: 在 时刻, 损失函数为 ,那么如果我们要训练RNN时, 实际上 ...
- 【c# 学习笔记】类与结构体的区别
由于类与结构体在语法和使用上都非常类似,导致我们这些初学者容易混淆.为更好理解,特做以下区分记录: ① 语法上的区别在于,定义类要使用关键词class,而定义结构体则使用关键词struct. ② 结构 ...
- 第一篇博客==>Hello_World
1,为什么写博客? 大佬都说程序员需要写博客的说,被无数到的大佬帮我洗脑之后,慢慢也发现了写博客的好处,写博客我认为主要有以下几个作用: 1.打开博客,记录世界记录你.emmm 2.可以把自己的一些经 ...
- 最新 美柚java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 美柚等10家互联网公司的校招Offer,因为某些自身原因最终选择了 美柚.6.7月主要是做系统复习.项目复盘.LeetCo ...
- 使用eclipse插件mybatis generator来自动生成实体类及映射文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...
- ThinkPHP如何在控制器中调用命令
前段时间因为业务需求,使用TP的command开发了几个模块,期间测试一下在控制器中调用命令的方式,发现一些问题记录一下 官方文档: <?php namespace app\index\cont ...
- Windows 10系统快捷键
虚拟桌面 创建新的虚拟桌面:Win + Ctrl + D 关闭当前虚拟桌面:Win + Ctrl + F4 切换虚拟桌面:Win + Ctrl +左/右 任务视图:Win + Tab Win10常用W ...
- python map函数(23)
截至到目前为止,其实我们已经接触了不少的python内置函数,而map函数也是其中之一,map函数是根据指定函数对指定序列做映射,在开发中使用map函数也是有效提高程序运行效率的办法之一. 一.语法定 ...
- Asp.Net Core 自定义验证属性
很多时候,在模型上的验证需要自己定义一些特定于我们需求的验证属性.所以这一篇我们就来介绍一下怎么自定义验证属性. 我们来实现一个验证邮箱域名的自定义验证属性,当然,最重要的是需要定义一个继承自Vali ...
- TCP通信的文件上传案例