中文汉字错别字纠错方法

前记

        本文简单地讲解如何使用n-gram模型结合汉字拼音来作中文错别字纠错,然后介绍最短编辑距离在中文搜索纠错方面的应用;最后从依赖树入手讲解如何作文本长距离纠错(语法纠错),并从该方法中得到一种启示,利用依赖树的特点结合ESA算法来做同义词的查找。

n-gram模型

        在中文错别字查错情景中,我们判断一个句子是否合法可以通过计算它的概率来得到,假设一个句子S = {w1, w2, ..., wn},则问题可以转换成如下形式:

        P(S)被称为语言模型,即用来计算一个句子合法概率的模型。

        但是使用上式会出现很多问题,参数空间过大,信息矩阵严重稀疏,这时就有了n-gram模型,它基于马尔科夫模型假设,一个词的出现概率仅依赖于该词的前1个词或前几个词,则有

(1)一个词的出现仅依赖于前1个词,即Bigram(2-gram):

(2)一个词的出现仅依赖于前2个词,即Trigram(3-gram):

        当n-gram的n值越大时,对下一个词的约束力就越强,因为提供的信息越多,但同时模型就越复杂,问题越多,所以一般采用bigram或trigram。下面举一个简单的例子,说明n-gram的具体使用:

        n-gram模型通过计算极大似然估计(Maximum Likelihood Estimate)构造语言模型,这是对训练数据的最佳估计,对于Bigram其计算公式如下:

        对于一个数据集,假设count(wi)统计如下(总共8493个单词):

        而count(wi, wi-1)统计如下:

        则Bigram概率矩阵计算如下:

        句子“I want to eat Chinese food”成立的概率为:

P(I want to eat Chinese food) = P(I) * P(want|I) * P(to|want) * P(eat|to) * P(Chinese|eat) * P(food|Chinese)

= (2533/8493) * 0.33 * 0.66 * 0.28 * 0.021 * 0.52。

        接下来我们只需要训练确定一个阀值,只要概率值≥阀值就认为句子合法。

        为了避免数据溢出、提高性能,通常会使用取log后使用加法运算替代乘法运算,即

log(p1*p2*p3*p4) = log(p1) + log(p2) + log(p3) + log(p4)

        可以发现,上述例子中的矩阵存在0值,在语料库数据集中没有出现的词对我们不能就简单地认为他们的概率为0,这时我们采用拉普拉斯矩阵平滑,把0值改为1值,设置成该词对出现的概率极小,这样就比较合理。

        有了上面例子,我们可以拿n-gram模型来做选择题语法填空,当然也可以拿来纠错。中文文本的错别字存在局部性,即我们只需要选取合理的滑动窗口来检查是否存在错别字,下面举一个例子:

        我们可以使用n-gram模型检查到“穿”字打错了,这时我们将“穿”字转换成拼音“chuan”,再从词典中查找“chuan”的候选词,一个一个试填,用n-gram检查,看是否合理。这就是n-gram模型结合汉字拼音来做中文文本错别字纠错了。汉字转拼音可以使用Java库pinyin4j 。

 
  1. import net.sourceforge.pinyin4j.PinyinHelper;

  2. import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;

  3. import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;

  4. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

  5.  
  6. public class Keyven {

  7.     public static void main(String[] args) {

  8.         HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();

  9.         format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

  10.  
  11.         String str = "我爱自然语言处理,Keyven";

  12.         System.out.println(str);

  13.         String[] pinyin = null;

  14.         for (int i = 0; i < str.length(); ++i) {

  15.             try {

  16.                 pinyin = PinyinHelper.toHanyuPinyinStringArray(str.charAt(i),

  17.                         format);

  18.             } catch (BadHanyuPinyinOutputFormatCombination e) {

  19.                 e.printStackTrace();

  20.             }

  21.  
  22.             if (pinyin == null) {

  23.                 System.out.print(str.charAt(i));

  24.             } else {

  25.                 if (i != 0) {

  26.                     System.out.print(" ");

  27.                 }

  28.                 System.out.print(pinyin[0]);

  29.             }

  30.         }

  31.     }

  32. }

 

