点击下面卡片关注我呀,每天给你送来AI技术干货!

‍来自:丁香园大数据‍

前言

最近在优化dxy帖子召回问题,我们之前在医疗健康领域的短文本解析探索(一)提到了phrase mining 抽取粗粒度名词,在医疗健康领域的短文本解析探索(二)提到实体链接相关方案,但是用户在输入搜索内容时,很可能因为输入法或者是其他原因导致文本输入错误,最终导致搜索不到用户想要的结果降低用户体验。

在nlp领域中文本纠错是个坑,不能说是深坑,也就是个万丈深渊吧...????,因为目前没有特别成熟的方法,而且用到的知识点比较繁琐,真正的应用到工业界还要考虑实际成本和效率。常见纠错内容如下所示:

- 谐音错别字:耳室症如何治疗?----耳石症如何治疗?
- 形近错别字:氨基已酸 ----氨基己酸
- 字词顺序错误:硫酸氯氢吡格雷 ---- 硫酸氢氯吡格雷
- 字词补全:右旋糖苷铁口服液 ----右旋糖苷铁口服溶液
- 中文拼写错误:aspl ---- 阿司匹林,阿斯 pi ling ----阿司匹林
- 语法错误 (Grammatical Error):Nothing is [absolute----absolutely] right or wrong
- 常识知识错误:上海同济医院内分泌代谢科主治医师[刘辉----刘光辉]

在搜索中这些确实是常见的几种错误类型,绝大多数是一些用户习惯和输入问题,我在丁香园的搜索日志中经常见到的一些有趣的搜索问题,比方说,用户想搜索阿司匹林,可能输入aspl阿斯匹林阿司匹阿司匹 lin阿斯 pi ling等奇奇怪怪的输入。

我们调研一些学术界近期的结果和工业界常规方法。做了以下简单的总结。

正文

《An Improved Graph Model for Chinese Spell Checking 》&&《A Hybrid Model for Chinese Spelling Check》

14年的一篇文章,实验用到的数据集是SIGHAN-2013[2],借鉴分词时构建DAG(Directed Acyclic Graph )的方法,因为错误句子可能会造成错误的分词结果,会导致多种分词情况,对所有切分结果的相似拼音的字/词加入到分词的DAG中,构成一个由相似词语组成的新的DAG模型。就像下面这个例子,misspelled: "假书抵万金"。其中有一个替换原则,定义一个相似词典,所有的替换按照字典相似的词进行替换。

根据新的有向无环图,去找最短路径Single Source Shortest Path(SSSP),用替换词之后最合理的分词结果,就是CSC正确的结果。但是这种方式存在两个小问题,如果说分词的时候如果是单个字,那么进行替换会变的没有意义,或者说,如果是分词之后,分出去的词也是分词词典中已有的词,就不好进行纠错,比方说“我/对/心[里 --- 理]/研究/有兴趣”,也就是说如果出错的来源是一个置信度比较高的词语时不好进行纠错,区分“他”和“她”的不同就会相对困难。

因此为解决这一问题,本文加入crf model进行预测,再加一些rule model。虽然这篇文章比较久远,但是这种 Hybrid Model 的方式确实值得借鉴。

《HANSpeller++: A Unified Framework for Chinese Spelling Correction 》

本文提出了一个HANSpeller框架进行检测和纠错,这个框架有两个主要的工作,首先对输入的句子生成可能的候选集,再对候选集进行排序,选择最好的结果作为新的句子。

在data processing阶段,将长句子根据标点切分为短句并且去掉非汉字内容,根据SIGHAN-2013,SIGHAN-2014作为外部数据构建confusion pair,用于生成候选方案之一。下一步 candidates generating 时根据句子中的字生成有限候选集,根据同音字,近音字,形近字,和一开始生成的confusion pair进行替换,因为候选集有限,只保留权重较高的替换词。替换priority weight计算公式如下(其中P(c)为其在c这个字符可能出错的概率,edit_dist 编辑距离,二者加权):

