文本纠错pycorrector
原文鏈接:https://blog.csdn.net/javastart/article/details/107428483
這一段時間再研究身份證和面單識別項目,總發現一些識別準確率問題,在想辦法提高識別率,突然看了一篇文字糾錯方面資料,可以發現與ocr結合。開始收集糾錯方面的框架,感覺網上評價pycorrector 這個項目不錯。
pycorrector
中文文本糾錯工具。音似、形似錯字(或變體字)糾正,可用于中文拼音、筆畫輸入法的錯誤糾正。python3.6開發。
pycorrector依據語言模型檢測錯別字位置,通過拼音音似特征、筆畫五筆編輯距離特征及語言模型困惑度特征糾正錯別字。
Demo
https://www.borntowin.cn/product/corrector
Question
中文文本糾錯任務,常見錯誤類型包括:
- 諧音字詞,如 配副眼睛-配副眼鏡
- 混淆音字詞,如 流浪織女-牛郎織女
- 字詞順序顛倒,如 伍迪艾倫-艾倫伍迪
- 字詞補全,如 愛有天意-假如愛有天意
- 形似字錯誤,如 高梁-高粱
- 中文拼音全拼,如 xingfu-幸福
- 中文拼音縮寫,如 sz-深圳
- 語法錯誤,如 想象難以-難以想象
當然,針對不同業務場景,這些問題并不一定全部存在,比如輸入法中需要處理前四種,搜索引擎需要處理所有類型,語音識別后文本糾錯只需要處理前兩種, 其中'形似字錯誤'主要針對五筆或者筆畫手寫輸入等。
Solution
規則的解決思路
深度模型的解決思路
Feature
模型
- kenlm:kenlm統計語言模型工具
- rnn_attention模型:參考Stanford University的nlc模型,該模型是參加2014英文文本糾錯比賽并取得第一名的方法
- rnn_crf模型:參考阿里巴巴2016參賽中文語法糾錯比賽CGED2018并取得第一名的方法(整理中)
- seq2seq_attention模型:在seq2seq模型加上attention機制,對于長文本效果更好,模型更容易收斂,但容易過擬合
- transformer模型:全attention的結構代替了lstm用于解決sequence to sequence問題,語義特征提取效果更好
- bert模型:中文fine-tuned模型,使用MASK特征糾正錯字
- conv_seq2seq模型:基于Facebook出品的fairseq,北京語言大學團隊改進ConvS2S模型用于中文糾錯,在NLPCC-2018的中文語法糾錯比賽中,是唯一使用單模型并取得第三名的成績
- electra模型:斯坦福和谷歌聯合提出的一種更具效率的預訓練模型,學習文本上下文表示優于同等計算資源的BERT和XLNet
錯誤檢測
- 字粒度:語言模型困惑度(ppl)檢測某字的似然概率值低于句子文本平均值,則判定該字是疑似錯別字的概率大。
- 詞粒度:切詞后不在詞典中的詞是疑似錯詞的概率大。
錯誤糾正
- 通過錯誤檢測定位所有疑似錯誤后,取所有疑似錯字的音似、形似候選詞,
- 使用候選詞替換,基于語言模型得到類似翻譯模型的候選排序結果,得到最優糾正詞。
思考
Install
- 全自動安裝:pip install pycorrector
- 半自動安裝:
通過以上兩種方法的任何一種完成安裝都可以。如果不想安裝,可以下載github源碼包,安裝下面依賴再使用。
安裝依賴
- kenlm安裝
- 其他庫包安裝
Usage
- 文本糾錯
output:
少先隊員應該為老人讓座 [[('因該', '應該', 4, 6)], [('坐', '座', 10, 11)]]規則方法默認會從路徑~/.pycorrector/datasets/zh_giga.no_cna_cmn.prune01244.klm加載kenlm語言模型文件,如果檢測沒有該文件,則程序會自動聯網下載。當然也可以手動下載模型文件(2.8G)并放置于該位置。
- 錯誤檢測
output:
[['因該', 4, 6, 'word'], ['坐', 10, 11, 'char']]返回類型是list,?[error_word, begin_pos, end_pos, error_type],pos索引位置以0開始。
- 關閉字粒度糾錯
output:
'我的喉嚨發炎了要買點阿莫西林吉', [['細林', '西林', 12, 14], ['吃', '吉', 14, 15]]上例中吃發生誤糾,如下代碼關閉字粒度糾錯:
output:
'我的喉嚨發炎了要買點阿莫西林吃', [['細林', '西林', 12, 14]]默認字粒度、詞粒度的糾錯都打開,一般情況下單字錯誤發生較少,而且字粒度糾錯準確率較低。關閉字粒度糾錯,這樣可以提高糾錯準確率,提高糾錯速度。
默認enable_char_error方法的enable參數為True,即打開錯字糾正,這種方式可以召回字粒度錯誤,但是整體準確率會低;
如果追求準確率而不追求召回率的話,建議將enable設為False,僅使用錯詞糾正。
- 加載自定義混淆集
通過加載自定義混淆集,支持用戶糾正已知的錯誤,包括兩方面功能:1)錯誤補召回;2)誤殺加白。
output:
具體demo見example/use_custom_confusion.py,其中./my_custom_confusion.txt的內容格式如下,以空格間隔:
set_custom_confusion_dict方法的path參數為用戶自定義混淆集文件路徑。
- 加載自定義語言模型
默認提供下載并使用的kenlm語言模型zh_giga.no_cna_cmn.prune01244.klm文件是2.8G,內存較小的電腦使用pycorrector程序可能會吃力些。
支持用戶加載自己訓練的kenlm語言模型,或使用2014版人民日報數據訓練的模型,模型小(20M),準確率低些。
output:
少先隊員應該為老人讓座 [[('因該', '應該', 4, 6)], [('坐', '座', 10, 11)]]具體demo見example/load_custom_language_model.py,其中./people_chars_lm.klm是自定義語言模型文件。
- 英文拼寫糾錯
支持英文單詞的拼寫錯誤糾正。
output:
- 中文簡繁互換
支持中文繁體到簡體的轉換,和簡體到繁體的轉換。
output:
Command Line Usage
- 命令行模式
支持批量文本糾錯。
case:
python -m pycorrector input.txt -o out.txt -n -d輸入文件:input.txt;輸出文件:out.txt;關閉字粒度糾錯;打印詳細糾錯信息;糾錯結果以\t間隔
Evaluate
提供評估腳本pycorrector/utils/eval.py,該腳本有兩個功能:
- 構建評估樣本集:自動生成評估集pycorrector/data/eval_corpus.json, 包括字粒度錯誤100條、詞粒度錯誤100條、語法錯誤100條,正確句子200條。用戶可以修改條數生成其他評估樣本分布。
- 計算糾錯準召率:采用保守計算方式,簡單把糾錯之后與正確句子完成匹配的視為正確,否則為錯。
執行該腳本后得到,規則方法糾錯效果評估如下:
- 準確率:320/500=64%
- 召回率:152/300=50.67%
看來還有比較大的提升空間,誤殺和漏召回的都有。
深度模型使用說明
安裝依賴
pip install -r requirements-dev.txt介紹
本項目的初衷之一是比對、共享各種文本糾錯方法,拋磚引玉的作用,如果對大家在文本糾錯任務上有一點小小的啟發就是我莫大的榮幸了。
主要使用了多種深度模型應用于文本糾錯任務,分別是前面模型小節介紹的conv_seq2seq、seq2seq_attention、?transformer、bert、electra,各模型方法內置于pycorrector文件夾下,有README.md詳細指導,各模型可獨立運行,相互之間無依賴。
使用方法
各模型均可獨立的預處理數據、訓練、預測,下面以其中seq2seq_attention為例:
seq2seq_attention 模型使用示例:
配置
通過修改config.py。
數據預處理
自動新建文件夾output,在output下生成train.txt和test.txt文件,以TAB("\t")間隔錯誤文本和糾正文本,文本以空格切分詞,文件內容示例:
訓練
python train.py訓練過程截圖:?
預測
python infer.py預測輸出效果樣例:
PS:
自定義語言模型
語言模型對于糾錯步驟至關重要,當前默認使用的是從千兆中文文本訓練的中文語言模型zh_giga.no_cna_cmn.prune01244.klm(2.8G)。
大家可以用中文維基(繁體轉簡體,pycorrector.utils.text_utils下有此功能)等語料數據訓練通用的語言模型,或者也可以用專業領域語料訓練更專用的語言模型。更適用的語言模型,對于糾錯效果會有比較好的提升。
人民日報2014版熟語料,網盤鏈接:https://pan.baidu.com/s/1971a5XLQsIpL0zL0zxuK2A?密碼:uc11。尊重版權,傳播請注明出處。
中文糾錯數據集
貢獻及優化點
- [x] 優化形似字字典,提高形似字糾錯準確率
- [x] 整理中文糾錯訓練數據,使用seq2seq做深度中文糾錯模型
- [x] 添加中文語法錯誤檢測及糾正能力
- [x] 規則方法添加用戶自定義糾錯集,并將其糾錯優先度調為最高
- [x] seq2seq_attention 添加dropout,減少過擬合
- [x] 在seq2seq模型框架上,新增Pointer-generator network、Beam search、Unknown words replacement、Coverage mechanism等特性
- [x] 更新bert的fine-tuned使用wiki,適配transformers 2.10.0庫
- [x] 升級代碼,兼容TensorFlow 2.0庫
- [x] 升級bert糾錯邏輯,提升基于mask的糾錯效果
- [x] 新增基于electra模型的糾錯邏輯,參數更小,預測更快
討論群
微信交流群,感興趣的同學可以加入溝通NLP文本糾錯相關技術,issues上回復不及時也可以在群里面提問。
PS: 由于微信群滿100人了,掃碼加不了。掃我微信二維碼,或者搜索我微信號:xuming624, 備注:個人名稱-NLP糾錯?進群。
?
?
引用
如果你在研究中使用了pycorrector,請按如下格式引用:
License
pycorrector 的授權協議為?Apache License 2.0,可免費用做商業用途。請在產品說明中附加pycorrector的鏈接和授權協議。pycorrector受版權法保護,侵權必究。
References
- 基于文法模型的中文糾錯系統
- Norvig’s spelling corrector
- Chinese Spelling Error Detection and Correction Based on Language Model, Pronunciation, and Shape[Yu, 2013]
- Chinese Spelling Checker Based on Statistical Machine Translation[Chiu, 2013]
- Chinese Word Spelling Correction Based on Rule Induction[yeh, 2014]
- Neural Language Correction with Character-Based Attention[Ziang Xie, 2016]
- Chinese Spelling Check System Based on Tri-gram Model[Qiang Huang, 2014]
- Neural Abstractive Text Summarization with Sequence-to-Sequence Models[Tian Shi, 2018]
- 基于深度學習的中文文本自動校對研究與實現[楊宗霖, 2019]
- A Sequence to Sequence Learning for Chinese Grammatical Error Correction[Hongkai Ren, 2018]
- ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators
pycorrector
Chinese text error correction tool.
pycorrector?Use the language model to detect errors, pinyin feature and shape feature to correct chinese text error, it can be used for Chinese Pinyin and stroke input method.
Features
language model
- Kenlm
- RNNLM
Usage
install
- pip install pycorrector / pip install pycorrector
- Or download?https://github.com/shibing624/pycorrector, Unzip and run: python setup.py install
correct
input:
output:
少先隊員應該為老人讓座 [[('因該', '應該', 4, 6)], [('坐', '座', 10, 11)]]Future work
P(c), the language model. We could create a better language model by collecting more data, and perhaps by using a little English morphology (such as adding "ility" or "able" to the end of a word).
P(w|c), the error model. So far, the error model has been trivial: the smaller the edit distance, the smaller the error. Clearly we could use a better model of the cost of edits. get a corpus of spelling errors, and count how likely it is to make each insertion, deletion, or alteration, given the surrounding characters.
It turns out that in many cases it is difficult to make a decision based only on a single word. This is most obvious when there is a word that appears in the dictionary, but the test set says it should be corrected to another word anyway: correction('where') => 'where' (123); expected 'were' (452) We can't possibly know that correction('where') should be 'were' in at least one case, but should remain 'where' in other cases. But if the query had been correction('They where going') then it seems likely that "where" should be corrected to "were".
Finally, we could improve the implementation by making it much faster, without changing the results. We could re-implement in a compiled language rather than an interpreted one. We could cache the results of computations so that we don't have to repeat them multiple times. One word of advice: before attempting any speed optimizations, profile carefully to see where the time is actually going.
Further Reading
- Roger Mitton has a survey article on spell checking.
References
- Norvig’s spelling corrector
- Norvig’s spelling corrector(java version)
總結
以上是生活随笔為你收集整理的文本纠错pycorrector的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文浅尝 | 弱监督关系抽取的深度残差学
- 下一篇: 2019年招聘过程的种种酸甜苦辣历程