怎样用计算机编程分析文章中的错别字

的确很难,估计最大的难度来自于一个符合你要求的语料训练结果。我们先说你的方法,你的方法当中比较有问题的一步,是直接用了单字词词频来判别是不是错别字。从数学上来说这个判别问题,你应该这样建立模型:对于单字,有两种可能性:的确出现了单字成词单字是错别字第一种记作A,第二种记作B,两个事件互补。字的序列是已知的,记作O。问题可以描述为,当我观察到O的时候,究竟是A发生的概率比较高,还是B发生的概率比较高?也就是说,你实际上需要计算的是条件概率的比值:
怎样用计算机编程分析文章中的错别字
这个条件概率,我们一般的处理方式都是用贝叶斯公式展开,也就是:
怎样用计算机编程分析文章中的错别字
注意上下消去了一个p(O)。
这当中,p(A)和p(B)是先验概率,与O无关,可以将两者的比值当作一个可以调整的参数,这个参数代表你在不看文本的情况下,预估你的文本的单字词中,有多大比例的错别字,如果错字相对少,这个值可以调低,否则可以调高。
比较重要的是p(O|A)和p(O|B)这两部分,分别代表:以单字词方式出现这个字的概率;以错别字方式出现这个词的概率。问题在于p(O|B)这个概率难以估计,这种情况下,我们假定任何字都有相同的概率是错字,也就是p(B|O)这个概率是常数,我们反过来把之前消去的p(O)请回来,重写判别表达式:
怎样用计算机编程分析文章中的错别字
其中p(A)/p(B|O)是常数,估计p(O|A)和p(O)即可。你前面做的实际上是只考虑了p(O|A),而没有考虑p(O),那么我们就知道应该怎么做了:
统计每个字总的出现频率,和作为单字出现的频率,然后用作为单字出现的频率,除以总的出现频率,将除的结果与阈值进行对比,比阈值更低的认为是错字
这样应该就不会出现你识别结果中罕见的单字词总是被当作错别字的问题了。
另一个角度的话,单字出现频率除以总的出现频率,其实代表这个字出现时为单字的概率,那么很显然就是说出现时为单字的概率很低的字作为单字出现了,说明是错别字。
【怎样用计算机编程分析文章中的错别字】 进一步优化仍然有很多方案,一种是回到前面第一个表达式,在有人工标注的情况下,训练p(O|B)也是可能的,当有训练结果支撑时使用训练结果,当没有训练结果支撑时可以退回到之前的结果。这个改进的好处是也许的确某些字更容易是错字,就不容易把其他字也识别成错字。
第二种改进方案是很多情况下错别字并不是随机错成另外一个字,而是固定某个字就容易错成某另外几个字,这样可以借助手工标注或者拼音表、字形表之类来记住哪些字容易变成另外的哪些字,当出现前面一种情况时,进一步将可能的错字替换成可能正确的字,再次分词,看是否能够消除单字的情况。
第三种改进方案是引进语法图,也就是哪些词可能跟哪些词相邻,这样应该会更准确,但是也更复杂。
==================================================================
实际上用单字判别并不能算是最好的办法,如果碰巧错了的那个字就是个常见的单字,那么反而容易把附近另一个字识别成错字。如果你是自己做的分词的话,其实可以将错字纠正的功能加到分词模型当中去。经典的分词模型使用马尔科夫链,穷举每个字往前(或者往后)能够形成的词组,然后进行动态规划。我们可以稍微修改一下这个模型,允许每个词当中出现一个错字,增加相应的概率惩罚值,这个修改虽然会带来一些实现上额外的难度,但是的确是可行的。这个扩展的分词模型会自动将有错字的情况和没有错字的情况进行似然值对比,然后挑选出似然值比较大的一种,在这个过程中不仅能挑出可能的错字,还能提供更正建议。


推荐阅读