新词发现

2020-06-10  本文已影响0人  京漂的小程序媛儿

一、新词发现

中文分词有98%的错误来自"未登录词"。这里的"未登录词",包括各类专有名词、缩写词、流行词汇等等。对于NLP应用来讲, 机器/模型没处理过的词就是"未登录词", 更简单来讲, 就算是时下流行的Bert, XLNet, Ernie等等, 都不解决"未登录词"的Encoding问题。 ‘未登录词识别’也就是‘新词发现’。“新”并非只是时间上的概念,同样可以迁移到领域或空间上。因此,新词发现不仅可以挖掘随时间变化而产生的新词,也可以挖掘不同领域的专有名词。

“新词发现”,可将其拆分为“发现”和“新词”两个步骤:

“发现”:依据某种手段或方法,从文本中挖掘词语,组成新词表;

“新词”:借助挖掘得到的新词表,和之前已有的旧词表进行比对,不在旧词表中的词语即可认为是新词。

重点在于“发现”。

二、如何定义一个词

什么样的字符组合可以称为一个“词”?

大多数‘新词发现’的无监督统计方法,根本思想都源自matrix67大佬的文章互联网时代的社会语言学:基于SNS的文本数据挖掘

一个“词”应该符合哪些特征(核心指标)?

1、词语的左右邻字要足够丰富(自由度)

2、词语的内部凝聚程度要足够高(凝聚度)

接下来分别讨论这两点。

一、词语的左右邻字要足够丰富(自由度要高)

如果一个字符组合可以成词,它应当出现在丰富的语境中,也就是说,拥有丰富的左右邻字。当前文本片段的上文和下文可搭配词语越丰富,则其上文信息熵(左信息熵)和下文信息熵(右信息熵)越大。

令当前文本片段为 x,其上文的词语为 yl,下文的词语为 yr,信息熵计算如下:

信息熵

一般,我们取左右信息熵中的最小值。

当然也可以自行设计一个合理的统计量去度量自由程度。例如,综合考虑文本片段左右信息熵(LE、RE)的大小、LE 与 RE 差的绝对值 (|LE - RE|)。

自由度衡量指标

同样是在文本中出现6000+次的“副总裁和“人工智,字符组合的左熵都在6左右,但“副总裁”的右邻字包括 { 张,王,说, ...... } 等147个词,而“人工智”的右邻字只有 { 能,障 } 两种,显然“人工智”不能称作一个词。

自由度

二、词语的内部凝聚程度要足够高(凝聚度要高)

如果某些字符经常出现在一起,我们会认为这些字符可以成词,这并不意味着我们可以用字符组合出现的频数作为判断标准。

凝聚度

如上图所示,在1900万字的新闻中,如果单纯地以字符的共现为标准判断,由于"的","在"这些常用字的存在,会产生大量噪声词。这些噪声词(如"你的","亚马逊的")虽然为文本中十分常见,但是它们并不是合理的中文词汇。因为"的","在"的出现太过频繁,就像日常出门营业的social王,它可能和任何人出现在同一场合。只有两个社恐手拉手一起出门,我们才能做出二人是真爱的判断。

所以我们可以对字符有类似的内部凝聚程度的定义。如果字符中的"社恐"同时出现,我们可以认为这样的字符组合就是一个合理的词汇。比如“演唱者”出现117次,“的演唱”出现275次,从出现频数来看,“的演唱”更像是一个词。但是如果把字符的共现看作随机事件的话,“演唱”和“者”在文本中分别出现2502,32272次,二者恰好拼在一起的概率P(演唱)P(者)=2.24*10(-7),而“演唱者”的实际出现概率为它的27倍。而“的”与“演唱”随机拼在一起的概率 P(的)P(演唱)=3.07*10(-6),“的演唱”实际出现概率为它的4.7倍。因此我们有理由相信,“的演唱”这一词语的出现,是常用字“的”日常出门营业,而与一个动词意外拼在一起的结果,“演唱者”才是组成成分之间凝聚程度高的合理中文词汇。

P(演唱)P(者)/P(演唱者) > P(的)P(演唱)/P(的演唱)

为了量化字符组合的凝聚程度,我们用字符组合出现的概率除以每一个组成成分出现的概率。使用点间互信息(point-wise mutual information)作为衡量这一特征的指标:

点互信息

所以“演唱者”的内部凝聚度是:

内部凝聚度