最短编辑距离

        当然,现实生活中也存在汉字拼音没打错,是词语选错了;或者n-gram检查合理但词语不存在,例如:

 

        这时就用到最短编辑距离了,对于这种热搜词,我们仅需记录n-Top,然后用最短编辑距离计算相似度,提供相似度最高的那个候选项就可以了。

        编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将kitten一字转成sitting
    sitten (k→s)
    sittin (e→i)
    sitting (→g)

        俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。它是一种DP动态规划算法,在POJ或ACM算法书上有类似的题目。主要思想如下:

        首先定义这样一个函数Edit(i, j),它表示第一个字符串的长度为的子串到第二个字符串的长度为的子串的编辑距离。显然可以有如下动态规划公式:
    if (i == 0 且 j == 0),Edit(i, j) = 0
    if (i == 0 且 j > 0),Edit(i, j) = j
    if (i > 0 且j == 0),Edit(i, j) = i
    if (i ≥ 1  且 j ≥ 1) ,Edit(i, j) = min{ Edit(i-1, j) + 1, Edit(i, j-1) + 1, Edit(i-1, j-1) + F(i, j) },

        其中,当第一个字符串的第个字符不等于第二个字符串的第个字符时,F(i, j) = 1;否则,F(i, j) = 0。

 
  1. #include <iostream>

  2. #include <string.h>

  3.  
  4. using namespace std;

  5.  
  6. #define min(a,b) (a<b?a:b)

  7. #define min3(a,b,c) (a<min(b,c)?a:min(b,c))

  8.  
  9. int main()

  10. {

  11.     /*

  12.     AGTCTGACGC

  13.     AGTAAGTAGGC

  14.  
  15.     sailn

  16.     failing

  17.     */

  18.     char astr[100], bstr[100];

  19.     int dist[100][100];

  20.     memset(astr, '\0', sizeof(astr));

  21.     memset(bstr, '\0', sizeof(bstr));

  22.     memset(dist, 0, sizeof(dist));

  23.  
  24.     gets(astr);

  25.     gets(bstr);

  26.  
  27.     int alen = strlen(astr);

  28.     int blen = strlen(bstr);

  29.     for (int i = 0; i <= alen; i++)

  30.     {

  31.         dist[i][0] = i;

  32.     }

  33.     for (int i = 0; i <= blen; i++)

  34.     {

  35.         dist[0][i] = i;

  36.     }

  37.  
  38.     for (int i = 1; i <= alen; i++)

  39.     {

  40.         for (int j = 1; j <= blen; j++)

  41.         {

  42.             int d = (astr[i - 1] != bstr[j - 1]) ? 1 : 0;

  43.             dist[i][j] = min3(dist[i - 1][j] + 1, dist[i][j - 1] + 1, dist[i - 1][j - 1] + d);

  44.         }

  45.     }

  46.  
  47.     for (int i = 0; i <= alen; i++)

  48.     {

  49.         for (int j = 0; j <= blen; j++)

  50.         {

  51.             printf("%d ", dist[i][j]);

  52.         }

  53.         printf("\n");

  54.     }

  55.  
  56.     printf("%d\n", dist[alen][blen]);

  57.  
  58.     system("pause");

  59.     return 0;

  60. }

中文语法纠错

        之前参加了中文语法错误诊断评测CGED(ACL-IJCNLP2015 workshop)比赛,我负责的是Selection 部分,我们来看官方给出的样例(Redundant、Missing、Selection、Disorder分别对应4种语法错误):

        比赛过程中有想到使用依存树来解决Selection(语法搭配错误)问题,语法搭配与其说是语法范畴,倒不如说是语义概念,例如“那个电影”我们判断“个”错了是依据“电影”一词来判断,又如“吴先生是修理脚踏车的拿手”判断“拿手”错了是依据“是”一字,“拿手”是动词,怎么能采用“是+名词”结构呢?但是当时事情比较多各种手忙脚乱前途未卜,所以没做出来。后来上网查论文看到一篇《基于n-gram及依存分析的中文自动差错方法》,记得是2年前看到过的,当时对依存树还不理解所以没在意论文的后半部,现在理解了,写东西也有个理论支撑,没想到想法好有缘分^_^。

        词与词之间的搭配是看两者之间的语义关联强度,而依存树的边正可以用来体现这种语义关联度,如果一个句子存在Selection语法错误,那么建成依存树也应该存在一条边是不合理的,我们可以用这条边来判断是否出现了语法错误。在上述论文中作者将其称之为用来作长距离的中文纠错,而n-gram则是短距离中文纠错。

        至于怎样利用已有知识,建立领域知识库,我们可以跑一遍正确的语料库数据集,统计那些语法正确的句子的依存树边... ...CGED那个比赛所给的训练集有点奇怪,这个也是导致比赛过程不理想没把依存树想法做出来的原因。我重新从网上找来了几个测试样例(语言学专业的课件PPT),我们来看一下再看如何拿依存树来做同义词聚类。利用依存树做Selection语法侦错是有了,可是还要纠错呢,怎么实现一种纠错算法呢,当然是同义词替换了,会产生Selection类错误一般都是同义词误用。我曾经拿HIT-IRLab-同义词词林(扩展版) 对比,效果不是很好,所以就有了后来的同义词聚类想法。

