本文主要参考文献1, 主要目的是记录和简化核心规则,并根据实践提出了一些实践中的方案。
新词发现规则
新词发现主要依赖3个重要的度量,分别称之为: 频数, 凝聚度, 自由度。
下面分别来定义这些概念:
频数
一个词在不同文档中出现的次数。 一般说来一个词要成词必须得有人用,基本没人用的词不是不能成词,就是过于生僻。所以可以取一个阈值,直接过滤掉哪些很少出现的词。
凝聚度
主要是考察待考察的词组成的非偶然性。
具体度量以如下例子来看:
假如在语料库中,“电影” 在语料库中出现的概率是 0.000113 , “院”出现的概率约为 0.0001969。假设“电影院”出现,那么理论上概率应该是 0.000113 * 0.0001969,约为2.223e-8。“电影院”在语料中一共出现了 175 次,出现概率约为 7.183e-6 , 7.183e-6 / 2.223e-8 约为 300, 这里的300就是这样的分割凝聚度。
这个值越大,就表明了成词的非偶然性越大,成词的可能性越大。
需要注意的是由于每个词的分割方式不同,那么每次分割凝聚度不同,最终的凝聚度取最小的分割凝聚度。
自由度
光看文本片段内部的凝合程度还不够,我们还需要从整体来看它在外部的表现。
例如:考虑“被子”和“辈子”这两个片段。我们可以说“买被子”、“盖被子”、“进被子”、“好被子”、“这被子”等等,在“被子”前面加各种字;但“辈子”的用法却非常固定,除了“一辈子”、“这辈子”、“上辈子”、“下辈子”,基本上“辈子”前面不能加别的字了。“辈子”这个文本片段左边可以出现的字太有限,以至于直觉上我们可能会认为,“辈子”并不单独成词,真正成词的其实是“一辈子”、“这辈子”之类的整体。
可见,文本片段的自由运用程度也是判断它是否成词的重要标准。如果一个文本片段能够算作一个词的话,它应该能够灵活地出现在各种不同的环境中,具有非常丰富的左邻字集合和右邻字集合。
衡量这种丰富度的做法就是这里的自由度,主要是计算其左右领字集合的信息熵。并去最小的值作为最终的自由度。
总的做法:
我们把文本中出现过的所有长度不超过 d 的子串都当作潜在的词(即候选词,其中 d 为自己设定的候选词长度上限,我设定的值为 5 ),再为出现频数、凝固程度和自由程度各设定一个阈值,然后只需要提取出所有满足阈值要求的候选词即可。
Tricks
- 首先要过滤掉频率特别高的字。
- 不同长度的词取有不同的阈值。
- 需要根据特定的语料过滤掉包含某些特定的词或者字(例如地)。
- 需要处理叠词(例如哈哈哈哈)。
- 需要按照特定的规则对长的词进行拆分(例如 xx的xx)。