但是,由于点间互信息的值会受到候选词长度的影响(候选词越长,互信息取值偏大),使用平均互信息(AMI)作为词语内聚程度的度量。AMI的公式如下:

平均互信息

3、其他指标

A、词频

B、语义完整度

一个词语的语义应该是完整的,例如“电影院”。而不应该像“的电影”,语义是欠缺的。

实现:对候选片段进行词性标注,如果构成‘偏正结构’,则认为语义完整。

例如“前麦弗逊式独立悬架”,经过词性标注后的结果 [('前', 'f'), ('麦弗逊式', 'n'), ('独立', 'v'), ('悬架', 'n')],构成偏正结构,因此我们可认为具有完整的语义信息。

再举个反例,例如“前麦弗逊式独立悬架驱”,其词性标注结果 [('前', 'f'), ('麦弗逊式', 'n'), ('独立', 'ad'), ('悬架', 'v'), ('驱', 'v')],最后一个“驱”字为动词 v,那么这个词语不具备完整的语义,因此我们可以认为“前麦弗逊式独立悬架驱”不应该作为一个词语。

然而语义完整很难在实际中进行运用,例如“人艰不拆”,其词性标注 [('人', 'n'), ('艰', 'a'), ('不', 'd'), ('拆', 'v')],如果按照“前麦弗逊式独立悬架驱”的判断标准,那么“人艰不拆”不应该作为一个词语。因此,语义完整的判断标准该如何设置,以及在评判标准中的定位都是一个值得商榷的问题。

缺点:限于查找较短的新词语,但不便于描述词语的内部和外部结构特征,同时对于出现频率很低的新词识别效果不好。

三、具体实现算法

首先生成候选词,然后再计算候选词得分,选出TopK的词作为发现结果。跟‘已有词表’比对,不在词表中的就是‘新词’。

1、生成候选词

生成候选词的方法有两种:1、先切词再拼接(word-level);2、按字切分再取n-gram拼接(char-level)。

第一种方法的新词抽取结果,很大程度上依赖于分词的效果。有的分词工具将“楚乔传播出之前”切成了“楚乔/传播/出/之/前”,这样一来,就算之后的工作做得再好,想要抽出“楚乔传”一词也是无力回天。

第二种方法,先把文本按标点切分成句,然后提取每句话的2元组,3元组,...,k元组作为候选词(一般k<=5就够用了)。比如“专注于自然语言处理技术”这句话产生的2元候选词有:[“专注”、“注于”、“于自”、“自然”、“然语”、“语言”、“言处”、“处理”、“理技”、“技术”]。

2、计算候选词得分

自由度L(W)即候选词左右信息熵构建统计量:

自由度

凝聚度,即平均互信息AMI:

凝聚度

所以候选词得分=L(W)+AMI。

3、改进方案

自由程度的计算时间要远大于凝聚程度。所以很多时候先用词频和凝聚度进行粗分词和筛选,对剩下的词再用自由度进行计算。

所以,为了进一步减少自由度的筛选计算量,尝试改进候选词的生成和凝聚度计算公式。

A、候选词生成

除了n-gram以外(量太大),可以使用‘合词’法和‘切词’法,搭配凝聚度指标来得到候选。

合词

从左到右依次计算相邻文本片段的凝聚程度,若达到设定的阈值,则将这两段文本片段整合为一块新的文本片段,然后继续去计算该整合后的文本片段与下一段相邻文本片段的凝聚程度。不断循环,直到无文本片段。

【处理过程】:以“巧克力”为例。

首先,计算“巧克”的凝聚程度,若超过阈值,则将其合并;

然后计算“巧克”与“力”的凝聚程度,若超过阈值,则将其合并,得到“巧克力”。

切词

从左到右依次计算相邻文本片段的凝聚程度(与合词不同,每次只计算相邻两个文本片段的凝聚程度),若未达到设定的阈值,则将这两段文本片段进行切分。不断循环,直到无文本片段。

【处理过程】:以“巧克力真好吃”为例。

首先,计算“巧克”的凝聚程度,若超过阈值,则继续计算“克力”的凝聚程度,若仍然超过阈值,则继续计算下一对文本片段“力真”的凝聚程度;

若“力真”的凝聚程度小于阈值,则进行切分“力|真”,继续计算下一对文本片段;

最终可得“巧克力|真|好吃”。

