新词发现


 摘要: 总结两种新词发现的算法,以及使用工具SmoothNLP和helloNLP来实现该功能。

 一、前言

NLP处理过程中,经常会遇到新词或者是未登陆词的情况,如何解决新词发现的问题,对于目前用的预训练模型例如bert、ernie等,都不能解决这个问题,再加上新词数据量多,新的词会变,所以通过标注的方式也行不通。本文总结了相关的新词发现的算法,以及使用SmoothNLP和helloNLP等工具进行实现。

二、算法解析

2.1 SmoothNLP是一个NLP处理的工具箱,可以拿来直接使用,对于新词发现,该工具也优化了。该方法提出通过考虑左右领字的丰富程度和内部凝聚程度来判断字符组合是不是一个词。

像“人工智”、“工智能”这样的词,单看内部凝聚程度的话,是不错的,但是左右邻字不够丰富,例如“人工智能”、“人工智障”,就比较难举出别的例子。所以也需要考虑左右邻字的丰富程度。

左右领字的丰富程度:

如果一个字符组合可以成词,它应当出现在丰富的语境中,也就是说,拥有丰富的左右邻字。信息熵是对信息量多少的度量,信息熵越高,表示信息量越丰富、不确定性越大。因此字符组合左右邻字的丰富程度,可以用信息熵(Entropy)来表示:

为了度量左右邻字丰富程度,我们综合考虑候选词左右信息熵(LE,RE)的大小、LE与RE差的绝对值(|LE-RE|),构造统计量如下:

 [公式]

 内部凝聚程度:

使用平均互信息(AMI)作为词语内聚程度的度量。AMI的公式如下:

 [公式] 

候选词得分 [公式] 

2.2 helloNLP也是通过考虑左右领字的丰富程度和内部凝聚程度来判断字符组合是不是一个词,区别在于:

HelloNLP方法

 

当 [公式] 的值越大时,意味着string可以独立作为一个词的可能性就越大。其中,为了避免ER或者EL其中某一个值非常大,而另外一个值非常小,导致该情况下得到的 [公式] 值过大,我们计算了LE与LR的差绝对值|EL-ER|。举一个实际的例子,假设“我们的”右邻熵会非常的大,但是左邻熵却非常的小,如果我们直接将左右邻熵相加就会得到一个较大的值,那么“我们的”这个字符串就会被当作为一个词了。

现在对比下这两种方法:

[公式] (2,38) = 35.08; [公式] (20,20) = 23.68
[公式] (10,70) = 68.19 ; [公式] (40,40) = 44.38
[公式] (100,400) = 398.89; [公式] (200,300) = 300.68
[公式] (2,38) = 37.10; [公式] (20,20) = 45.99
[公式] (10,70) = 78.32 ; [公式] (40,40) = 87.37
[公式] (100,400) = 499.18; [公式] (200,300) = 501.77

从上面的对比来看,对HelloNLP而言,当(EL,ER)的和一定的时候,EL和ER的差距越小,L的值就会越大。但是,对SmoothNLP而言,却是相反的。

我们需要的是左右的信息熵都相对较大时,此时的词可以独立作为一个词的可能性越大,所以HelloNLP使用的左右邻字丰富程度评估函数更好。

另外在算候选词得分的时候,helloNLP算法加了两个系数。

helloNLP候选词的打分为:

 其中, [公式] 和 [公式] 这两个变量需要评估。如果都设置为1,那么我们认为信息熵(自信息)和互信息同样的重要,反之我们会偏向其中的一个。

三、新词发现功能实现

smoothnlp提供了一个短语抽取函数extract_phrase,抽取过程考虑了词语本身及其上下文特征。

1 from smoothnlp.algorithm.phrase import extract_phrase
2 
3 import pandas as pd
4 f = open('F:/FinancialDatasets/annotated.txt','r',encoding='utf-8')
5 lines = f.readlines()
6 top20=extract_phrase(lines,top_k=20,min_freq=1)
7 print(top20)

使用helloNLP的代码实现:

1 from hellonlp.ChineseWordSegmentation import segment_entropy
2 f = open('F:/FinancialDatasets/annotated.txt','r',encoding='utf-8')
3 lines = f.readlines()
4 words = segment_entropy.get_words(lines,top_k=20,min_freq=2)
5 print(words)

参考资料:

1、hankcs/pyhanlp: 中文分词 (github.com)

2、smoothnlp/SmoothNLP: 专注于可解释的NLP技术 An NLP Toolset With A Focus on Explainable Inference (github.com)

3、"新词发现"算法探讨与优化-SmoothNLP - 知乎 (zhihu.com)

4、"新词发现" 算法优化 - HelloNLP - 知乎 (zhihu.com)

5、

6、互联网时代的社会语言学:基于SNS的文本数据挖掘 | Matrix67: The Aha Moments

7、blmoistawinde/HarvestText: 文本挖掘和预处理工具(文本清洗、新词发现、情感分析、实体识别链接、关键词抽取、知识抽取、句法分析等),无监督或弱监督方法 (github.com)

8、http://www.fastnlp.top/docs/fastNLP/user/installation.html