在候选结果rerank阶段,分为两次筛选和排序,初筛时用到的特征比较简单,n-gram probability,词典统计特征,编辑距离,和分词特征做逻辑回归分类预测。第二次筛选的时候用外部依赖数据,bing的搜索结果,英文翻译的结果,并且使用mi crosoft web n-gram服务计算翻译的n-gram概率。两次筛选后,保留最有可能的top5候选结果。其中一些通用的错误需要加入一些规则进行重新打分。之后用一些规则获取最终结果,比方说n-gram的概率做过滤器,不同的相似类型的候选集权重不同,confusion pair是根据大量标注数据抽取的因此权重高于同音同形等类别,之后再对长句所需要替换的个数进行约束。

这个纠错的方案特征相对比较丰富并且使用n-gram保留部分的语义信息做筛选。其相当于枚举出了所有种可能的替换方案,并且根据经过分类器进行初筛,二次筛选和规则排序选择最有可能正确的结果。

《FASPell: A Fast, Adaptable, Simple, Powerful Chinese Spell Checker Based On DAE-Decoder Paradigm 》产业界最强的简繁中文拼写检查工具

19年爱奇艺发的文章,通过DAE(denoising autoencoder) 去 fine tune BERT 的(mask language model)MLM获取候选结果,用于替代之前提到构建的confusion set。

在之前的方法中,我们需要自动构建 confusion pair set,还要给定不同来源数据权重。FASPell利用预训练模型使用DAE pre-train BERT,mask句子中每个位置的字符获取候选集,通过上下文置信度信息,和字符相似度构建了一个confidence-similarity decoder(CSD)去对句子中的每一个字符的候选集进行筛选。如果用过pycorrector[5]的话,该工具在检测到可能存在错误的字/词之后通过近音词。形近字枚举进行替换,再根据统计字典进行排序,按顺序找最优结果。

FASPell通过上下文的confidence score和字音的similarity score联合打分进行过滤,过滤条件:0.8 × confidence + 0.2 × similarity < 0.8 。

某些特定效果场景效果不错github上有源码有兴趣的同学可以去试试,我们简单的构建了一批数据,做了一些尝试,效果如下所示:

但是存在一个问题,如果连续的词出现出错,或者说同样是置信度很高的词语,纠错效果不好,就类似于第一篇文章说的“心里----心理”其confidence score同样很高。所以需要在构建数据集的时候需要下一些功夫。

《Spelling Error Correction with Soft-Masked BERT 》

2020年ACL的一篇文章,可以说是改进了原有BERT直接获取每个字的候选集的方法,将纠错任务拆分为两部分解决,Detection Network 和 Correction Network,其中Detection Network是基于Bi-GRU构建的一个二分类模型,用于预测文本出错的概率。Correction Network则是利用bert生成候选集合并打分。

Dectection Network在后续处理时有一个小细节,二分类获得的概率之后,根据概率对bert 的char embedding和mask embedding加权求和传递给Correction Network。

Correction Network则是一个基于BERT的多分类模型,其input 是检测层向量加权的结果结果。其目标函数由两部分组成,其中λ 是(0,1)之间的超参。

打造垂直领域纠错

在dxy垂直搜索中,用户输入short query经常会出现一些错误文本,导致可能无法搜索到正确的内容,也可能拿到与用户无关内容,最最常见的错误都是由于输入法带来的拼音错误、形近字,用户习惯带来的谐音错误,内容缺失和内容中有多余字符的错误。那么按照上面论文的方法,我们可以解决形近字和谐音这种同等长度的问题,但是像拼音和内容补全删除问题就不太好办了。而且还有一个问题,纠错文本的标注成本较高,而且做垂直领域纠错最好用该领域文本的标注数据效果最好。

好在我们是做医学垂直领域,那么我们就要利用好我们构建的医学知识图谱,用已有的领域实体帮我们解决这一问题,甚至还可以有效的解决一些用户对常识知识不熟悉带来的一些错误。

流程如下所示:

ps. 因为是搜索引擎纠错而非对话系统的纠错,所以我们暂时不用纠结依存句法错误。所以我们将句法问题可以暂时交给搜索中的Query扩展技术和搜索引擎。

data processing

首先我们要对输入的句子进行预处理,1.对长句子按照符号进行切分,2.实体链接获取词性和实体关系等信息。对所有的mention进行提取。

spell check