所以‘合词’法和‘切词’法的根本区别在于,后者只计算2-gram的统计信息,计算复杂度更低。所以优先选择‘切词’法。

但是切词也存在问题:

对于一些频数较高的字,例如“在”、“利”等,在计算其组合(“现在”、“利益”)的凝聚程度时,所得到的凝聚程度往往较低,容易被切分成单字。(因为‘在’和‘利’的频率太高了,导致拉低了与其组合词的凝聚度,即使用AMI也无法解决),这里就需要改进一下凝聚度计算指标。

B、改进凝聚度计算指标

切词问题的实质在于高频字对成词的影响,那么我们适当调低高频字对成词的影响,或提高共现频率在计算公式中的比重。

调整后的凝固度

但是,这样做可以适当提高“现在”、“利益”等词的凝聚程度,但同时也会提高“漂亮的”、“美丽的”这些词语的凝聚程度。简单地说,我们不想降低“的”、“了”、“呢”这些高频字的权重,为了方便后续的说明,特将这些字命名为“停用字”。对于这种情况,我们可以按字的频数取 topK,然后对这些字的频率加大惩罚。

C、改进后的步骤

首先将文本拆分为文本片段(字符、英文单词等);

基于凝聚程度和切词方式对文本进行切分,获得一个粗的词库,同时也对文本做了一次粗的分词;

基于自由程度从上一步的到得词库中筛选出词语;

D、不用自由度,用n-gram+凝聚度+回溯的思想

来自苏剑林大佬的文章更好的新词发现算法

举个极端的例子:林心如和易烊千玺支撑着共和国各项目的顺利进展。

这里的难点在于新词‘林心如’、‘易烊千玺’、‘共和国’的发现,但同时要避免引入不合理的词,如‘支撑着’、‘各项目’。

以上的词分为三种:第1种是各个字之间凝聚度都不高,合成一个词凝聚度才高,这样的词不能被切分。如‘林心如’、‘易烊千玺’;第2种是部分片段之间凝聚度高,但另一部分凝聚度不高,这样的词也不应该被切分。如‘共和国’,其中‘共和’的凝聚度还可以,但‘和国’的凝聚度低,但是如果考虑‘共和国’这个整体的话,凝聚度高;第3种是各部分片段之间凝聚度都很高,但整个词的凝聚度不高,应该被分开。如‘各项目’、‘支撑着’,其中‘各项’、‘项目’、‘支撑’、‘撑着’都联系紧密,但是‘各项目’和‘支撑着’不是合理的词。

为了解决以上三个问题,在不用自由度的前提下,就要用n-gram+凝聚度+回溯的方案来解决。

首先,这里定义多字凝聚度的方法和AMI不同:

多字片段凝聚度定义

这个定义其实也就是说,要枚举所有可能的切法,因为一个词应该是处处都很“结实”的,4字或以上的字符串凝固度类似定义。一般地,我们只需要考虑到4字(4grams)就好(但是注意,我们依旧是可以切出4字以上的词来的)。

详细算法如下:

第一步,统计。

选取某个固定的n,统计2grams、3grams、…、ngrams,计算它们的内部凝固度,只保留高于某个阈值的片段,构成一个集合G;

这一步,可以为2grams、3grams、…、ngrams设置不同的阈值,不一定要相同,因为字数越大,一般来说统计就越不充分,越有可能偏高,所以字数越大,阈值要越高;

第二步,切分。

用上述grams对语料进行切分(粗糙的分词),并统计频率。

切分的规则是,只有一个片段出现在前一步得到的集合G中,这个片段就不切分。

以‘宁放过,不切错’为原则,因为这一步一但切开了,就回天无术了。但是没切开,下一步回溯时还可以出局。

比如“各项目”,只要“各项”和“项目”都在G中,这时候就算“各项目”不在G中,那么“各项目”还是不切分,保留下来;

第三步,回溯。

回溯就是检查。

如果它是一个小于等于n字的词,那么检测它在不在G中,不在就出局;如果它是一个大于n字的词,那个检测它每个n字片段是不是在G中,只要有一个片段不在,就出局。

经过第二步,“各项目”会被切出来(因为第二步保证宁放过,不切错)。还是以“各项目”为例,回溯就是看看,“各项目”在不在3gram中,不在的话,就得出局。

用上面的n-gram+凝聚度+回溯算法,实践一下上面的例子:

林心如和易烊千玺支撑着共和国各项目的顺利进展。

1、统计阶段

