文本纠错pycorrector
原文鏈接:https://blog.csdn.net/javastart/article/details/107428483
這一段時(shí)間再研究身份證和面單識(shí)別項(xiàng)目,總發(fā)現(xiàn)一些識(shí)別準(zhǔn)確率問題,在想辦法提高識(shí)別率,突然看了一篇文字糾錯(cuò)方面資料,可以發(fā)現(xiàn)與ocr結(jié)合。開始收集糾錯(cuò)方面的框架,感覺網(wǎng)上評(píng)價(jià)pycorrector 這個(gè)項(xiàng)目不錯(cuò)。
pycorrector
中文文本糾錯(cuò)工具。音似、形似錯(cuò)字(或變體字)糾正,可用于中文拼音、筆畫輸入法的錯(cuò)誤糾正。python3.6開發(fā)。
pycorrector依據(jù)語言模型檢測(cè)錯(cuò)別字位置,通過拼音音似特征、筆畫五筆編輯距離特征及語言模型困惑度特征糾正錯(cuò)別字。
Demo
https://www.borntowin.cn/product/corrector
Question
中文文本糾錯(cuò)任務(wù),常見錯(cuò)誤類型包括:
- 諧音字詞,如 配副眼睛-配副眼鏡
- 混淆音字詞,如 流浪織女-牛郎織女
- 字詞順序顛倒,如 伍迪艾倫-艾倫伍迪
- 字詞補(bǔ)全,如 愛有天意-假如愛有天意
- 形似字錯(cuò)誤,如 高梁-高粱
- 中文拼音全拼,如 xingfu-幸福
- 中文拼音縮寫,如 sz-深圳
- 語法錯(cuò)誤,如 想象難以-難以想象
當(dāng)然,針對(duì)不同業(yè)務(wù)場(chǎng)景,這些問題并不一定全部存在,比如輸入法中需要處理前四種,搜索引擎需要處理所有類型,語音識(shí)別后文本糾錯(cuò)只需要處理前兩種, 其中'形似字錯(cuò)誤'主要針對(duì)五筆或者筆畫手寫輸入等。
Solution
規(guī)則的解決思路
深度模型的解決思路
Feature
模型
- kenlm:kenlm統(tǒng)計(jì)語言模型工具
- rnn_attention模型:參考Stanford University的nlc模型,該模型是參加2014英文文本糾錯(cuò)比賽并取得第一名的方法
- rnn_crf模型:參考阿里巴巴2016參賽中文語法糾錯(cuò)比賽CGED2018并取得第一名的方法(整理中)
- seq2seq_attention模型:在seq2seq模型加上attention機(jī)制,對(duì)于長文本效果更好,模型更容易收斂,但容易過擬合
- transformer模型:全attention的結(jié)構(gòu)代替了lstm用于解決sequence to sequence問題,語義特征提取效果更好
- bert模型:中文fine-tuned模型,使用MASK特征糾正錯(cuò)字
- conv_seq2seq模型:基于Facebook出品的fairseq,北京語言大學(xué)團(tuán)隊(duì)改進(jìn)ConvS2S模型用于中文糾錯(cuò),在NLPCC-2018的中文語法糾錯(cuò)比賽中,是唯一使用單模型并取得第三名的成績(jī)
- electra模型:斯坦福和谷歌聯(lián)合提出的一種更具效率的預(yù)訓(xùn)練模型,學(xué)習(xí)文本上下文表示優(yōu)于同等計(jì)算資源的BERT和XLNet
錯(cuò)誤檢測(cè)
- 字粒度:語言模型困惑度(ppl)檢測(cè)某字的似然概率值低于句子文本平均值,則判定該字是疑似錯(cuò)別字的概率大。
- 詞粒度:切詞后不在詞典中的詞是疑似錯(cuò)詞的概率大。
錯(cuò)誤糾正
- 通過錯(cuò)誤檢測(cè)定位所有疑似錯(cuò)誤后,取所有疑似錯(cuò)字的音似、形似候選詞,
- 使用候選詞替換,基于語言模型得到類似翻譯模型的候選排序結(jié)果,得到最優(yōu)糾正詞。
思考
Install
- 全自動(dòng)安裝:pip install pycorrector
- 半自動(dòng)安裝:
通過以上兩種方法的任何一種完成安裝都可以。如果不想安裝,可以下載github源碼包,安裝下面依賴再使用。
安裝依賴
- kenlm安裝
- 其他庫包安裝
Usage
- 文本糾錯(cuò)
output:
少先隊(duì)員應(yīng)該為老人讓座 [[('因該', '應(yīng)該', 4, 6)], [('坐', '座', 10, 11)]]規(guī)則方法默認(rèn)會(huì)從路徑~/.pycorrector/datasets/zh_giga.no_cna_cmn.prune01244.klm加載kenlm語言模型文件,如果檢測(cè)沒有該文件,則程序會(huì)自動(dòng)聯(lián)網(wǎng)下載。當(dāng)然也可以手動(dòng)下載模型文件(2.8G)并放置于該位置。
- 錯(cuò)誤檢測(cè)
output:
[['因該', 4, 6, 'word'], ['坐', 10, 11, 'char']]返回類型是list,?[error_word, begin_pos, end_pos, error_type],pos索引位置以0開始。
- 關(guān)閉字粒度糾錯(cuò)
output:
'我的喉嚨發(fā)炎了要買點(diǎn)阿莫西林吉', [['細(xì)林', '西林', 12, 14], ['吃', '吉', 14, 15]]上例中吃發(fā)生誤糾,如下代碼關(guān)閉字粒度糾錯(cuò):
output:
'我的喉嚨發(fā)炎了要買點(diǎn)阿莫西林吃', [['細(xì)林', '西林', 12, 14]]默認(rèn)字粒度、詞粒度的糾錯(cuò)都打開,一般情況下單字錯(cuò)誤發(fā)生較少,而且字粒度糾錯(cuò)準(zhǔn)確率較低。關(guān)閉字粒度糾錯(cuò),這樣可以提高糾錯(cuò)準(zhǔn)確率,提高糾錯(cuò)速度。
默認(rèn)enable_char_error方法的enable參數(shù)為True,即打開錯(cuò)字糾正,這種方式可以召回字粒度錯(cuò)誤,但是整體準(zhǔn)確率會(huì)低;
如果追求準(zhǔn)確率而不追求召回率的話,建議將enable設(shè)為False,僅使用錯(cuò)詞糾正。
- 加載自定義混淆集
通過加載自定義混淆集,支持用戶糾正已知的錯(cuò)誤,包括兩方面功能:1)錯(cuò)誤補(bǔ)召回;2)誤殺加白。
output:
具體demo見example/use_custom_confusion.py,其中./my_custom_confusion.txt的內(nèi)容格式如下,以空格間隔:
set_custom_confusion_dict方法的path參數(shù)為用戶自定義混淆集文件路徑。
- 加載自定義語言模型
默認(rèn)提供下載并使用的kenlm語言模型zh_giga.no_cna_cmn.prune01244.klm文件是2.8G,內(nèi)存較小的電腦使用pycorrector程序可能會(huì)吃力些。
支持用戶加載自己訓(xùn)練的kenlm語言模型,或使用2014版人民日?qǐng)?bào)數(shù)據(jù)訓(xùn)練的模型,模型小(20M),準(zhǔn)確率低些。
output:
少先隊(duì)員應(yīng)該為老人讓座 [[('因該', '應(yīng)該', 4, 6)], [('坐', '座', 10, 11)]]具體demo見example/load_custom_language_model.py,其中./people_chars_lm.klm是自定義語言模型文件。
- 英文拼寫糾錯(cuò)
支持英文單詞的拼寫錯(cuò)誤糾正。
output:
- 中文簡(jiǎn)繁互換
支持中文繁體到簡(jiǎn)體的轉(zhuǎn)換,和簡(jiǎn)體到繁體的轉(zhuǎn)換。
output:
Command Line Usage
- 命令行模式
支持批量文本糾錯(cuò)。
case:
python -m pycorrector input.txt -o out.txt -n -d輸入文件:input.txt;輸出文件:out.txt;關(guān)閉字粒度糾錯(cuò);打印詳細(xì)糾錯(cuò)信息;糾錯(cuò)結(jié)果以\t間隔
Evaluate
提供評(píng)估腳本pycorrector/utils/eval.py,該腳本有兩個(gè)功能:
- 構(gòu)建評(píng)估樣本集:自動(dòng)生成評(píng)估集pycorrector/data/eval_corpus.json, 包括字粒度錯(cuò)誤100條、詞粒度錯(cuò)誤100條、語法錯(cuò)誤100條,正確句子200條。用戶可以修改條數(shù)生成其他評(píng)估樣本分布。
- 計(jì)算糾錯(cuò)準(zhǔn)召率:采用保守計(jì)算方式,簡(jiǎn)單把糾錯(cuò)之后與正確句子完成匹配的視為正確,否則為錯(cuò)。
執(zhí)行該腳本后得到,規(guī)則方法糾錯(cuò)效果評(píng)估如下:
- 準(zhǔn)確率:320/500=64%
- 召回率:152/300=50.67%
看來還有比較大的提升空間,誤殺和漏召回的都有。
深度模型使用說明
安裝依賴
pip install -r requirements-dev.txt介紹
本項(xiàng)目的初衷之一是比對(duì)、共享各種文本糾錯(cuò)方法,拋磚引玉的作用,如果對(duì)大家在文本糾錯(cuò)任務(wù)上有一點(diǎn)小小的啟發(fā)就是我莫大的榮幸了。
主要使用了多種深度模型應(yīng)用于文本糾錯(cuò)任務(wù),分別是前面模型小節(jié)介紹的conv_seq2seq、seq2seq_attention、?transformer、bert、electra,各模型方法內(nèi)置于pycorrector文件夾下,有README.md詳細(xì)指導(dǎo),各模型可獨(dú)立運(yùn)行,相互之間無依賴。
使用方法
各模型均可獨(dú)立的預(yù)處理數(shù)據(jù)、訓(xùn)練、預(yù)測(cè),下面以其中seq2seq_attention為例:
seq2seq_attention 模型使用示例:
配置
通過修改config.py。
數(shù)據(jù)預(yù)處理
自動(dòng)新建文件夾output,在output下生成train.txt和test.txt文件,以TAB("\t")間隔錯(cuò)誤文本和糾正文本,文本以空格切分詞,文件內(nèi)容示例:
訓(xùn)練
python train.py訓(xùn)練過程截圖:?
預(yù)測(cè)
python infer.py預(yù)測(cè)輸出效果樣例:
PS:
自定義語言模型
語言模型對(duì)于糾錯(cuò)步驟至關(guān)重要,當(dāng)前默認(rèn)使用的是從千兆中文文本訓(xùn)練的中文語言模型zh_giga.no_cna_cmn.prune01244.klm(2.8G)。
大家可以用中文維基(繁體轉(zhuǎn)簡(jiǎn)體,pycorrector.utils.text_utils下有此功能)等語料數(shù)據(jù)訓(xùn)練通用的語言模型,或者也可以用專業(yè)領(lǐng)域語料訓(xùn)練更專用的語言模型。更適用的語言模型,對(duì)于糾錯(cuò)效果會(huì)有比較好的提升。
人民日?qǐng)?bào)2014版熟語料,網(wǎng)盤鏈接:https://pan.baidu.com/s/1971a5XLQsIpL0zL0zxuK2A?密碼:uc11。尊重版權(quán),傳播請(qǐng)注明出處。
中文糾錯(cuò)數(shù)據(jù)集
貢獻(xiàn)及優(yōu)化點(diǎn)
- [x] 優(yōu)化形似字字典,提高形似字糾錯(cuò)準(zhǔn)確率
- [x] 整理中文糾錯(cuò)訓(xùn)練數(shù)據(jù),使用seq2seq做深度中文糾錯(cuò)模型
- [x] 添加中文語法錯(cuò)誤檢測(cè)及糾正能力
- [x] 規(guī)則方法添加用戶自定義糾錯(cuò)集,并將其糾錯(cuò)優(yōu)先度調(diào)為最高
- [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] 升級(jí)代碼,兼容TensorFlow 2.0庫
- [x] 升級(jí)bert糾錯(cuò)邏輯,提升基于mask的糾錯(cuò)效果
- [x] 新增基于electra模型的糾錯(cuò)邏輯,參數(shù)更小,預(yù)測(cè)更快
討論群
微信交流群,感興趣的同學(xué)可以加入溝通NLP文本糾錯(cuò)相關(guān)技術(shù),issues上回復(fù)不及時(shí)也可以在群里面提問。
PS: 由于微信群滿100人了,掃碼加不了。掃我微信二維碼,或者搜索我微信號(hào):xuming624, 備注:個(gè)人名稱-NLP糾錯(cuò)?進(jìn)群。
?
?
引用
如果你在研究中使用了pycorrector,請(qǐng)按如下格式引用:
License
pycorrector 的授權(quán)協(xié)議為?Apache License 2.0,可免費(fèi)用做商業(yè)用途。請(qǐng)?jiān)诋a(chǎn)品說明中附加pycorrector的鏈接和授權(quán)協(xié)議。pycorrector受版權(quán)法保護(hù),侵權(quán)必究。
References
- 基于文法模型的中文糾錯(cuò)系統(tǒng)
- 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]
- 基于深度學(xué)習(xí)的中文文本自動(dòng)校對(duì)研究與實(shí)現(xiàn)[楊宗霖, 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:
少先隊(duì)員應(yīng)該為老人讓座 [[('因該', '應(yīng)該', 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)
總結(jié)
以上是生活随笔為你收集整理的文本纠错pycorrector的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文浅尝 | 弱监督关系抽取的深度残差学
- 下一篇: 2019年招聘过程的种种酸甜苦辣历程