新词发现方法调研

一、苏神系列

  • 【未登录词】

    没有被收录在分词词表中但必须被切分出来的词, 包括各种专有名词(人名、地名、企业名、机构名等)、 缩写词、网络新词以及新增词汇等。(参考:张剑锋.规则和统计相结合的中文分词方法研究.[硕士学位论文].太原:山西大学,2008.)

  • 【频数(Frequency)及概率(Probavility)】

    一个文本片段在文本中出现的频率。文本片段出现的概率:eg.在24万字的数据中,“电影”一共出现了2774次,出现的 概率P(“电影”)约为2774/(24w-1)=0.01155;“院”字出现了4797次,出现的概率P(“院”)为4797/24w=0.01998。

  • 【凝固度】

    也叫做点间互信息(Pointwise Mutual Information),表示一个文本片段的凝合程度,其中P(x)表示文本片段x在整个语料中出现的概率,因此凝固程度的计算公式为:

 

    如果x和y的出现完全随机,那么PMI=1;如果x和y同时出现的概率,大于完全随机,那么PMI>1。PMI越大,说明这两个词经常出现在一起,意味着两个词的凝固程度越大,其组成一个新词的可能性也就越大。例如“电影院”三字可以由“电影”和“院”凝合或者“电”和“影院”凝合,Matrix67取其所有PMI最小值(去掉log)作为内部凝固度。

 

  • 【信息熵(Information Entropy)】

    反映知道一个事件的结果后平均会给你带来多大的信息量。若一个结果发生的概率为P,当你知道它确实发生了,你得到的信息量就被定义为-log(p),因此P越小你得到的信息量就越大。

  • 【自由度(Freedom)】

    也叫做左右信息熵(Information Entropy),指文本片段的自由运用程度:左邻字信息熵和右邻字信息熵中的较小值。

 

    例如“被子”,可以在前面加上一个字成为“进被子”、“盖被子”、“好被子”、“这被子”、“掀被子”等等,其左邻词的熵很大;但“辈子”搭配较为固定,除了“一辈子”、 “这辈子”、“上辈子”、“下辈子”,基本就不能加上其他字了,其左邻词的熵较小。文本的运用程度是判断文本片段是否成词的重要标志。如果一个文本片段能够成词,一定具有非常丰富的左邻字集合和右邻字集合,其成为一个独立的词的可能性也就越大。

  • 【网络经验公式】

    (30M文本,字母n表示n-gram即相关新词包含的字数):词频>200,凝固度>10 ( n − 1 ) 10^{(n-1)}10 (n−1) ,自由度>1.5;词频>30, 凝固度>2 0 ( n − 1 ) 20^{(n-1)}20 (n−1)也能发现很多低频的词汇。

    算法思想来源:Matrix67.com. (Oct. 26, 2015). 《互联网时代的社会语言学:基于SNS的文本数据挖掘》[Blog Post]. Retrieved from http://www.matrix67.com/blog/archives/5044

    算法流程:把语料文本视作一整个字符串,并对该字符串的所有后缀按字典序排序,在内存中存储这些后缀的前d+1个字或者只存储它们在语料中的起始位置提高效率,对文本进行字频和字数统计后,根据候选词语的最大字数min_sep生成所有可能的候选词,随后统计候选词频进行过滤,再计算凝固度,根据最小凝固度min_support进行过滤。接下来, 从头到尾扫描一遍算出各个候选词的频数和右邻字信息熵,将整个语料逆序后重新排列所有的后缀,再扫描一遍后统计出每个候选词的左邻字信息熵,从而进行自由度 计算并根据min_s过滤产生较大信息熵的候选词,最后输出排序并且长度大于n字的新词。

    总结:采用频数、凝固度、自由度进行筛选,效率O(nlogn)。

    参考Code1:https://github.com/fzibin/New_word_discovery,包含反作弊新词发现和短语提取。

    参考Code2:https://github.com/actank/new_words_find,新词发现/未登录词识别。

  • 苏剑林. (Aug. 18, 2016). 《【中文分词系列】 2. 基于切分的新词发现 》[Blog post]. Retrieved from https://kexue.fm/archives/3913

    算法流程:由于文本片段的凝固度大于一定程度时,片段的可能成词,然后考虑自由度,那么如果文本片段的凝固度低于一定值,则该文本片段不成词,则可以进行分词。设a、b是语料中哄相邻两字,统计(a, b)成对出现的次数#(a, b),继而估计它的频率P(a, b),分别统计a,b出现的次数#a、#b,然后估计它们的频率P(a)、P(b),判断 P(a, b) / [P(a)*P(b)] < α(α是给定的大于1的阈值),则在语料中将这两个字断开,实施对原始语料初步的分词,完成分词后统计词频,根据词频进行筛选。(只用了频数和凝固度,去掉了计算量最大的自由度,计算凝固度时只需要计算二字片段的凝固度,但理论上能够得到任意长度的词语。但凝固度不高的词语在α太大时会导致切错。)

    优缺点:速度快,但词很粗糙,只用了频数和凝固度,去掉了计算量最大的边界熵,计算凝固度时只需要计算二字片段的凝固度,但理论上能够得到任意长度的词语,但凝固度不高的词语在α太大时会导致切错。

  • 苏剑林. (Sep. 12, 2016). 《【中文分词系列】 5. 基于语言模型的无监督分词 》[Blog post]. Retrieved from https://kexue.fm/archives/3956

    总结:结合语言模型和贝叶斯概率,强大但受到viterbi等限制。

  • 苏剑林. (Mar. 06, 2017). 《【中文分词系列】 7. 深度学习分词?只需一个词典! 》[Blog post]. Retrieved from https://kexue.fm/archives/4245

    总结:带词频的词表根据规则生成句子进行预标注作为训练数据,使用LSTM模型结合viterbi算法,通过动态规化来输出最后的结果。最终的模型在backoff2005的评测集上达到85%左右的准确率(backoff2005提供的score脚本算出的准确率)。

  • 苏剑林. (Mar. 11, 2017). 《【中文分词系列】 8. 更好的新词发现算法 》[Blog post]. Retrieved from https://kexue.fm/archives/4256

    代码:苏剑林. (Sep. 09, 2019). 《重新写了之前的新词发现算法:更快更好的新词发现 》[Blog post]. Retrieved from https://kexue.fm/archives/6920

    Github地址:https://github.com/bojone/word-discovery

    优化代码:https://github.com/Chuanyunux/Chinese-NewWordRecognition

    Kenlm预训练及使用方法:https://github.com/mattzheng/py-kenlm-model

    算法流程:

      Step1.统计​,选取某个固定的n,统计2grams、3grams、…、ngrams,计算他们的内部凝固度,只保留高于某个阈值的片段,构成一个集合G;这一步,可以为2grams、3grams、…、ngrams设置不同的阈值,不一定要相同,因为字数越大,一般来说统计就越不充分,越有可能相同,所以字数越大,阈值要越高。

      Step2.切分,​用上述grams对语料进行切分(粗糙的分词),并统计频率即统计分词结果,跟第一步的凝固度集合筛选没有交集,筛选出高频部分。切分的规则是,只要一个片段出现在前一步得到的集合G中,这个片段就不切分,比如“各项目”,只要“各项”和“项目”都在G中,这个时候就算“各项目”不在G中,那么“各项目”还是不切分,保留下来。

      Step3.回溯​,例如因为“各项”和“项目”都出现在高凝固度的片段中,所以第二步中不会把“各项目”切开,但并不希望“各项目”成词,因为“各”跟“项目”的凝固度不高,所以通过回溯,把“各项目”移除。

      总结:电力专业领域词汇挖掘竞赛数据的无监督挖掘,主要与基准做对比得到差集再聚类后处理。

