一、前言
本文介绍利用牛顿冷却模拟遗忘降噪,从大规模文本中无监督生成词库的方法。
二、词库生成
算法分析,先来考虑以下几个问题
问:目标是从文本中抽取词语,是否可以考虑使用遗忘的方法呢?
答:可以,词语具备以相对稳定周期重复再现的特征,所以可以考虑使用遗忘的方法。这意味着,我们只需要找一种适当的方法,将句子划分成若干子串,这些子串即为“候选词”。在遗忘的作用下,如果“候选词”会周期性重现,那么它就会被保留在词库中,相反如果只是偶尔或随机出现,则会逐渐被遗忘掉。
问:那用什么方法来把句子划分成子串比较合适呢?
答:考察句中任意相邻的两个字,相邻两字有两种可能:要么同属于一个共同的词,要么是两个词的边界。我们都会有这样一种感觉,属于同一个词的相邻两字的“关系”肯定比属于不同词的相邻两字的“关系”要强烈一些。
数学中并不缺少刻划“关系”的模型,这里我们选择公式简单并且参数容易统计的一种:如果两个字共现的概率大于它们随机排列在一起的概率,那么我们认为这两个字有关,反之则无关。
如果相邻两字无关,就可以将两字中间断开。逐字扫描句子,如果相邻两字满足下面的公式,则将两字断开,如此可将句子切成若干子串,从而获得“候选词”集,判断公式如下图所示:
公式中所需的参数可以通过统计获得:遍历一次语料,即可获得公式中所需的“单字的频数”、“相邻两字共现的频数”,以及“所有单字的频数总和”。
问:如何计算遗忘剩余量?
答:使用牛顿冷却公式,各参数在遗忘算法中的含义,如下图所示:
牛顿冷却公式的详情说明,可以参考阮一峰老师的博文《基于用户投票的排名算法(四):牛顿冷却定律》。
问:参数中时间是用现实时间吗,遗忘系数取多少合适呢?
答:a、关于时间:
可以使用现实时间,遗忘的发生与现实同步。
也可以考虑用处理语料中对象的数量来代替,这样仅当有数据处理时,才会发生遗忘。比如按处理的字数为计时单位,人阅读的速度约每秒5至7个字,当然每个人的阅读速度并不相同,这里的参数值要求并不需要特别严格。
b、遗忘系数可以参考艾宾浩斯曲线中的实验值,如下图(来自互联网)
我们取6天记忆剩余量约为25.4%这个值,按每秒阅读7个字,将其代入牛顿冷却公式可以求得遗忘系数:
注意艾宾浩斯曲线中的每组数值代入公式,所得的系数并不相同,会对词库的最大有效容量产生影响。
二、该算法生成词库的特点
3.1、无监督学习
3.2、O(N)级时间复杂度
3.3、训练、执行为同一过程,可无缝处理流式数据
3.4、未登录词、新词、登录词没有区别
3.5、领域自适应:领域变化时,词条、词频自适应的随之调整
3.6、算法中仅使用到频数这一语言的共性特征,无需对任何字符做特别处理,因此原理上跨语种。
三、词库成熟度
由于每个词都具备一个相对稳定的重现周期,不难证明,当训练语料达到一定规模后,在遗忘的作用下,每个词的词频在衰减和累加会达到平衡,也即衰减的速度与增加的速度基本一致。成熟的词库,词频的波动相对会比较小,利用这个特征,我们可以衡量词库的成熟程度。
四、源码(C#)、演示程序下载
使用内附语料(在“可直接运行的演示程序”下可以找到)生成词库效果如下:
五、联系方式:
1、QQ:老憨 244589712
2、邮箱:gzdmcaoyc@163.com
我一直致力于无词典的文本挖掘,所以看到本文还是挺兴奋的。
我想知道,这里的遗忘算法在提取词语的时候,会不会将“了一”划分为一个词语?由于很多“吃了一个”、“打了一顿”这样的词语,因此,如果不加其它条件,“了一”容易被识别为一个词。遗忘算法生成的词表中会不会有这个问题?如果不会,是通过什么机制解决的?
[回复]
老憨 回复:
19 5 月, 2016 at 10:08
与训练量和训练的文本有关,当训练量较大,且文本的词频接近自然分布的情况时,会自行拆开,一般文本量足够大的情况下无需特别处理,经验证250M以上训练量效果就已经够用。
[回复]
您好,如何判断候选词是否被遗忘呢?是当前词频剩余量R=0的时候吗?另外,成熟度如何计算呢?
[回复]
老憨 回复:
17 6 月, 2016 at 15:46
1、默认参数下,词频小于0.254时可以清理,相当于6天时间内,只出现过一次。
2、成熟度的说明:
2. 1、成熟度这里用对象遗忘与增加的量的残差累和来表征;
2.2、已经累计的残差之和会随时间衰减;
2.3、成熟度 = 成熟度衰减剩余量 + 本次遗忘与增加量的残差的绝对值
2.4、实测该指标效果不是很稳定。
[回复]
只能生成词长度为2的库吗,有没有可能生成别的长度的
[回复]
老憨 回复:
28 7 月, 2016 at 22:01
不是呀,不限词长。算法中利用两个字的关联找出切断的位置,在这些位置将句子切成若干段,每段是一个候选词。
[回复]
wing 回复:
9 9 月, 2016 at 15:34
有一个问题啊。是不是得到的分词词语的长度不会低于候选词的长度,有没有办法对候选词做进一步的切分呢?
[回复]
老憨 回复:
10 10 月, 2016 at 13:53
分词算法选择使整句概率最大的词。对你的问题理解的不是太清楚,可以QQ联系我细聊。
我使用了260M的语料进行词库的训练,发现语料中的“房性早搏”和“室性早搏”经过训练得出的词成了“性早搏”。请问有什么好的办法避免此类问题吗?
[回复]
老憨 回复:
20 8 月, 2016 at 19:47
加我QQ:244589712,详细聊。
[回复]
图片怎么看不到啊
[回复]
老憨 回复:
10 10 月, 2016 at 13:56
我这儿没问题,不行的话,去CSDN上看吧:
http://blog.csdn.net/gzdmcaoyc?viewmode=contents
[回复]
您好,
对于中英混杂的句子,英文是一个字母定义为一个字,还是一个单词定义为一个字?
[回复]
@老憨,这个有没有python的版本
[回复]
请问下,这个算法实现起来空间消耗很严重吧,需要记录两个字连续的频数,所以类似一个巨大的二维数组?
[回复]