依存树同义词查找

        之前有接触过同义词聚类的论文,其中印象比较深刻的一篇是《 Computing Semantic Relatedness using Wikipedia-based Explicit Semantic Analysis 》,也就是ESA(Explicit Semantic Analysis)算法。ESA的主要思想就是,将一个Wiki词条看成一个主题概念,然后将词条下的解释文本先用TF-IDF逆文档频率过滤分词,再用倒排索引建立成(word-Topic),这样就可以构造主题向量,我们可以用这些主题向量来做语义相似度计算,完成同义词的查找。

        但是这种工作对于我来说有点难以完成,后来在看Selection平行语料库时,发现一样有意思的东西,就是上图中标成黄色的边,瞬间突发奇想,是不是可以拿这些依存边作为一个Topic,利用倒排索引建立主题向量,这样就可以造出一大堆丰富的原始特征,然后再找个算法作特征选择过滤,再完成同义词查找... ...

Reference

基于n-gram及依存分析的中文自动差错方法(马金山,刘挺,李生)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/71076.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费错别字检测、在线纠错工具

爱校对 依托清华大学人机交互实验室的技术成果 针对错别字、多字、少字、敏感词、禁用词、用法错误、表述错误、语法错误等可实时校对。 爱校对 在线校对网站http://www.ijiaodui.com 在新闻出版、自媒体等多个领域&#xff0c;因为错别字、敏感词汇等引起的文本错误非常频繁…

《XrayGLM:基于VisualGLM-6B微调训练对X光胸片进行医学诊断》学习分享与本地项目微调部署实践

XrayGLM据说是首个会看胸部X光片的中文多模态医学大模型&#xff0c;我最近也是因为关注这个所以就找时间学习了一下&#xff0c;顺便把学习资料对应记录分享一下。 官方提供了开源的项目&#xff0c;地址在这里&#xff0c;如下所示&#xff1a; 最近&#xff0c;通用领域的大…

【心理咨询师考试笔记】基础理论(一)——心理学概论

心理学概论 文章目录 心理学概论一、绪论1.基础心理学的研究对象及研究内容是什么&#xff1f;2.心理包括什么&#xff1f;3.心理现象发生发展的过程4.心理学发展简史 二、心理活动的生理基础1.神经元2.神经系统&#xff08;1&#xff09;神经系统结构&#xff08;2&#xff09…

【心理咨询师考试笔记】基础理论(六)——心理咨询概论

心理咨询概论 文章目录 心理咨询概论一、概述简史基本概念心理咨询师应有的思维方式与态度心理咨询师应具备的条件 二、精神分析理论观点分区观点结构观点心理动力观点发展观点适应观点 三、行为主义理论观点行为主义心理学的先驱操作性条件反射和应答性条件反射的区别内隐与外…

【心理咨询师考试笔记】操作技能(二)——心理评估

心理评估 文章目录 心理评估一、概述二、心理评估在心理咨询中的作用三、心理评估的方法四、个案概念化五、心理诊断技能一&#xff1a;初诊接待与资料的搜集、整理二&#xff1a;初步诊断 六、心理测验技能人格测验类问卷明尼苏达多相人格测验&#xff08;MMPI&#xff09;卡特…

为本教育柳春丽心理咨询师擅长哪些方面领域

柳春丽老师-为本教育心理咨询师-国家二级心理咨询师擅长领域如下&#xff1a; 1、情绪问题咨询&#xff1a; &#xff08;如自卑、内疚、焦虑、恐惧、愤怒、悲伤等&#xff09;的调节。 2、个人成长咨询&#xff1a; 内向孤僻、缺乏自信、敏感多疑、性格缺陷、人际关系紧张…

【Claude2体验】继ChatGPT,文心一言,Bing等大模型后,初次对话Claude2的体验