林心如、易烊千玺、共和、共和国、支撑、撑着、各项、项目、顺利、进展都会被筛选出来,因为它们的grams凝聚度高于阈值。(支撑着、各项目会被筛掉,因为‘支撑’、‘撑着’的概率都比较大,根据多字片段凝聚度计算公式,‘支撑着’的凝聚度会小;‘共和国’不会被筛掉,首先‘和国’的概率很小,所以瓶颈在于‘共和’,‘共和’的概率没有‘支撑’、‘撑着’大,这里阈值要小心设定,使得‘共和国’这一类可以出线,但是‘支撑着’不能出线)。

2、切分阶段

林心如,和,易烊千玺,支撑着,共和国,各项目,的,顺利,进展。

3、回溯阶段

‘支撑着’和‘各项目’会被删除掉。所以在这句话里,发现的词就是:

林心如,和,易烊千玺,共和国,的,顺利,进展。

四、基于规则的方法

1、一些常见的组合规则

先对文本进行分词,余下未能成功匹配的片段(分词后的中文、连续的数字、连续的英文)就是新词。

例子1:内饰方面,两款新车配色上采用了全新的赭黑内饰

分词1:['内饰', '两款', '新车', '配色', '采用', '全新', '赭', '黑', '内饰']

对于例子 1,可以将分词后的单个字作为未成功匹配片段,例如示例 1 中的“赭黑”,jieba 分词后得到 [“赭”, “黑”],将这连续的两个单字整合到一块,即可获得新词“赭黑”。

但如果仅仅只将单个字作为未成功匹配片段,则会漏掉较多的新词,见下方问题 2。

【问题 2】:新词中包含词语怎么办?例如“人艰不拆”,使用 jieba 分词得到 [“人艰”, “不”, “拆”],此时的未成功匹配片段就不全是单字。

对于问题 2,我们可以找一份常用词表(该词表要尽可能齐全),然后借助这份词表去过滤分词后得到的常用词,最后余下的就是新词。假设“人艰”不在常用词表中,那么过滤后仍会留下 [“人艰”, “不”, “拆”],此时我们就可以将这些连续的片段进行整合,得到“人艰不拆”。但这样就完美了吗?没有,还有不少遗漏的新词,见下方问题 3。

【问题 3】:如果新词中包含的词语在常用词表中该怎么办?该问题相当于在问题 3 的基础上提出了——新词中包含常用词语。例如“一带一路”,使用 jieba 分词可得到 [“一带”, “一路”]。而对于问题 3 则比较难处理,需要更多繁复的规则去做后处理。

通过上述的分析,可以知道传统的方法存在许多的掣肘。

2、根据特定语料设计特定的正则表达式进行规则抽取

举例

如上图所示,某些文章有特殊的表达方式,比如顿号(、)前后的词语通常会是专有名词,正是我们需要的新词。可以通过编写正则表达式的方式,从文章中将这些内容抽取出来,并依据相应的规则作清洗和过滤。

【优点】:新词挖掘的效果非常好,像“支持CarPlay+CarLife双机互联”这一类夹杂中文、英文和标点符号的词语(短语)也能抽取出来。

【缺点】:人工成本高,领域限定。与领域、特定类型、出版社、渠道耦合过深,无法将建立的规则库、专业词库以及模式库迁移到其他领域中,需要根据领域内容重新搭建。无论是搭建还是后续的维护,都需要大量的人工成本。

五、有监督统计方法

第2节和第3节提到的都是无监督统计方法,即不需要标注去学习。

而有监督方法利用标注语料,将新词发现看作分类或者序列标注问题:

基于文本片段的某些统计量,以此作为特征训练二分类模型,如SVM;

基于序列信息进行序列标注直接得到新词,或对得到的新词再进行判定,如HMM、CRF。

缺点:获取大量的标注语料数据是非常困难。

所以,我们需要不依赖于任何已有的词库、分词工具和标注语料,仅仅根据词的共同特征,利用统计策略将一段大规模语料中可能成词的文本片段全部提取出来,然后再利用语言知识排除不是新词语的“无用片段”或者计算相关度,寻找相关度最大的字与字的组合。最后,把所有抽取得到的词和已有的词库进行比较,就能得到新词。

六、更多的尝试

1、尝试挖掘更多的统计量;

2、设计一套无监督的评估指标;

上一篇下一篇

猜你喜欢

热点阅读