纠错是从互联网起始时就在一直解决的问题,但是一直作为一些重要技术的辅助、附属功能而默默无闻,譬如搜索引擎、譬如火热的智能写作等。
素质整理!
中文文本纠错任务,常见错误类型包括:
- 谐音字词,如 配副眼睛-配副眼镜
- 混淆音字词,如 流浪织女-牛郎织女
- 字词顺序颠倒,如 伍迪艾伦-艾伦伍迪
- 字词补全,如 爱有天意-假如爱有天意
- 形似字错误,如 高梁-高粱
- 中文拼音全拼,如 xingfu-幸福
- 中文拼音缩写,如 sz-深圳
- 语法错误,如 想象难以-难以想象
目前来看,纠错算法分为两个方向:基于规则、深度模型
规则的解决思路
中文纠错分为两步走,第一步是错误检测,第二步是错误纠正;
错误检测部分先通过结巴中文分词器切词,由于句子中含有错别字,所以切词结果往往会有切分错误的情况,这样从字粒度和词粒度两方面检测错误, 整合这两种粒度的疑似错误结果,形成疑似错误位置候选集;
错误纠正部分,是遍历所有的疑似错误位置,并使用音似、形似词典替换错误位置的词,然后通过语言模型计算句子困惑度,对所有候选集结果比较并排序,得到最优纠正词。
深度模型的解决思路
端到端的深度模型可以避免人工提取特征,减少人工工作量,RNN序列模型对文本任务拟合能力强,rnn_attention在英文文本纠错比赛中取得第一名成绩,证明应用效果不错;
CRF会计算全局最优输出节点的条件概率,对句子中特定错误类型的检测,会根据整句话判定该错误,阿里参赛2016中文语法纠错任务并取得第一名,证明应用效果不错;
seq2seq模型是使用encoder-decoder结构解决序列转换问题,目前在序列转换任务中(如机器翻译、对话生成、文本摘要、图像描述)使用最广泛、效果最好的模型之一。
那么笔者最近刚刚听了百度的纠错算法框架,就把听到的和之前收集到的一些材料整理如下。
百度智能纠错技术
可参考百度纠错开放平台:
https://ai.baidu.com/tech/nlp/text_corrector
百度智能纠错体系:
常见错误分三类:
百度纠错的整体框架:
其中核心的关键步骤为:
1 错误检测:
先定位,一句话中哪些可能是错误的!
2 候选召回
步骤为,输入句子,然后检测句子中可能的错误点,根据两者在亿级别的数据上进行文本召回,候选对齐
3 纠错排序
召回了一堆,应该怎么选,W&D模型
三大核心技术
语言知识、模型
知识计算 - 关联
基于知识图谱的纠错,基于关联
知识计算 - 文本理解
意图理解之后,槽位填满了,根据槽来填错的POI
腾讯:基于语义关联的中文查询纠错框架
一个好的纠错系统能够将用户输入查询词进行纠错提示, 或者将正确结果直接展示给用户,提高了搜索引擎的智能化。
对于垂直搜索引擎,尤其是比较小的垂直apps,如何进行查询纠错,文献中基本没有探讨过. 普遍做法是,使用商业搜索引擎中网页搜索训练的纠错模型直接作用在垂直引擎中。但是在我们调研过程中, 发现不同的垂直业务, 用户的检索目的是不一样的,从而导致纠错的也不是通用的.例如,用户输入”消星星”, 在音乐业务中, 应该纠错成一首歌曲——”小星星”; 而在游戏app分发平台上就应该纠成一个游戏app——”消灭星星”。
文献研究传统文本纠错包含两种类型:
- 一种是“单词”错误的纠错类型
- 另外一种是“词条搭配”的错误类型
早期的纠错一般是第一种,使用编辑距离进行相近查找;
第二种错误类型,通过探测query中词条的上下文搭配来判定是否存在错误,使用噪音信道和语言模型作为纠错的主要方法。例如, “peace” and “piece"在上下文"a _ of cake"中只能用"piece”。英文中也有将二者结合训练模型进行预测,进行单词字符的纠错。
语义关联在垂直app和web页面中,资源数据之间不是孤立的,而是存在着某种联系。
我们先看一些例子,音乐app中,歌手“吴俊余”演唱过歌曲“17岁的雨季”,这两个数据资源就是一种“演唱”关系;在视频app中, 电视台“湖南卫视”制作了一档娱乐节目“变形计”,这两个数据资源是一种“制作”关系。
同样的道理,音乐业务中还存在,歌手“演唱”歌曲, 歌手“发行”专辑,专辑“包含”歌曲等;在视频业务中,导演“拍摄”电影,演员“出演”电影,演员“出演”娱乐节目,导演“拍摄”电视剧等;在小说业务中,作者“创作”小说,小说“包含”主人公等。
- 定义1:资源数据——在垂直业务中,数据会分为若干的分类,每个类别中可以单独表述完整意义的词条。例如,音乐业务中,歌曲、歌手、专辑、mv、歌词这些类别覆盖的数据都是资源数据。
-定义2:数据关联——如果两个资源数据存在着某种关系,则这两个资源数据就存在数据关联。
-定义3:关联热度——两个关联资源共同被作用的频次。例如,两个被共同点击的次数,或者在web中出现在同一段话中的频次等。
关联挖掘
传统的知识图谱是由三元组(spo)组成,关联挖掘最大的差异是,只需要挖掘存在一定关系的两个数据,不需要记录非常明确的关系。大致流程如下:
一是对句子进行句法分析,从句法树中查找主语(s)、谓语(p)、宾语(o)三个部分,选取主语(s)和宾语(o)作为候选关联数据;
其次是结合垂直数据和query logs对候选进行统计,筛选频度较高的放入关联数据集合。
关联纠错在分析query logs中,发现一个有意思的现象:
很多查询串往往包含两个或多个资源片段,并且这些query错误比例很高。分析原因应该是用户输入多个片段是为了得到一条明确的结果,而不愿意拿到一个结果列表;
而错误比例较高应该是用户记忆比较模糊,希望使用两个或多个资源片段的关联关系得到明确的结果。但是如果其中一个片段或者多个片段存在错误,则结果会非常差,因为这些片段自身可能都代表一个正确的资源。
例如,视频app中query“变形记 湖南卫视”,包含两个资源片段,电影“变形记”,电视台“湖南卫视”,两个资源都是正确的,而这两个资源没有任何关系,这种情况可能存在错误,用户真正想要的是“湖南卫视”的一档娱乐节目“变形计”,正确纠错形式应该是“变形记 湖南卫视”->“变形计 湖南卫视”。音乐app中更多例子如下:
关联纠错就是使用数据之间的关联关系,对用户输入的多个资源片段判定是否存在错误,继而进行纠错处理。因为每一个资源片段可能都是正确的资源,纠错的目的是寻找多个片段的是否存在语义关联,所以这种纠错是一种新的纠错类型。
我们将整个过程分为三个步骤:
-
第一步,片段切分。将整个query切分成一些可以独立表达的语义片段,切分过程中尽量保证资源的完整性。
-
第二步,片段之间计算是否存在关联关系。如果存在关联关系则退出,否则对每个片段查找候选结果。算法使用噪音信道模型,从看到的query output(O),推测正确的候选 input(i),取得分最高的若干最为候选。
-
第三步,将每个片段的候选结果进行拼接,拼接后可能有多个串, 使用关联关系计算得分,返回得分最高的一个作为纠错结果。算法表述如下,假设一个query拆分成两个片段S1和S2对应的纠错串和算任意两两组合得分,其中u(si)、u(sj)分别代表S1和S2基于噪音信道模型计算的得分,f(si,sj)表示si和sj在关联数据中的热度,f(si)、f(sj)分别代表si和sj自身的热度。取得分最高的1组作为最终结果。
数据集合我们选取一个垂直app——QQ music来验证我们的算法,qq music是腾讯公司推出的中文最大的网络音乐平台,每天约6000w左右的搜索量。从一个月的query logs中,随机抽取3w条query,分别抓取baidu网页搜索纠错结果和自身纠错结果, 取两个纠错结果的并集共3.1k,进行人工标注,其中有200条存在关联纠错,作为实验的数据集合。
抓取baidu网页搜索的纠错结果,主要是为了对比垂直纠错框架和网页搜索纠错效果进行对比,而baidu是中文网页搜索中最权威的。
人工测评在3.1k数据集合上和网页纠错对比,召回提高了28.5%,F1提高了0.26。在200条存在关联纠错的集合上,我们的方法召回提高42.4%,F1提高了0.39.说明我们的垂直通用纠错框架(DCQC)和关联纠错算法能够明显胜出网页搜索的纠错结果,也证明了垂直业务需要搭建自身纠错系统的必要性。
Webpage vs domain (ALL data set)
Semantic Association Correction (small data set)
线上用户点击对线上流量进行随机切分三分,每一份代表一种纠错算法,使用用户的真实点击数据进行对比。为了排除排序位置的影响,只取第一条结果的点击数据进行分析。实验证明,和原始query相比,网页纠错后用户点击率提高2%,我们的框架能够提高8.4%, 效果更为明显。
中文纠错的开源项目
pycorrector
https://github.com/shibing624/pycorrector
https://shibing624.github.io/pycorrector/
本项目的初衷之一是比对、共享各种文本纠错方法,抛砖引玉的作用,如果对大家在文件纠错任务上有一点小小的启发就是我莫大的荣幸了。
主要使用了4种深度模型应用于文本纠错任务,分别是前面模型小节介绍的rnn_attention、rnn_crf、seq2seq、seq2seq_attention,每种方法单独放在文件夹中, 都可以独立运行,相互之间无依赖。
demo地址:
https://www.borntowin.cn/product/corrector/
Chinese “spelling” error correction
https://github.com/ccheng16/correction
特点:
训练的语言模型很多,根据介绍看,整体比较完善,看起来高大上。不过code跑不起来,作者没回应—–后面再改一下作者代码,看看能否跑起来。
中文单词自动纠错Cn_Speck_Checker
https://github.com/PengheLiu/Cn_Speck_Checker
简介:
针对医学数据训练出来的,基于编辑距离,可自行训练–效果一般,统计词频和共现信息,不太完善,返回大量candidates
特点:
· 人们通常越往后字打错的可能越大,因而可以考虑每个字在单词中的位置给予一定权重,这中方法有助于改进上面的第一种“传然”- "虽然"的情况;
· 考虑拼音的重要性,对汉语来讲,通常人们打错时拼音是拼对的,只是选择时候选择错了,因而对候选词也可以优先选择同拼音的字。
京东:简易的中文纠错和消歧
https://github.com/taozhijiang/chinese_correct_wsd
京东客服机器人语料做的中文纠错–更接近我们的应用场景,主要解决同音自动纠错问题,比如:
对京东新人度大打折扣 – > 对京东信任度大打折扣
我想买哥苹果手机 纠正句:我想买个苹果手机
但代码四年未更新,目前跑不起来。
Autochecker & autocorrecter for chinese
https://github.com/beyondacm/Autochecker4Chinese
单词、短句效果:5/13 效果差
速度:2.860311 all , 0.220023 avg; with print
可扩展性:词典可扩展,不使用自己的语料进行训练。扩展性一般。
小明NLP
提供中文分词, 词性标注, 拼写检查,文本转拼音,情感分析,文本摘要,偏旁部首
https://github.com/SeanLee97/xmnlp
单词、短句效果:3/13 效果差
速度:2.860311 all , 0.220023 avg; without print: 0:00:00.000017 all
可扩展性:既没发现词典、也没发现模型。扩展性较差。
云查错 - 智能查错
http://www.yunchacuo.com/
参考文献:
基于语义关联的中文查询纠错框架
https://cloud.tencent.com/developer/article/1030059
中文文本纠错算法–错别字纠正的二三事
https://zhuanlan.zhihu.com/p/40806718
pycorrector文档
https://shibing624.github.io/pycorrector/