几种新词发现思路

下面的方法都是用于构建新的词库,将新的词库跟常用词库进行对比,删掉常见词,就可以得到新词了。

一、基于频次、凝聚度、自由度的分词。

频次:就是字或词在整个语料中出现的次数。在整个 2400 万字的数据中,“电影”一共出现了 2774 次,2774就是频次。

凝聚度:就是两个词单独出现的概率乘积和它们一起出现的概率的大小对比。在整个 2400 万字的数据中,“电影”一共出现了 2774 次,出现的概率约为 0.000113 。“院”字则出现了 4797 次,出现的概率约为 0.0001969 。如果两者之间真的毫无关系,它们恰好拼在了一起的概率就应该是 0.000113 × 0.0001969 ,约为 2.223 × 10-8 次方。但事实上,“电影院”在语料中一共出现了 175 次,出现概率约为 7.183 × 10-6 次方,是预测值的 300 多倍。类似地,统计可得“的”字的出现概率约为 0.0166 ,因而“的”和“电影”随机组合到了一起的理论概率值为 0.0166 × 0.000113 ,约为 1.875 × 10-6 ,这与“的电影”出现的真实概率很接近——真实概率约为 1.6 × 10-5 次方,是预测值的 8.5 倍。计算结果表明,“电影院”更可能是一个有意义的搭配,而“的电影”则更像是“的”和“电影”这两个成分偶然拼到一起的。

自由度:我们用信息熵来衡量一个文本片段的左邻字集合和右邻字集合有多随机。考虑这么一句话“吃葡萄不吐葡萄皮不吃葡萄倒吐葡萄皮”,“葡萄”一词出现了四次,其中左邻字分别为 {吃, 吐, 吃, 吐} ,右邻字分别为 {不, 皮, 倒, 皮} 。根据公式,“葡萄”一词的左邻字的信息熵为 – (1/2) · log(1/2) – (1/2) · log(1/2) ≈ 0.693 ,它的右邻字的信息熵则为 – (1/2) · log(1/2) – (1/4) · log(1/4) – (1/4) · log(1/4) ≈ 1.04 。可见,在这个句子中,“葡萄”一词的右邻字更加丰富一些。 在人人网用户状态中,“被子”一词一共出现了 956 次,“辈子”一词一共出现了 2330 次,两者的右邻字集合的信息熵分别为 3.87404 和 4.11644 ,数值上非常接近。但“被子”的左邻字用例非常丰富:用得最多的是“晒被子”,它一共出现了 162 次;其次是“的被子”,出现了 85 次;接下来分别是“条被子”、“在被子”、“床被子”,分别出现了 69 次、 64 次和 52 次;当然,还有“叠被子”、“盖被子”、“加被子”、“新被子”、“掀被子”、“收被子”、“薄被子”、“踢被子”、“抢被子”等 100 多种不同的用法构成的长尾⋯⋯所有左邻字的信息熵为 3.67453 。但“辈子”的左邻字就很可怜了, 2330 个“辈子”中有 1276 个是“一辈子”,有 596 个“这辈子”,有 235 个“下辈子”,有 149 个“上辈子”,有 32 个“半辈子”,有 10 个“八辈子”,有 7 个“几辈子”,有 6 个“哪辈子”,以及“n 辈子”、“两辈子”等 13 种更罕见的用法。所有左邻字的信息熵仅为 1.25963 。因而,“辈子”能否成词,明显就有争议了。“下子”则是更典型的例子, 310 个“下子”的用例中有 294 个出自“一下子”, 5 个出自“两下子”, 5 个出自“这下子”,其余的都是只出现过一次的罕见用法。事实上,“下子”的左邻字信息熵仅为 0.294421 ,我们不应该把它看作一个能灵活运用的词。当然,一些文本片段的左邻字没啥问题,右邻字用例却非常贫乏,例如“交响”、“后遗”、“鹅卵”等,把它们看作单独的词似乎也不太合适。我们不妨就把一个文本片段的自由运用程度定义为它的左邻字信息熵和右邻字信息熵中的较小值。

二、基于遗忘算法的分词。

分词原理:词语具备以相对稳定周期重复再现的特征,所以可以考虑使用遗忘的方法。这意味着,我们只需要找一种适当的方法,将句子划分成若干子串,这些子串即为“候选词”。在遗忘的作用下,如果“候选词”会周期性重现,那么它就会被保留在词库中,相反如果只是偶尔或随机出现,则会逐渐被遗忘掉。

子串划分规则:如果两个字共现的概率大于它们随机排列在一起的概率,那么我们认为这两个字有关,反之则无关。如果相邻两字无关,就可以将两字中间断开。逐字扫描句子,如果相邻两字满足下面的公式,则将两字断开,如此可将句子切成若干子串,从而获得“候选词”集,判断公式如下图所示:

计算遗忘剩余量:使用牛顿冷却公式,各参数在遗忘算法中的含义,如下图所示:

其中遗忘系数\alpha,可以参考艾宾浩斯曲线中的实验值,如下图:

我们取6天记忆剩余量约为25.4%这个值,按每秒阅读7个字,那么6天阅读的总字数为6*24*60*60*7,将其代入牛顿冷却公式可以求得遗忘系数:

\alpha =-log(0.254)/(6*24*60*60*7)

三、基于最大概率的分词

例子:我去吃饭了。

为了简单,就以二元模型为例,即最终的词语最大长度为2。

它的分词结果有如下情况:

我   去   吃   饭   了

我去   吃  饭   了

我   去吃   饭   了

。。。等等情况,而这些情况出现的概率分别是

p1=p(我)*p(去)*p(吃)*p(饭)*p(了)

p2=p(我)*p(去|我)*p(吃)*p(饭)*p(了)

p3=p(我)*p(去)*p(吃|去)*p(饭)*p(了)

。。。等等情况。

最终正确的分词结果是“我   去   吃饭   了”,也就是说这一结果的概率是最大的,这其实就是一个序列标注问题,标签有S(single,单个)、B(首字)、I(非首字),最终正确的标签结果就是“SSBIS”,此时问题就变成了找出哪种情况或序列出现的概率最大(前向算法)且各个字的标签分别是什么(定位),前向算法加定位那不就是维特比算法么,维特比算法就是用前向算法求哪种隐藏状态有最大可能生成观测序列,同时求解的时候加上标记用于反向找隐藏状态。这里另外提一下,既然是序列标注问题,那么用来做NER的fcn、bilstm+crf也是可以用来做分词的,当然,用这些方法就需要准备一些标注数据了,毕竟是有监督的学习。

参考资料:

1、互联网时代的社会语言学:基于SNS的文本数据挖掘

2、非主流自然语言处理——遗忘算法系列(二):大规模语料词库生成

3、基于语言模型的无监督分词

猜你喜欢

转载自blog.csdn.net/qq_33391629/article/details/108714271