短语挖掘(PhraseMining)的目的在于从大量的文本语料中提取出高质量的短语,是NLP领域中基础任务之一。短语挖掘主要解决专业领域的专业词典不足的问题,减少人工整理成本,如图所示PhraseMining在以下几个任务中非常重要。
jieba分词是中文分词领域比较好的工具[1,2],其在分词时使用的方法是根据已统计的词库,利用前缀词典对句子切分,根据所有切分的结果构建有向无环图的方式寻找最优的切分路径。对于存在未登录词其使用的方式是根据序列标注的结果,使用Viterbi算法计算最优的状态序列。从jieba分词方法中可以解决一些普适化的需求,但是对于某些特定的专业领域,需要整理一批质量较高的专业领域词典,而可用到的数据往往是大量无标注的文本。如果人工去整理成本比较高,那么是否可以通过一些方法自动提取一些高质量的短语呢?
年8月“神策杯”高校算法大师赛中给出任务构建个性化推荐系统,根据上千篇资讯文章及其关键词,构建关键词提取模型提取10万资讯文章关键词。其中存在两个问题,问题一:如何抽取短语词,直接使用jieba,可能很多新的网络用语或者专业词汇无法提取。问题二:如何对抽取的短语进行排序选择TopK关键词。
同年在年10月“AIIA”杯-国家电网-电力专业领域词汇挖掘比赛中给出任务整理电力行业专用词汇,电力行业积累了大量的文本数据,这些数据包括电力科技论文,项目报告,电力操作手册等等,根据这些无标注数据挖掘一些特定领域内的词汇,整理一份电力行业主题词典。
丁香园大数据团队中也存在这样的问题,每天都会产生大量的文本数据,例如论坛文本,医学论文,诊断报告等等,抽取的高质量的短语可以用于优化检索内容,并且可以优化taxonomyconstruction构建上下位的层次结构等等如下图所示,相对taxonomyconstruction更多了解,移步到知识图谱构建技术综述与实践,因此抽取高质量短语将是目前要解决的重要问题。
无监督抽取方法在早期,丁香园log数据汇总时发现,很多疾病词和症状词来源于一些特定词的排列组合,比方说牛奶过敏,急性鼻炎,是一些NN和形容词/动词的组合,其实就是浅层句法分析的结果,例如:"新生儿急性鼻炎应该如何治疗",coreNLP给出的结果如下图所示:
其中新生儿急性鼻炎是一个名词短语(NP),是由NN+JJ+NN组成的,因此传统的方式是根据POS规则模版[3]对phrase进行提取,但是实际操作中存在一些问题,如果直接使用corenlp的浅层句法分析的结果并不是很好,比方说"如何治疗花粉过敏"这句话中的Phrase应该是花粉过敏,但是治疗和花粉合并成了动词短语。但是如果要穷尽所有的POSpattern,并不是一件容易的事情,而且pattern之间可能会存在一些冲突,于是pattern之间排序又成了另一个坑。
年Matrix67提出了《互联网时代的社会语言学:基于SNS的文本数据挖掘》一种基于统计学角度的新词挖掘算法,通过计算凝固度和左右临字信息熵抽取新词,效果不错
《西游记》抽取结果如下所示:
行者,八戒,师傅,三藏,大圣,唐僧,沙僧,和尚,菩萨,怎么,长老,老孙,两个,甚么,国王,徒弟...
《资本论》抽取结果:
资本,生产,价值,劳动,商品,货币,部分,工人,形式,价格,利润,我们,作为,剩余价值,过程...
抽取的效果不错。于是试一试丁香论坛的医患对话日志,看看用这个方法抽取一些用户俗语之类的。
可以,如果,治疗,需要,医生,情况,建议,检查,什么,这个,问题,现在,症状,目前,或者,医院...
去停用词后,也是会找到一些靠谱的词汇比方说肝硬化,肝癌,拉肚子,大便不成型,痔疮出血,红色小疙瘩...,会发现存在两个问题:
对出现频率低的短语不是很友好,很有可能被阈值过滤掉;
人工给定阈值,没有一个很好的参照标准,数据中可能会存在很多的噪音,无法较好的筛选出有用的短语。
年韩家炜团队的学生AhmedEl-Kishky提出一种基于频繁模式挖掘和统计的方法TopMine,无监督的对语料进行PhraseMining。这项工作的主要目的是对文本进行主题挖掘,在这篇论文中将主题挖掘分为两个步骤,第一步根据PhraseMining抽取的结果对文本进行分割,第二部根据分割后的文本约束Topic模型。
在PhraseMining中,根据上下文信息衡量合并后的score,判断是否对token进行合并,伪代码如下所示:
通过给定阈值的方式进行迭代,其中score作为判断合并条件计算公式如下所示:
其举了一个很有意思的例子,比方说:MarkovBlanketFeatureSelectionforSupportVectorMachines这句话来说如果只根据Vector可能只会把文章划分为数学或者物理Topic中,但是显然SupportVectorMachines是一个整体,根据支撑向量机可以将其划分为计算机的主题下:
KavitaGanesan年提出《HowtoincorporatephrasesintoWord2Vec–atextminingapproach》和年苏神给出了一个无监督挖掘方案《分享一次专业领域词汇的监督挖掘》有相似之处,只不过苏神再基础上加入一些平行语料,根据停用词确定phrase边界,用PMI等设定阈值方式抽取新词,进行分词,并构建词向量模型。选取一些种子词汇作为初始词,根据抽取新词的词向量计算种子词之间的相似度,设定阈值的方式将相似度高的词加入到候选集中,对于无监督短语挖掘是一种比较新颖的思路,因为词向量包含丰富的上下文语义信息,通过上下文信息计算相似度,将新词进行聚类,这种方式可以较好的筛选出一些高质量的phrase。但是在第一步分词时,根据阈值所发现的新词边界不好控制,会存在大量噪音,比方说,在《西游记》中会抽取出,行者笑道,那妖精,的和尚等词汇,所以在最后一步需要加入了一些规则进行过滤。
弱/远程监督抽取方法韩家炜团队关于PhraseMining团队的三部曲,刚才已经简单的介绍了其中之一TopMine,其主要目的是对语料库中的文本Topic进行挖掘,其中利用PhraseMining的方法对文本进行分割。其另外两部SegPhrase和AutoPhrase分别使用弱监督和远程监督的方式对phrase进行抽取并进行质量监测。
SegPhrase韩教授的学生刘佳硉认为TopMine的方法是完全无监督的,那么是不是选用一些少量的带标签的数据,可能会在很大程度上提高抽取结果。其认为高质量的短语是可以优化分词结果的,而高质量的分词结果也可以优化phrase抽取的结果,将分词和高质量短语相结合。
原始计算频率时,并没有考虑真正分词的结果,只是统计词出现的频率,例如supportvectormachine出现了在预料中出现了次,但是根据分词结果进行修正(rectified)后,其只出现了80次,同样的vectormachine修正后只出现了6次。那么vectormachine不算是一个phrase。
例如:Astandardfeaturevectormachinelearningsetupisusedtodescribe在这句话中,存在vectormachine但是根据上下文语义进行分词时,其分词结果应该是featurevector和machinelearning
于是接下来的工作中,根据频繁短语监测生成短语候选集,再根据人工筛选出的高质量的短语使用RandomForest构建分类器模型,实验中发现选择-个数据就可以满足分类结果。其中特征选取如下表所示:
这篇论文在当时的效果不错,但是存在一个缺点,文中说个标记词汇足矣,那么这个标记数据应该如何选取?需要人工的去选择一些高质量的短语去构造分类器,如果在一些特定的领域则需要一些专业领域人士对领域内的数据进行筛选。所以韩教授的学生商静波提出了一种远监督方法AutoPhrase自动的对短语进行挖掘。
AutoPhrase年韩教授的学生商静波提出一种远程监督的方法进行PhraseMining,AutoPhrase使用wiki或Freebase等数据构建高质量词典,代替SegPhrase人工打标签的过程。其在技术上以下两个创新点。
RobustPositive-OnlyDistantTraining:使用wiki和freebase作为显眼数据,根据知识库中的相关数据构建PositivePhrases,根据领域内的文本生成NegativePhrases,构建分类器后根据预测的结果减少负标签带来的噪音问题。
POS-GuidedPhrasalSegmentation:使用POS词性标注的结果,引导短语分词,利用POS的浅层句法分析的结果优化Phraseboundaries。
如上图所示,根据frequentn-gram抽取phraseCandidates根据远程监督的方式,根据wikipedia进行过滤筛选出PositivePool和NoisyNegativePool,对于PositivePool来说,其信源比较准确,于是PositivePool的抽取结果肯定是置信度极高的,而NegativePool是存在噪音的,因为可能有一些Phrase不存在WikiPedia中,因此文中提到用一种集成学习的方式降低噪音。
构建多组基本的分类器,分别从PositivePool和NegativePool中随机抽取出K个candidates全部,而在负样本中存在perturbedtrainingset见图中的δ,为了尽可能低的降低训练误差的基础分类器,构建一颗未进行剪枝的决策树的方式,当在perturbedtrainingset中没有两个positive和negativephrase共享相同的特征值时,我们认为此时的决策树可以达到%的训练准确率。最后通过ranking的方式输出排序的结果。
这种方法的结果Segphrase相比有着显著的提升。
开始搞事情看了很多的方法,磨拳擦掌开始搞一个属于自己的Phrasemining了,借鉴之前的方法,发现很多都是从统计学角度构建一批先验知识,比方说计算语料中的PMI和一些KL散度等等进行抽取。但是如果获得的数据是一些短文本数据,又将如何提取这些特征呢?我们直接用AutoPhrase的方法套用?仿佛又不是很合适,首先,无法保证分词的效果;其次,stanfordPOS的浅层句法分析的结果并不适用于所有领域,比如花粉过敏。
根据丁香园本身的业务需求和之前提到的一些方法对特征和分类器模型进行了修改,并没有使用stanford提供的浅层句法分析的结果,而是根据知识库目前现有的一些医疗数据构建了n-gram模型作为特征,再借鉴远监督的方式根据知识库中已有的词库数据,进行词性标注,统计词性标注的结果作为特征,再根据bert构建的字向量作为分割的特征。
同样类似于AutoPhrase的方式构建数据集,PositivePool中的数据来源于目前知识库已有的医疗数据,NegativePool中的数据来自N-gram随机选取的非库中的数据,再根据一些规则和N-gram的概率等阈值信息简单的过滤了一些负样本中的脏数据。使用gbdt(GradientBoostingDecisionTree)构建分类器模型。
目前抽取效果如下所示:
在抽取结果中可以看到,一句话中可以抽取多个phrase,对于分词来讲,不同方式组合phrase会生成不同的分词格式,根据score阈值进行过滤,根据phrase抽取结果,查询所有的抽取组合,根据组合结果不同,通过phrase长度和个数进行约束,公式如下所示:
下图为最后输出排序的结果:
总结本文调研了关于PhraseMining构建的方法是为了解决在特定专业领域中存在未登录词和个性化分词问题,PhraseMining只是将非结构化文本转化为半结构化文本的第一步。之后需要在其基础上进行实体链接和知识图谱的构建。PhraseMining可以根据数据的不断的扩充对模型不断的优化,在其优化的同时,对后续任务也有着决定性的帮助,可以优化丁香论坛的搜索,准确定位到文章的主题,同时在构建医学领域知识图谱时可以更准确的定位上下位之间的实体。
作为nlp的基础工作之一,PhraseMining的效果会直接影响到接下来的工作内容,近日看了一篇韩教授学生QiLi的论文[7]其方法是根据一些种子Pattern,一方面使用Pattern抽取实体,另一方面根据抽取实体后的句子生成新的Pattern,通过分类打分的方式筛选出优质的Pattern。联系医疗领域中的一些Phrase发现,Phrase本身也存在着一些规则,比方说:「新生儿急性鼻炎」可以映射为「特殊人群+限定性修饰词+疾病」而且在用户描述中也存在着一些Pattern比方说「如何治疗+疾病」or「疾病+该如何治疗」,所以可以借鉴这种方法解决一部分召回问题。
参考文献
1.结巴分词2--基于前缀词典及动态规划实现分词
2.结巴分词3--基于汉字成词能力的HMM模型识别未登录词
3.