二、主要方法

  1. 规则/概率/信息熵(如苏神基于分词的新词发现等)

      1)TextRank关键词提取、关键短语提取、摘要提取:https://www.letiantian.me/2014-12-01-text-rank/,https://github.com/letiantian/TextRank4ZH

      2)TopWORDS(On the unsupervised analysis of domain-specific Chinese texts,Apriori+EM+动态规划得到词典排序结果):https://baijiahao.baidu.com/s?id=1622711692639477068&wfr=spider&for=pc,https://github.com/qf6101/topwords

  1. 序列标注/实体识别+规则(如苏神基于分词的新词发现)。
  2. 候选词+分类器:基于SVM和特征相关性的微博新词发现研究_韩修龙.pdf、基于古汉语语料的新词发现方法。

三、工具

  1. SmoothNLP:https://github.com/smoothnlp/SmoothNLP
  2. HarvestText:包括 底层 分词、文本清洗、实体链接、实体识别、新词发现、拼音纠错、别名识别, 上层任务:情感分析、文本摘要、事实抽取、问答。github 链接:https://github.com/blmoistawinde/HarvestText
  3. jiagu自然语言处理工具:包含多种NLP下游任务,包括中文分词、词性标注、命名实体识别、知识图谱关系抽取、关键词提取、文本摘要、新词发现、情感分析、文本聚类:https://github.com/ownthink/Jiagu,可直接调包。
  4. Transformer:

      开天-新词,中文新词发现与校对工具:https://zhuanlan.zhihu.com/p/94486848,https://github.com/DenseAI/kaitian-xinci

      keras-transformer:https://github.com/kpot/keras-transformerhttps://github.com/GlassyWing/transformer-word-segmenter

   5. 基于C++的新词发现,速度更快:https://github.com/Lapis-Hong/fast-xinci

   6. 自行进行的尝试:https://github.com/XjCaoer/NWD

posted @ 2021-05-24 11:46  Caoer199  阅读(1164)  评论(0编辑  收藏  举报