热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

中文文本纠错算法走到多远了?

纠错是从互联网起始时就在一直解决的问题,但是一直作为一些重要技术的辅助、附属功能而默默无闻,譬如搜索引擎、譬如火热的智能写作等。素质整理!

纠错是从互联网起始时就在一直解决的问题,但是一直作为一些重要技术的辅助、附属功能而默默无闻,譬如搜索引擎、譬如火热的智能写作等。
素质整理!

中文文本纠错任务,常见错误类型包括:

  • 谐音字词,如 配副眼睛-配副眼镜
  • 混淆音字词,如 流浪织女-牛郎织女
  • 字词顺序颠倒,如 伍迪艾伦-艾伦伍迪
  • 字词补全,如 爱有天意-假如爱有天意
  • 形似字错误,如 高梁-高粱
  • 中文拼音全拼,如 xingfu-幸福
  • 中文拼音缩写,如 sz-深圳
  • 语法错误,如 想象难以-难以想象

目前来看,纠错算法分为两个方向:基于规则、深度模型

规则的解决思路

中文纠错分为两步走,第一步是错误检测,第二步是错误纠正;

错误检测部分先通过结巴中文分词器切词,由于句子中含有错别字,所以切词结果往往会有切分错误的情况,这样从字粒度和词粒度两方面检测错误, 整合这两种粒度的疑似错误结果,形成疑似错误位置候选集;

错误纠正部分,是遍历所有的疑似错误位置,并使用音似、形似词典替换错误位置的词,然后通过语言模型计算句子困惑度,对所有候选集结果比较并排序,得到最优纠正词。

深度模型的解决思路

端到端的深度模型可以避免人工提取特征,减少人工工作量,RNN序列模型对文本任务拟合能力强,rnn_attention在英文文本纠错比赛中取得第一名成绩,证明应用效果不错;

CRF会计算全局最优输出节点的条件概率,对句子中特定错误类型的检测,会根据整句话判定该错误,阿里参赛2016中文语法纠错任务并取得第一名,证明应用效果不错;

seq2seq模型是使用encoder-decoder结构解决序列转换问题,目前在序列转换任务中(如机器翻译、对话生成、文本摘要、图像描述)使用最广泛、效果最好的模型之一。

那么笔者最近刚刚听了百度的纠错算法框架,就把听到的和之前收集到的一些材料整理如下。


百度智能纠错技术

可参考百度纠错开放平台:

https://ai.baidu.com/tech/nlp/text_corrector


百度智能纠错体系:


常见错误分三类:


  • 用词错误
  • 文法、句法错误
  • 知识错误

百度纠错的整体框架:


其中核心的关键步骤为:

  • 1 错误检测
  • 2 候选召回
  • 3 纠错排序

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/


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了停用Vaadin焦点颜色的全局方法。焦点环是一种辅助功能,用于指示字段已从键盘交互获得焦点。每个组件和主题的焦点环样式不同。文章提供了一种方便的方法来找到和修改焦点环样式,通过检查shadow DOM中的标签并覆盖相应的样式。同时,还介绍了使用with或导入样式表的方法来应用修改后的样式。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • mui框架offcanvas侧滑超出部分隐藏无法滚动如何解决
    web前端|js教程off-canvas,部分,超出web前端-js教程mui框架中off-canvas侧滑的一个缺点就是无法出现滚动条,因为它主要用途是设置类似于qq界面的那种格 ... [详细]
  • angular.element使用方法及总结
    2019独角兽企业重金招聘Python工程师标准在线查询:http:each.sinaapp.comangularapielement.html使用方法 ... [详细]
  • ①页面初始化----------收到客户端的请求,产生相应页面的Page对象,通过Page_Init事件进行page对象及其控件的初始化.②加载视图状态-------ViewSta ... [详细]
  • Word2vec from scratch (Skip-gram & CBOW)
    在自然語言處理領域中,如何透過向量表達一個詞彙,是近幾年非常火熱的議題,在distributedrepresentation(densevector)尚未風行前,大多數的任務都以1-hotencoding作為詞彙的表示,其方法得到了高維度的稀疏向量,雖容易理解、簡單計算,但也帶來許多副作用;直至2013年,ThomasMikolov等人提出了word2vec,word2vec引用了一個概念,作者導 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
author-avatar
刚辉19861126
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有