拼写检测,我们会从字词两个层面考虑,将可能错误的区间进行标注,prefix dict根据已有知识图谱中的实体信息构建的前缀字典树,尽可能的获取各mention的前缀信息。segment filter 用于标注不需要纠错的部分靠谱的实体词/和停用词等。pinyin check 检测输入是否是拼音,或者是否是实体的拼音缩写,并且正确的对拼音进行分割。bilstm+crf 根据用户搜索行为构建了一批需纠错数据集,对需纠错部分进行标注,根据bilstm+crf结果进行比对获取错误类型和可能需纠错文本。

spell correction

纠错将会从两方面考虑,一方面领域词纠错,另一方面是常用词中字粒度错误。在医疗垂直领域,依赖领域内知识,根据之前构建的知识图谱中的实体构建前缀字典树,并根据搜索日志构建常见的confusion set,并且基于DAE对需纠错词进行向量表示,其中用到了字型,拼音,上下文语义等特征作为输入层,中间隐藏层作为向量表示,根据embedding simility生成候选集合,再根据embedding cosine distance和edit distance进行联合打分进行排序过滤。

前缀树召回候选集

DAE召回候选集

常用词字粒度的纠错借鉴了上述很多方法进行融合,基于BERT fine-tune MLM生成候选,再根据common dict构建n-gram模型根据字的confusion set生成候选。最后将生成的候选集与原句子中的mention进行替换,与原句子的language model的preplexity再一次的比较。

总结

在丁香园医疗垂直领域的文本纠错实验中,我们尝试了各种各样的方法,去解决用户在使用搜索引擎带来的纠错问题。因为是搜索引擎,所以可能用到的纠错方法就相对简单一些,后续如果是用户对话逻辑上的纠错,就要踩更多的坑,比方说上下文内容补全,知识图谱推理纠错,语法纠错等等。

参考文献

[1] pycorrector https://github.com/shibing624/pycorrector

[2] Chinese Spelling Check Evaluation at SIGHAN Bake-off 2013

[3] Overview of SIGHAN 2014 Bake-off for Chinese Spelling Check

[4] Introduction to SIGHAN 2015 Bake-off for Chinese Spelling Check

[5] https://github.com/shibing624/pycorrector/blob/master/pycorrector/corrector.py

[6] An Improved Graph Model for Chinese Spell Checking

[7] A Hybrid Model for Chinese Spelling Check

[8] HANSpeller++: A Unified Framework for Chinese Spelling Correction

[9] FASPell: A Fast, Adaptable, Simple, Powerful Chinese Spell Checker Based On DAE-Decoder Paradigm

[10] Spelling Error Correction with Soft-Masked BERT

[11] https://zhuanlan.zhihu.com/p/138551957

[12] https://zhuanlan.zhihu.com/p/80781295

说个正事哈

由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方深度学习自然语言处理”,进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心

投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

记得备注呦

点击上面卡片,关注我呀,每天推送AI技术干货~

整理不易,还望给个在看!