文章目录 &#x1f33a;注意事项&#x1f916;什么是Claude2⭐与之前版本的进步&#x1f6f8;官网的讲解&#x1f354;功能介绍&#x1f384;使用体验&#x1f386;查看不知道如何才能打开的文档 的内容&#x1f386;日常需求✨Claude✨ChatGPT3.5 &#x1f916;总结 &#x1f…

Docker网络

文章目录 一、引言二、网络原理2.1 Linux veth pair2.2 虚拟网卡Docker0 三、容器互联–Link四、网络模式五、container模式六、自定义网络4.1 创建网络4.2 Docker网络驱动程序和网络模式区别 七、网络连通八、常见使用命令九、总结十、参考资料 一、引言 一直拖着Docker网络这…

微软AI太会了,示爱威胁PUA!

微软在以ChatGPT为基础的最新搜索引擎New Bing在公测仅一周后就引发了人们的担忧和恐惧。用户反馈&#xff0c;New Bing不仅会表现出类似示爱、PUA和威胁人类等人类特有的行为&#xff0c;还可能超越人类意志和价值观&#xff0c;并违反“阿西莫夫的机器人三定律”。这引起了人…

ubuntu16.04没有声音解决方案

上网搜了一堆资料也没解决&#xff0c;自己瞎捣鼓给弄好了&#xff0c;记录下 输入下面命令安装pavucontrol&#xff1a; #sudo apt install pavucontrol #pavucontrol 运行h之后就是下图这个样子 点击Playback选项&#xff0c;将下面的Built-in Audio Analog Stereo修改为Lo…

解决腾讯会议没有声音的问题

文章目录 问题背景解决方案 问题背景 最近&#xff0c;在连接蓝牙耳机听腾讯会议时&#xff0c;发现没有声音&#xff0c;音量合成器里也没有腾讯会议。切换成外放时&#xff0c;发现音量控制键也失效了。 解决方案 这种情况除了软件内部的声音设置问题&#xff0c;很有可能…

借军工经验开拓消费市场,三星显示收购eMagin浅析

前不久三星显示&#xff08;Samsung Display&#xff09;宣布&#xff0c;拟支付2.18亿美元收购微显示方案商eMagin全部普通股&#xff0c;收购完成后eMagin将并入三星显示&#xff0c;以加速XR显示业务发展。 据青亭网了解&#xff0c;eMagin成立于1996年&#xff0c;该公司多…

挑战杯、互联网+大学生创新创业大赛项目计划书《多功能智能化无人机》

“挑战杯、互联网+”大学生创新创业大赛项目计划书 项目名称:多功能智能化无人机 目录 一、执行总结 1 (一)项目背景: 1 (二)项目概述: 2 (三)市场与竞争分析: 3 (四)运营分析: 3 (五)风险分析: 3 二、项目简介 4 (一)项目概述 4 (二)项目简介 4 1.项目创…

第十四届中国大学生创新创业大赛

文章目录 比赛官网比赛题目含金量非常高建议参加的学生推荐几个我感兴趣的题目联系 比赛官网 官网地址&#xff1a;http://www.fwwb.org.cn/ 实际叫做&#xff1a;中国大学生创新创业大赛 比赛题目 题目公布查看地址&#xff1a;http://www.fwwb.org.cn/topic/index 题目…

“创享杯”第一届电子数据取证线上大比武答案(自做)

1、通过对检材的分析&#xff0c;获取嫌疑人张某通过计算机远程桌面连接过的主机IP地址。&#xff08;答案格式如&#xff1a;192.168.1.233&#xff09; 2、通过对检材的分析&#xff0c;请获取嫌疑人计算机连接“Cai-wifi”的无线WiFi密码。&#xff08;答案格式如&#xf…

揭秘第二届“移动云杯”大赛法律科技创新赛题参赛指南!

第二届“移动云杯”算力网络应用创新大赛已经启动 你是否对赛题还有很多问号&#xff1f; 那么&#xff0c;下面跟着我们一起来看下今日剧透之 高校赛道-法律科技创新子赛道 赛道介绍&#xff1a; 本赛道面向全国高校大学生&#xff0c;共分为”软件杯“直推子赛道、法律科技创…

比赛——第十四届全国大学生软件创新大赛 “基于端云结合的人工智能软件创新”

示 范 性 软 件 学 院 联 盟 关于举办第十四届全国大学生软件创新大赛 “基于端云结合的人工智能软件创新” 参赛通知 为了进一步提升大学生创新思维&#xff0c;全面推动软件行业发展&#xff0c;促进软件专业技术人才培养&#xff0c;为国家软件产业输出有创新能力和实践能力…