Macropodus 新词发现详解(new word discovery, python3)

一、Macropodus简介

        Macropodus自然语言处理工具(Albert+BiLSTM+CRF) 拥有中文分词 命名实体识别 新词发现 关键词 文本摘要 计算器 中文

数字阿拉伯数字转换等算法,其中,新词发现(newword discovery)是一个重要的功能,对于一个通用的自然语言处理工具来说。

        github地址: https://github.com/yongzhuo/Macropodus

 

二、新词发现概述(New-Word-Discovery)

        什么是新词发现,感觉这个问题有着显然易见的答案,“新时代互联网上的流行词(组)?”,“未出现在词典的其他成词?”,又或者“特定领域的专业词?”,这似乎难以描述得清楚,百科里也是解释得不清不楚的。

        过往的历史究竟难以考究,我们可以通过“中文信息处理中的分词问题”、“中文分词十年回顾”、“中文分词十年又回顾”等论文的历史变迁中寻找答案。首先要定义一个概念,我们可以从“为什么”开始,那么最开始是为了解决什么问题呢?——分词,显而易见是分词。进入到九十年代,基于词典得分词效果已经很不错了,最大分词/最小分词/正向分词/逆向分词/双向分词等,已经能够达到不错的效果,mmseg更是基于统计的分析方法总结出了四条至今仍然广泛使用的切词规则,达到了很好的分词效果。但是,基于词典的分词快则快,却是有一个严重的缺陷,那就是不能解决歧义问题和未登录词问题(词典以外的词)。

        二十世纪末二十一世纪初,计算机算力迅猛发展,有监督的机器学习开始兴起,尤其是开发出了基于序列标注(如BIO标注法)的分词方法,使得机器能够从少量的标注语料中,学习到语言的内在及结构特征,自动化地分词。“2003年Bakeoff 数据上的评估结果表明 ,未登录词造成的分词精度失落至少比分词歧义大 5 倍以上”。这一时期的SVM、HMM、CRF等算法表现惊人,尤其是基于字和条件随机场(CRF)的序列标注方法,对未登录的词识别效果很好,无论是工业成熟的HanLP,还是哈工大的LTP,抑或是清华北大的Thulac、Pkuseg,条件随机场(CRF)都在发挥着不可替代的作用。

       进入互联网时代,尤其是移动互联网时代,随着互联网,手机,人工智能等技术的发展,中文分词发生了天翻地覆的变化,无论目标任务、无论技术工具、无论场景逻辑,如搜狗基于搜索引擎的拼音输入法,如科大讯飞语音输入法与纠错,又如人人网的热点事件追踪与分析。这一时期,是大数据、云计算与深度学习的天下,人人网Matrix67基于信息熵的新词发现算法(词丰度和凝固度),深度学习Bi-LSTM+CRF算法等。

        讲了这么多,我们可以把新词发现看成是不同分词粒度的组合词(更大粒度);或者是新形式、新语义词(互联网新词);抑或是新领域新行业的词语(新产业)。

 

三、新词发现算法

        新词发现算法,我们可以看成大致是构建词典的过程(词典不存在的时候)。

        新词发现算法,一般有两种应用广泛的方法:

                1.  Jieba的HMM基于字的BMES标注法;

                2.  matrix67的基于信息熵的无监督算法。

        3.1  基于字和HMM的BMES标注法(以Jieba为例)

               如果切的是连续几个字,且由字组成的词不在词典里,则运行隐马尔可夫模型(HMM)。该HMM模型使用的训练语料是         1998年人民日报标注语料训练的。

              此外,苏剑林版【中文分词系列】 3. 字标注法与HMM模型(该中文分词系列很不错,值得一看),是无训练语料下,         使用词频字典构建发射概率矩阵,  使经验构建 BMES 状态转移矩阵,也能达到不错的效果。

        3.2  matrix67的基于信息熵的无监督算法

                matrix67的基于信息熵的无监督算法参考的指标有如下三个:

                      词频 [ tf ]

                      左右熵 [ ∑(-p * log p)]

                      凝固度 [ p(abc) ÷ (p(a) * p(b) * p(c)) ]

                 说明: 词频,这个简单,词语(n-gram)的出现的次数(频率, 会除以总数);

                          左右熵,即成词的丰度,词的左(右)边所有词的熵(一般只用单个字);

                          凝固度,内部凝固程度,字(词)一起出现的概率(可以用单个字和其他的词, 也可以用所有的字);

        3.3  基于信息熵的改进算法

            3.3.1  SmoothNLP版信息熵算法

                    SmoothNLP工具的新词发现算法,主要是改进matrix67算法的左右熵计算方式,一般左右熵的计算方式是                              取最小值min(entropy_left, entropy_ringht), 或者是求平均(entropy_left + entropy_ringht) / 2;SmoothNLP则是

            改成 L(w) = (LR * e^ LL + LL * e^ LL) ÷ | LL - LR|。

            凝固度PMI改成AMI, AMI = PMI ÷ len_word(词语长度)。

            总得分计算为: score = L(W) + AMI

            此外,另外一点不同之处是过滤条件,SmoothNLP工具的过滤条件是成词的第一个字的次数不小于16(最后的新词里边),

            这个有一点儿像成词的丰度了,不过像"的公司"这种还是没法过滤。

          3.3.2  bojoe版信息熵算法

                  苏剑林(bojoe)版信息熵算法又有所不同,是一种反向思维。为了减少计算量,只计算频率和凝固度。其中,凝固度的

          判别方法为 过滤 PMI 小于 α 的。

         3.3 其他新词发现算法

               3.3.1 基于word2vec的无监督算法

                      地址在【中文分词系列】 5. 基于语言模型的无监督分词,word2vec词向量训练使用的是Word+Character

               +Ngram,即取的是1-4的n-gram。然后使用语言模型,即维特比解码,求取最大概率的那条路径,则是最佳分词结果。

               这里使用的还是基于字的HMM标注法,主要是概率使用了词向量的。最后,最佳分词结果不在词典的,便是新词。

               3.3.2 基于n-gram凝固度的新词发现算法

                       地址在【中文分词系列】 8. 更好的新词发现算法,主要是考虑多字(成词大于等于3的词语),使用凝固度判断是否

               构成新词。score = min( p(abc) / (p(a) * p(bc), p(abc) / (p(ab) * p(c))。

 

四、Macropodus工具的新词发现算法

        Macropodus工具的新词发现算法主要也是采用信息熵,详见: 

        https://github.com/yongzhuo/Macropodus/blob/master/macropodus/segment/word_discovery/word_discovery.py

       不同点在于:

            1. 最后得分计算为 score = 词频 * 左熵 * 右熵 * 凝固度 * 左右熵和凝固度的综合(1);

            2. 过滤(filter),如果成词的左(右)边第一个字为停用词,则降低权重,左右熵降低len_word(成词长度)被,凝固度降低为                        len_word(成词长度)的 len_word(成词长度)次方倍;

            3. 左右熵的计算方式是 [ ∑(-p * log p)],但是 p 只取成词左(右)边的第一个字;

            4. 凝固度的计算方式为: [ p(abc) ÷ (p(a) * p(b) * p(c)) ]

            5. 左右熵和凝固度的综合(1)为:

        lambda_3 = lambda m1, m2: math.log((m1 * math.e ** m2 + m2 * math.e ** m1 + self.eps) / (abs(m1 - m2) + 1), 10)

                其目的是均衡考虑左熵,右熵 和 凝固度等。

 

希望对你有所帮助!

 

 

 

 

你可能感兴趣的:(Macropodus,自然语言处理,算法)