谈谈医疗健康领域的
丁香园大数据 NLP。发表日期: 2019-05-05
前言
短语挖掘( Phrase Mining)的目的在于从大量的文本语料中提取出高质量的短语,是 NLP 领域中基础任务之一。短语挖掘主要解决专业领域的专业词典不足的问题,减少人工整理成本,如图所示 Phrase Mining 在以下几个任务中非常重要。
jieba 分词是中文分词领域比较好的工具[1,2],其在分词时使用的方法是根据已统计的词库,利用前缀词典对句子切分,根据所有切分的结果构建有向无环图的方式寻找最优的切分路径。对于存在未登录词其使用的方式是根据序列标注的结果,使用 Viterbi 算法 计算最优的状态序列。从 jieba 分词方法中可以解决一些普适化的需求,但是对于某些特定的专业领域,需要整理一批质量较高的专业领域词典,而可用到的数据往往是大量无标注的文本。如果人工去整理成本比较高,那么是否可以通过一些方法自动提取一些高质量的短语呢?
2018 年 8 月 “神策杯”2018 高校算法大师赛 中给出任务构建个性化推荐系统,根据上千篇资讯文章及其关键词,构建 关键词提取模型 提取 10 万资讯文章关键词。其中存在两个问题,问题一:如何抽取短语词,直接使用 jieba,可能很多新的网络用语或者专业词汇无法提取。问题二:如何对抽取的短语进行排序选择 TopK 关键词。
同年在 2018 年 10 月 ** “AIIA”杯-国家电网-电力专业领域词汇挖掘比赛** 中给出任务整理电力行业专用词汇,电力行业积累了大量的文本数据,这些数据包括电力科技论文,项目报告,电力操作手册等等,根据这些无标注数据挖掘一些特定领域内的词汇,整理一份电力行业主题词典。
丁香园大数据团队中也存在这样的问题,每天都会产生大量的文本数据,例如论坛文本,医学论文,诊断报告等等,抽取的高质量的短语可以用于优化检索内容,并且可以优化 taxonomy construction 构建上下位的层次结构等等如下图所示,相对 taxonomy construction 更多了解,移步到 知识图谱构建技术综述与实践,因此抽取高质量短语将是目前要解决的重要问题。
无监督抽取方法
在早期,丁香园 log 数据汇总时发现,很多疾病词和症状词来源于一些特定词的排列组合,比方说牛奶过敏,急性鼻炎,是一些 NN 和形容词/动词的组合,其实就是浅层句法分析的结果,例如: "新生儿急性鼻炎应该如何治疗"
,coreNLP 给出的结果如下图所示:
其中 新生儿急性鼻炎 是一个 名词短语(NP) ,是由 NN + JJ + NN 组成的,因此传统的方式是根据 POS 规则模版[3]对 phrase 进行提取,但是实际操作中存在一些问题,如果直接使用 corenlp 的浅层句法分析的结果并不是很好,比方说 "如何治疗花粉过敏"
这句话中的 Phrase 应该是 花粉过敏,但是 治疗 和 花粉 合并成了动词短语。但是如果要穷尽所有的 POS pattern,并不是一件容易的事情,而且 pattern 之间可能会存在一些冲突,于是 pattern 之间排序又成了另一个坑。
2012 年 Matrix67 提出了《互联网时代的社会语言学:基于 SNS 的文本数据挖掘》一种基于统计学角度的新词挖掘算法,通过计算凝固度和左右临字信息熵抽取新词,效果不错
《西游记》抽取结果如下所示:
行者,八戒,师傅,三藏,大圣,唐僧,沙僧,和尚,菩萨,怎么,长老,老孙,两个,甚么,国王,徒弟…
《资本论》抽取结果:
资本,生产,价值,劳动,商品,货币,部分,工人,形式,价格,利润,我们,作为,剩余价值,过程…
抽取的效果不错。于是试一试丁香论坛的医患对话日志,看看用这个方法抽取一些用户俗语之类的。
可以,如果,治疗,需要,医生,情况,建议,检查,什么,这个,问题,现在,症状,目前,或者,医院…
去停用词后,也是会找到一些靠谱的词汇比方说 肝硬化,肝癌,拉肚子,大便不成型,痔疮出血,红色小疙瘩...
,会发现存在两个问题:
- 对出现频率低的短语不是很友好,很有可能被阈值过滤掉;
- 人工给定阈值,没有一个很好的参照标准,数据中可能会存在很多的噪音,无法较好的筛选出有用的短语。
2014 年韩家炜团队的学生 Ahmed El-Kishky 提出一种基于频繁模式挖掘和统计的方法 TopMine,无监督的对语料进行 Phrase Mining。这项工作的主要目的是对文本进行主题挖掘,在这篇论文中将主题挖掘分为两个步骤,第一步根据 Phrase Mining 抽取的结果对文本进行分割,第二部根据分割后的文本约束 Topic 模型。
在 Phrase Mining 中,根据上下文信息衡量合并后的 score,判断是否对 token 进行合并,伪代码如下所示:
通过给定阈值的方式进行迭代,其中 score 作为判断合并条件计算公式如下所示:
其举了一个很有意思的例子,比方说: Markov Blanket Feature Selection for Support Vector Machines 这句话来说如果只根据 Vector 可能只会把文章划分为 数学
或者 物理
Topic 中,但是显然 Support Vector Machines 是一个整体,根据支撑向量机可以将其划分为** 计算机
**的主题下:
Kavita Ganesan2018 年提出《How to incorporate phrases into Word2Vec – a text mining approach》和 2019 年苏神给出了一个无监督挖掘方案《分享一次专业领域词汇的监督挖掘》有相似之处,只不过苏神再基础上加入一些平行语料,根据停用词确定 phrase 边界,用 PMI 等设定阈值方式抽取新词,进行分词,并构建词向量模型。选取一些种子词汇作为初始词,根据抽取新词的词向量计算种子词之间的相似度,设定阈值的方式将相似度高的词加入到候选集中,对于无监督短语挖掘是一种比较新颖的思路,因为词向量包含丰富的上下文语义信息,通过上下文信息计算相似度,将新词进行聚类,这种方式可以较好的筛选出一些高质量的 phrase。但是在第一步分词时,根据阈值所发现的新词边界不好控制,会存在大量噪音,比方说,在《西游记》中会抽取出, 行者笑道,那妖精,的和尚
等词汇,所以在最后一步需要加入了一些规则进行过滤。
弱/远程监督抽取方法
韩家炜团队关于 Phrase Mining 团队的三部曲,刚才已经简单的介绍了其中之一 TopMine,其主要目的是对语料库中的文本 Topic 进行挖掘,其中利用 Phrase Mining 的方法对文本进行分割。其另外两部 SegPhrase 和 AutoPhrase 分别使用弱监督和远程监督的方式对 phrase 进行抽取并进行质量监测。
SegPhrase
韩教授的学生刘佳硉认为 TopMine 的方法是完全无监督的,那么是不是选用一些少量的带标签的数据,可能会在很大程度上提高抽取结果。其认为高质量的短语是可以优化分词结果的,而高质量的分词结果也可以优化 phrase 抽取的结果,将分词和高质量短语相结合。
原始计算频率时,并没有考虑真正分词的结果,只是统计词出现的频率,例如 support vector machine 出现了在预料中出现了 100 次,但是根据分词结果进行修正(rectified)后,其只出现了 80 次,同样的 vector machine 修正后只出现了 6 次。那么 vector machine 不算是一个 phrase。
例如: A standard feature vector machine learning setup is used to describe 在这句话中,存在 vector machin
但是根据上下文语义进行分词时,其分词结果应该是 feature vector
和 machine learning
于是接下来的工作中,根据频繁短语监测生成短语候选集,再根据人工筛选出的高质量的短语使用 RandomForest 构建分类器模型,实验中发现选择 200-300 个数据就可以满足分类结果。其中特征选取如下表所示:
这篇论文在当时的效果不错,但是存在一个缺点,文中说 300 个标记词汇足矣,那么这 300 个标记数据应该如何选取?需要人工的去选择一些高质量的短语去构造分类器,如果在一些特定的领域则需要一些专业领域人士对领域内的数据进行筛选。所以韩教授的学生商静波提出了一种远监督方法 AutoPhrase 自动的对短语进行挖掘。
AutoPhrase
2017 年韩教授的学生商静波提出一种远程监督的方法进行 Phrase Mining,AutoPhrase 使用 wiki 或 Freebase 等数据构建高质量词典,代替 SegPhrase 人工打标签的过程。其在技术上以下两个创新点。
Robust Positive-Only Distant Training :使用 wiki 和 freebase 作为显眼数据,根据知识库中的相关数据构建 Positive Phrases,根据领域内的文本生成 Negative Phrases,构建分类器后根据预测的结果减少负标签带来的噪音问题。
POS-Guided Phrasal Segmentation:使用 POS 词性标注的结果,引导短语分词,利用 POS 的浅层句法分析的结果优化 Phrase boundaries。
如上图所示,根据 frequent n-gram 抽取 phrase Candidates 根据远程监督的方式,根据 wikipedia 进行过滤筛选出 Positive Pool 和 Noisy Negative Pool,对于 Positive Pool 来说,其信源比较准确,于是 Positive Pool 的抽取结果肯定是置信度极高的,而 Negative Pool 是存在噪音的,因为可能有一些 Phrase 不存在 WikiPedia 中,因此文中提到用一种集成学习的方式降低噪音。
构建多组基本的分类器,分别从 Positive Pool 和 Negative Pool 中随机抽取出 K 个 candidates 全部,而在负样本中存在 perturbed training set 见图中的δ,为了尽可能低的降低训练误差的基础分类器,构建一颗未进行剪枝的决策树的方式,当在 perturbed training set 中没有两个 positive 和 negative phrase 共享相同的特征值时,我们认为此时的决策树可以达到 100% 的训练准确率。最后通过 ranking 的方式输出排序的结果。
这种方法的结果 Segphrase 相比有着显著的提升。
开始搞事情
看了很多的方法,磨拳擦掌开始搞一个属于自己的 Phrase mining 了,借鉴之前的方法,发现很多都是从统计学角度构建一批先验知识,比方说计算语料中的 PMI 和一些 KL 散度等等进行抽取。但是如果获得的数据是一些短文本数据,又将如何提取这些特征呢?我们直接用 AutoPhrase 的方法套用?仿佛又不是很合适,首先,无法保证分词的效果;其次,stanford POS 的浅层句法分析的结果并不适用�
- 原文作者:知识铺
- 原文链接:https://geek.zshipu.com/post/%E4%BA%92%E8%81%94%E7%BD%91/%E8%B0%88%E8%B0%88%E5%8C%BB%E7%96%97%E5%81%A5%E5%BA%B7%E9%A2%86%E5%9F%9F%E7%9A%84/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com