新词发现-helloNLP
作者:互联网
1 数据源处理、分词
分词就是为了削弱相关性,降低对词序的依赖。但是有些词之间是存在依赖关系的,新词发现就是为了挖掘出聚有强依赖关系的词语。
2.1 基于凝聚度和左右熵计算自由度的新词发现
https://github.com/hellonlp/hellonlp/tree/master/ChineseWordSegmentation
2.1.1 左右邻熵衡量字符串的自由度
已知一个字符串的组合string,在已知的文本数据库中,出现在它左边相邻的字有m种,出现在它右边边相邻的字有n种。那么这两种情况下,我们分别可以计算两个熵,分别为左邻熵和右邻熵。
- 左邻熵
其中, 为左邻字符串集合。string为字符串的组合(长度1-5)
- 右邻熵
其中, 为右邻字符串集合。
根据上面的2个公式,我们可以得知,当 或者 集合越大,以及当 的值越大时,我们得到的熵就会越大。熵越大,代表的信息量也就越大。
- 计算左右邻字丰富程度的方法:
当 的值越大时,意味着string可以独立作为一个词的可能性就越大。其中,为了避免ER或者EL其中某一个值非常大,而另外一个值非常小,导致该情况下得到的 值过大,我们计算了LE与LR的差绝对值|EL-ER|。举一个实际的例子,假设“天天向”左邻熵会非常的大,但是右邻熵却非常的小,如果我们直接将左右邻熵相加就会得到一个较大的值,那么“天天向”这个字符串就会被当作为一个词了,这是不合理的。我们需要的是左右的信息熵都相对较大时,此时的词可以独立作为一个词的可能性越大。
2.1.2 利用互信息计算词内凝聚度
两个字符对象的互信息计算公式:
两个字符串之间的互信息评估的是他们在一起的意义,互信息越大,说明彼此依赖更强,而不是可以有可无的。在实际的文本数据中,很多字符一起出现的频数很高,但这并不意味着他们的组合可以做为一个词。所以,这个时候,互信息可以用来评估,他们中哪些字符串的组合是真正有意义的,哪些是可有可无的。
例如,"的"、"个"和很多字符串的组合频数都比较高。例如一句话:"美丽的山水画",其中,"的山水"和"山水画"都出现的频数较高,分别为200和300。另外,"的"、"山水"、"画"的频数分别为1000000、1000和2000。另外,一共有10^8个组合。
那么,"的山水"和"山水画"的互信息分别为:
- 平均互信息
由于对象间互信息量会受到候选词长度的影响(候选词越长,互信息取值偏大),我们使用平均互信息作为词语内聚程度的度量。
2.1.3 平衡自由度和凝聚都的影响程度
2.2 基于切词的新词发现
https://github.com/trustfuture/word_discovery
既然分词是为了削弱相关性,那么就是再相关性较弱的地方切断,通过考虑多字的内部凝聚度(ngrams),来识别出可能存在的词组。
比如,定义三个字符穿的内部凝聚度为:
这个定义其实也就是说,要枚举所有可能的切法,因为一个词应该是处处都很“结实”的,4字或以上的字符串凝固度类似定义。一般地,我们只需要考虑到4字(4grams)就好(但是注意,我们依旧是可以切出4字以上的词来的)。
完整算法步骤:
第一步,统计:选取某个固定的n,统计2grams、3grams、…、ngrams,计算它们的内部凝固度,只保留高于某个阈值的片段,构成一个集合G;这一步,可以为2grams、3grams、…、ngrams设置不同的阈值,不一定要相同,因为字数越大,一般来说统计就越不充分,越有可能偏高,所以字数越大,阈值要越高;
第二步,切分:用上述grams对语料进行切分(粗糙的分词),并统计频率。切分的规则是,只要一个片段出现在前一步得到的集合G中,这个片段就不切分,比如“各项目”,只要“各项”和“项目”都在G中,这时候就算“各项目”不在G中,那么“各项目”还是不切分,保留下来;
第三步,回溯:经过第二步,“各项目”会被切出来(因为第二步保证宁放过,不切错)。回溯就是检查,如果它是一个小于等于n字的词,那么检测它在不在G中,不在就出局;如果它是一个大于n字的词,那个检测它每个n字片段是不是在G中,只要有一个片段不在,就出局。还是以“各项目”为例,回溯就是看看,“各项目”在不在3gram中,不在的话,就得出局。
标签:发现,helloNLP,互信息,左邻,片段,切分,字符串,2.1,新词 来源: https://blog.csdn.net/weixin_40650252/article/details/119177543