医疗健康领域的短文本解析探索 ----文本纠错相关推荐

  1. 深度学习核心技术精讲100篇(三十九)-医疗健康领域的短文本理解

    前言 本次分享的主题为医疗健康领域的短文本理解,主要介绍在丁香园的业务场景下,短文本理解的技术实践,并讨论知识图谱技术如何在医疗健康领域的搜索推荐中落地应用,希望能够给大家的日常工作提供一些思路. 主 ...

  2. 对话系统 | (6) 医疗健康领域的短文本理解

    原文地址 分享嘉宾:杨比特 丁香园 编辑整理:叶祺 出品平台:DataFunTalk 导读:本次分享的主题为医疗健康领域的短文本理解,主要介绍在丁香园的业务场景下,短文本理解的技术实践,并讨论知识图谱 ...

  3. 近期活动盘点:智进未来:AI在医疗健康领域的应用、挑战及发展趋势

    想知道近期有什么最新活动?大数点为你整理的近期活动信息在此 智进未来:AI在医疗健康领域的应用.挑战及发展趋势 2019年9月4日 [时间]9月4日14:00-18:00 [地点]清华大学附近(报名确 ...

  4. 【白皮书分享】2021年脑机接口技术在医疗健康领域应用白皮书.pdf(附下载链接)...

    大家好,我是文文,今天给大家分享中国人工智能产业发展联盟于2021年7月份发布的白皮书<2021年脑机接口技术在医疗健康领域应用白皮书.pdf>,关注脑机接口.人工智能以及医疗健康的伙伴别 ...

  5. 蓝牙技术加速仁微电子智慧医疗健康领域的物联网应用

    从运动健身.医疗卫生,到休闲娱乐,每天有数十亿台新款低功耗蓝牙设备帮助用户摆脱连接线束缚,自由享受与世界互联的乐趣.根据<2022蓝牙市场最新资讯>显示,今年蓝牙数据传输设备的出货量将超过 ...

  6. 解决医疗健康领域的网络安全和云技术技能差距

    说明信息 近年来,网络安全事件 频发,事件造成的影响也日益增大,对于医疗健康行业,网络安全的重要性凸显.随着医疗信息化的普及,医疗设备与相关系统的安全性已经关系到医疗机构 业务的正常运营.勒索软件,拒 ...

  7. 报名 | 智进未来:AI在医疗健康领域的应用、挑战及发展趋势

    [时间]9月4日14:00-18:00 [地点]清华大学附近(报名确认后短信通知详细地址) [报名方式]扫描下方二维码或点击文末"阅读原文"报名 [指导单位] [主办单位]NVID ...

  8. 智慧医疗健康领域数字孪生应用框架

    将数字孪生应用在医疗健康系统中,可将患者的健康档案.就医史.用药史.智能可穿戴设备检测数据等信息上传至云端为患者建立"医疗数字孪生体",并在生物芯片.增强分析.边缘计算.人工智能等 ...

  9. 互联网对医疗健康领域的赋能

    帮朋友一个忙,是一家大的投行发来的面试题: 小米等互联网企业的医疗投资逻辑? 小米等互联网企业的医疗+智能家居战略布局? 互联网公司战略/产业投资对医疗行业的平台支持有什么? 1. 小米等互联网企业的 ...

  10. XCC CEO张艺凡:借助区块链解决医疗健康领域数据痛点

    区块链概念炙手可热,被视为下一代颠覆性的核心技术,医疗被认为区块链应用最有潜力的行业之一,甚至是继金融后的第二大区块链落地领域. 在数字经济时代,医疗数据也呈爆发性增长,据IDC预测到2020年全球数 ...

最新文章

  1. UA MATH563 概率论的数学基础 鞅论初步5 鞅的定义
  2. 2019-03-09-算法-进化(买卖股票的最佳时机 II)
  3. tp5.1升级指导---控制器调整 _initialize方法更改为initialize
  4. C语言第六次作业指针,c语言第六次作业解析
  5. java post 图片上传_java 发送 post 请求上传图片
  6. pythonif语句如何循环播放_python – 循环播放文本,一次3个字符
  7. jsp中JAVA代码取select值_jsp获取下拉列表select选择的值 | 学步园
  8. 高通Android平台下关于display部分的几个关键问题
  9. 一个光标绘制问题的解决过程
  10. [CruiseControl] 概念
  11. android手机误删通讯录恢复
  12. mysql 5.7 无法启动 服务没有报告任何错误
  13. ssm启动不报错_搭建ssm+maven环境,启动报错,说spring监听无法实例化,求解?
  14. alidoing --使用JS实现多语言框架、喜欢的请进、、瓦特平台!
  15. neo4j ,neo4j-desktop国内下载镜像
  16. 辽东学院计算机练习,辽东学院计算机应用基础课件.doc
  17. 小马激活工具对比暴风激活工具
  18. 白话区块链~Pow,PoS,DPos
  19. AI 诊断新算法,可提前十年查出老年痴呆症;济南酒店推行“人脸识别”,没带证件也可住店...
  20. AHCI驱动问题导致Windows 10卡死的解决办法

热门文章

  1. 【高斯消元】[JSOI2008]球形空间产生器sphere
  2. 初始化对于类与接口的异同点深入解析
  3. UIView动画设置
  4. 关于javascript中apply()和call()方法的区别
  5. 清理delphi项目文件 .bat
  6. c#的IList,IEnumerable和IEnumerator
  7. java day42【综合练习】
  8. java day34【ECMAScript 、BOM 、DOM 、事件】
  9. Python并发编程:多线程-Thread对象的其它属性和方法
  10. 前两篇转载别人的精彩文章,自己也总结一下python split的用法吧!