本项目是参考开源框架 Pycorrector,自己实现了一套基于规则的纠错系统。 总体来说,基于规则的文本纠错,性能取决于纠错词典和分词质量。目前与 Pycorrector 相比,在准确率差不多的情况下,本模型所用的时间会少很多(归功于前向最大匹配替代了直接索引混淆词典)。 代码还没有完善,还有很多优化的空间,后续会持续更新。。。
- 文本纠错的核心步骤:错误检测,候选召回,纠错排序。
- 错误检测:找到哪些词是错误的。
- 候选召回:选出纠错候选词。
- 纠错排序:对候选词进行排序。
- 主流的三种方法:
- 基于规则:pycorrector
- 基于深度模型:百度纠错系统
- 基于垂直领域:腾讯DCQC纠错框架
- 中文纠错需要解决的问题:
- 谐音字词,如 配副眼睛-配副眼镜
- 混淆音字词,如 流浪织女-牛郎织女
- 字词顺序颠倒,如 伍迪艾伦-艾伦伍迪
- 字词补全,如 爱有天意-假如爱有天意
- 形似字错误,如 高梁-高粱
- 中文拼音全拼,如 xingfu-幸福
- 中文拼音缩写,如 sz-深圳
- 语法错误,如 想象难以-难以想象
- 语言模型:LSTM,N-gram(kenlm 库)
- 混淆词典(字典)
- 通用词典(词频)
- 音近词典(可使用Pypinyin代替或结合)
- 形近词典
-
文本处理
- 是否为空
- 是否全是英文
- 统一编码
- 统一文本格式
-
错误检索
-
从混淆词典/字典中检索
直接检索
最大匹配算法
-
分词后,查看是否存在于通用词典
分词质量
分词后产生的单字(字本身是ok的,但是在整个句子中是错误的)
分词后产生的错词(词本身是ok的,但是在整个句子中是错误的)
分词后的词是否包含其他字母及符号
-
词粒度的 N-gram
计算局部得分
MAD(Median Absolute Deviation)
-
字粒度的 N-gram
计算局部得分
MAD(Median Absolute Deviation)
-
将候选错误词中的连续单字合并
-
-
候选召回
-
编辑距离
错误词的长度大于 1
只使用编辑距离为 1
只使用变换和修改,无添加和删除
对编辑距离得到的词使用拼音加以限制
-
音近词
-
形近词
-
-
纠错排序
- 语言模型计算得分(困惑度)
- 语言模型(kenlm,自定义ngram,DNNLM)
- score(sentence) :计算文本得分
- ppl(sentence):困惑度
- Model(path):加载模型
- 分词器(jieba,自定义分词器)
- tokenize(sentence)
- 资源加载
- 加载混淆词典
- 加载通用词典
- 加载音近词典
- 加载形近词典
- 加载分词词典
- 存在异常字母标点符号等内容
- 英文纠错处理
- 错误词影响分词质量
- 语言模型计算得分的准确性
- 执行两遍纠错(效果目前来看不行)
- 加入依存法分析
- 从检索,召回和排序都有优化的空间
- 多线程检索
- 添加 1-gram(貌似没什么效果)
- 混淆词典检索优化(使用前向最大匹配,可以节约时间,随着混淆词典越大,节约时间越多)
- pycorrector 无法处理一句话中有两个混淆词典中的词(使用前向最大匹配替代直接索引,可以解决该问题)
- 2020/05/24 添加 1-gram
- 2020/05/24 使用前向最大匹配替代直接检索
- 2020/05/22 初版完成