中文文本纠错工具推荐:pycorrector
pycorrector
https://github.com/shibing624/pycorrector
中文文本糾錯(cuò)工具。音似、形似錯(cuò)字(或變體字)糾正,可用于中文拼音、筆畫輸入法的錯(cuò)誤糾正。python3開發(fā)。
pycorrector依據(jù)語言模型檢測(cè)錯(cuò)別字位置,通過拼音音似特征、筆畫五筆編輯距離特征及語言模型困惑度特征糾正錯(cuò)別字。
Guide
-
Question
-
Solution
-
Feature
-
Evaluate
-
Install
-
Usage
-
Deep Model Usage
-
Dataset
-
Custom Language Model
-
Reference
Question
中文文本糾錯(cuò)任務(wù),常見錯(cuò)誤類型包括:
- 諧音字詞,如 配副眼睛-配副眼鏡
- 混淆音字詞,如 流浪織女-牛郎織女
- 字詞順序顛倒,如 伍迪艾倫-艾倫伍迪
- 字詞補(bǔ)全,如 愛有天意-假如愛有天意
- 形似字錯(cuò)誤,如 高梁-高粱
- 中文拼音全拼,如 xingfu-幸福
- 中文拼音縮寫,如 sz-深圳
- 語法錯(cuò)誤,如 想象難以-難以想象
當(dāng)然,針對(duì)不同業(yè)務(wù)場(chǎng)景,這些問題并不一定全部存在,比如輸入法中需要處理前四種,搜索引擎需要處理所有類型,語音識(shí)別后文本糾錯(cuò)只需要處理前兩種,
其中’形似字錯(cuò)誤’主要針對(duì)五筆或者筆畫手寫輸入等。本項(xiàng)目重點(diǎn)解決其中的諧音、混淆音、形似字錯(cuò)誤、中文拼音全拼、語法錯(cuò)誤帶來的糾錯(cuò)任務(wù)。
Solution
規(guī)則的解決思路
整合這兩種粒度的疑似錯(cuò)誤結(jié)果,形成疑似錯(cuò)誤位置候選集;
PS:網(wǎng)友源碼解讀
深度模型的解決思路
Feature
模型
- kenlm:kenlm統(tǒng)計(jì)語言模型工具,規(guī)則方法,語言模型糾錯(cuò),利用混淆集,擴(kuò)展性強(qiáng)
- deep_context模型:參考Stanford University的nlc模型,該模型是參加2014英文文本糾錯(cuò)比賽并取得第一名的方法
- Seq2Seq模型:在Seq2Seq模型加上attention機(jī)制,對(duì)于長(zhǎng)文本效果更好,模型更容易收斂,但容易過擬合
- ConvSeq2Seq模型:基于Facebook出品的fairseq,北京語言大學(xué)團(tuán)隊(duì)改進(jìn)ConvS2S模型用于中文糾錯(cuò),在NLPCC-2018的中文語法糾錯(cuò)比賽中,是唯一使用單模型并取得第三名的成績(jī)
- transformer模型:全attention的結(jié)構(gòu)代替了lstm用于解決sequence to sequence問題,語義特征提取效果更好
- BERT模型:中文fine-tuned模型,使用MASK特征糾正錯(cuò)字
- ELECTRA模型:斯坦福和谷歌聯(lián)合提出的一種更具效率的預(yù)訓(xùn)練模型,學(xué)習(xí)文本上下文表示優(yōu)于同等計(jì)算資源的BERT和XLNet
- ERNIE模型:百度公司提出的基于知識(shí)增強(qiáng)的語義表示模型,有可適配中文的強(qiáng)大語義表征能力。在情感分析、文本匹配、自然語言推理、詞法分析、閱讀理解、智能問答等16個(gè)公開數(shù)據(jù)集上超越世界領(lǐng)先技術(shù)
- MacBERT模型:來自哈工大SCIR實(shí)驗(yàn)室2020年的工作,改進(jìn)了BERT模型的訓(xùn)練方法,使用全詞掩蔽和N-Gram掩蔽策略適配中文表達(dá),和通過用其相似的單詞來掩蓋單詞,從而縮小訓(xùn)練前和微調(diào)階段之間的差距
錯(cuò)誤檢測(cè)
- 字粒度:語言模型困惑度(ppl)檢測(cè)某字的似然概率值低于句子文本平均值,則判定該字是疑似錯(cuò)別字的概率大。
- 詞粒度:切詞后不在詞典中的詞是疑似錯(cuò)詞的概率大。
錯(cuò)誤糾正
- 通過錯(cuò)誤檢測(cè)定位所有疑似錯(cuò)誤后,取所有疑似錯(cuò)字的音似、形似候選詞,
- 使用候選詞替換,基于語言模型得到類似翻譯模型的候選排序結(jié)果,得到最優(yōu)糾正詞。
思考
Demo
http://42.193.145.218/product/corrector/
Evaluate
查看評(píng)估結(jié)論提供評(píng)估腳本pycorrector/utils/eval.py和評(píng)估執(zhí)行腳本examples/evaluate_models.py,該腳本有兩個(gè)功能:
- 構(gòu)建評(píng)估樣本集:評(píng)估集pycorrector/data/eval_corpus.json, 包括字粒度錯(cuò)誤100條、詞粒度錯(cuò)誤100條、語法錯(cuò)誤100條,正確句子200條。用戶可以修改條數(shù)生成其他評(píng)估樣本分布。
- 計(jì)算兩個(gè)數(shù)據(jù)集的糾錯(cuò)準(zhǔn)召率:采用保守計(jì)算方式,簡(jiǎn)單把糾錯(cuò)之后與正確句子完成匹配的視為正確,否則為錯(cuò)。
測(cè)試環(huán)境:
- 機(jī)器:linux(centos7) 線上機(jī)
- CPU:28核 Intel? Xeon? Gold 5117 CPU @ 2.00GHz
- GPU:Tesla P40,顯存 22919 MiB(22 GB)
- 內(nèi)存:251 GB
| sighan_15 | rule | cpu | 17.98% | 15.37% | 11 | 9 |
| sighan_15 | bert | gpu | 37.62% | 36.46% | 95 | 1.05 |
| sighan_15 | ernie | gpu | 29.70% | 28.13% | 102 | 0.98 |
| sighan_15 | macbert | gpu | 63.64% | 63.64% | 2 | 50 |
| corpus500 | rule | cpu | 48.60% | 28.13% | 11 | 9 |
| corpus500 | bert | gpu | 58.60% | 35.00% | 95 | 1.05 |
| corpus500 | ernie | gpu | 59.80% | 41.33% | 102 | 0.98 |
| corpus500 | macbert | gpu | 56.20% | 42.67% | 2 | 50 |
Install
- 全自動(dòng)安裝:pip install pycorrector
- 半自動(dòng)安裝:
通過以上兩種方法的任何一種完成安裝都可以。如果不想安裝依賴包,直接使用docker拉取安裝好的部署環(huán)境即可。
安裝依賴
- docker使用
后續(xù)調(diào)用python3使用即可,該鏡像已經(jīng)安裝好kenlm、pycorrector等包,具體參見Dockerfile。
使用示例:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-2ngSbsRv-1636205742536)(docs/git_image/docker.png)]
- kenlm安裝
安裝kenlm-wiki
- 其他庫包安裝
Usage
- 文本糾錯(cuò)
示例base_demo.py
import pycorrectorcorrected_sent, detail = pycorrector.correct('少先隊(duì)員因該為老人讓坐') print(corrected_sent, detail)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è)
示例detect_demo.py
import pycorrectoridx_errors = pycorrector.detect('少先隊(duì)員因該為老人讓坐') print(idx_errors)output:
[['因該', 4, 6, 'word'], ['坐', 10, 11, 'char']]返回類型是list, [error_word, begin_pos, end_pos, error_type],pos索引位置以0開始。
- 關(guān)閉字粒度糾錯(cuò)
示例disable_char_error.py
import pycorrectorerror_sentence_1 = '我的喉嚨發(fā)炎了要買點(diǎn)阿莫細(xì)林吃' correct_sent = pycorrector.correct(error_sentence_1) print(correct_sent)output:
'我的喉嚨發(fā)炎了要買點(diǎn)阿莫西林吉', [('細(xì)林', '西林', 12, 14), ('吃', '吉', 14, 15)]上例中吃發(fā)生誤糾,如下代碼關(guān)閉字粒度糾錯(cuò):
import pycorrectorerror_sentence_1 = '我的喉嚨發(fā)炎了要買點(diǎn)阿莫細(xì)林吃' pycorrector.enable_char_error(enable=False) correct_sent = pycorrector.correct(error_sentence_1) print(correct_sent)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)誤殺加白。
示例use_custom_confusion.py
import pycorrectorpycorrector.set_log_level('INFO') error_sentences = ['買iphonex,要多少錢','共同實(shí)際控制人蕭華、霍榮銓、張旗康', ] for line in error_sentences:print(pycorrector.correct(line))print('*' * 42) pycorrector.set_custom_confusion_dict(path='./my_custom_confusion.txt') for line in error_sentences:print(pycorrector.correct(line))output:
('買iphonex,要多少錢', []) # "iphonex"漏召,應(yīng)該是"iphoneX" ('共同實(shí)際控制人蕭華、霍榮銓、張啟康', [['張旗康', '張啟康', 14, 17]]) # "張啟康"誤殺,應(yīng)該不用糾 ***************************************************** ('買iphonex,要多少錢', [['iphonex', 'iphoneX', 1, 8]]) ('共同實(shí)際控制人蕭華、霍榮銓、張旗康', [])具體demo見example/use_custom_confusion.py,其中./my_custom_confusion.txt的內(nèi)容格式如下,以空格間隔:
iPhone差 iPhoneX 100 張旗康 張旗康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)練的模型,模型小(140M),準(zhǔn)確率低些。
示例load_custom_language_model.py,其中people2014corpus_chars.klm(密碼o5e9)是自定義語言模型文件。
from pycorrector import Corrector import os pwd_path = os.path.abspath(os.path.dirname(__file__)) lm_path = os.path.join(pwd_path, './people2014corpus_chars.klm') model = Corrector(language_model_path=lm_path)corrected_sent, detail = model.correct('少先隊(duì)員因該為老人讓坐') print(corrected_sent, detail)output:
少先隊(duì)員應(yīng)該為老人讓座 [('因該', '應(yīng)該', 4, 6), ('坐', '座', 10, 11)]- 英文拼寫糾錯(cuò)
支持英文單詞的拼寫錯(cuò)誤糾正。
示例en_correct_demo.py
import pycorrectorsent = "what happending? how to speling it, can you gorrect it?" corrected_text, details = pycorrector.en_correct(sent) print(sent, '=>', corrected_text) print(details)output:
what happending? how to speling it, can you gorrect it? => what happening? how to spelling it, can you correct it? [('happending', 'happening', 5, 15), ('speling', 'spelling', 24, 31), ('gorrect', 'correct', 44, 51)]- 中文簡(jiǎn)繁互換
支持中文繁體到簡(jiǎn)體的轉(zhuǎn)換,和簡(jiǎn)體到繁體的轉(zhuǎn)換。
示例traditional_simplified_chinese_demo.py
import pycorrectortraditional_sentence = '憂郁的臺(tái)灣烏龜' simplified_sentence = pycorrector.traditional2simplified(traditional_sentence) print(traditional_sentence, '=>', simplified_sentence)simplified_sentence = '憂郁的臺(tái)灣烏龜' traditional_sentence = pycorrector.simplified2traditional(simplified_sentence) print(simplified_sentence, '=>', traditional_sentence)output:
憂郁的臺(tái)灣烏龜 => 憂郁的臺(tái)灣烏龜 憂郁的臺(tái)灣烏龜 => 憂郁的臺(tái)灣烏龜- 命令行模式
支持批量文本糾錯(cuò)
python -m pycorrector -h usage: __main__.py [-h] -o OUTPUT [-n] [-d] input@description:positional arguments:input the input file path, file encode need utf-8.optional arguments:-h, --help show this help message and exit-o OUTPUT, --output OUTPUTthe output file path.-n, --no_char disable char detect mode.-d, --detail print detail infocase:
python -m pycorrector input.txt -o out.txt -n -d輸入文件:input.txt;輸出文件:out.txt;關(guān)閉字粒度糾錯(cuò);打印詳細(xì)糾錯(cuò)信息;糾錯(cuò)結(jié)果以\t間隔
Deep Model Usage
安裝依賴
pip install -r requirements-dev.txt介紹
本項(xiàng)目的初衷之一是比對(duì)、共享各種文本糾錯(cuò)方法,拋磚引玉的作用,如果對(duì)大家在文本糾錯(cuò)任務(wù)上有一點(diǎn)小小的啟發(fā)就是我莫大的榮幸了。
主要使用了多種深度模型應(yīng)用于文本糾錯(cuò)任務(wù),分別是前面模型小節(jié)介紹的seq2seq、
transformer、bert、macbert、electra,各模型方法內(nèi)置于pycorrector文件夾下,有README.md詳細(xì)指導(dǎo),各模型可獨(dú)立運(yùn)行,相互之間無依賴。
使用方法
各模型均可獨(dú)立的預(yù)處理數(shù)據(jù)、訓(xùn)練、預(yù)測(cè)。
- MacBert模型
基于MacBert預(yù)訓(xùn)練模型的糾錯(cuò)
示例macbert_demo.py,詳細(xì)教程參考README
下載fine-tune后的預(yù)訓(xùn)練MacBert MLM模型-密碼QKz3,解壓后放置于~/.pycorrector/dataset/macbert_models/chinese_finetuned_correction目錄下。
macbert_models └── chinese_finetuned_correction├── config.json├── added_tokens.json├── pytorch_model.bin├── special_tokens_map.json├── tokenizer_config.json└── vocab.txtoutput:
query:真麻煩你了。希望你們好好的跳無 => 真麻煩你了。希望你們好好的跳舞, err:[('無', '舞', 14, 15)] query:少先隊(duì)員因該為老人讓坐 => 少先隊(duì)員應(yīng)該為老人讓坐, err:[('因', '應(yīng)', 4, 5)] query:機(jī)七學(xué)習(xí)是人工智能領(lǐng)遇最能體現(xiàn)智能的一個(gè)分知 => 機(jī)器學(xué)習(xí)是人工智能領(lǐng)域最能體現(xiàn)智能的一個(gè)分知, err:[('七', '器', 1, 2), ('遇', '域', 10, 11)] query:一只小魚船浮在平凈的河面上 => 一只小魚船浮在平凈的河面上, err:[] query:我的家鄉(xiāng)是有明的漁米之鄉(xiāng) => 我的家鄉(xiāng)是有名的漁米之鄉(xiāng), err:[('明', '名', 6, 7)] 查看Seq2Seq模型- Seq2Seq模型
seq2seq 模型使用示例:
配置
通過修改config.py。
數(shù)據(jù)預(yù)處理
cd seq2seq # 數(shù)據(jù)預(yù)處理 python preprocess.py自動(dòng)新建文件夾output,在output下生成train.txt和test.txt文件,以TAB("\t")間隔錯(cuò)誤文本和糾正文本,文本以空格切分詞,文件內(nèi)容示例:
希 望 少 吸 煙 。 希 望 煙 民 們 少 吸 煙 。 以 前 , 包 括 中 國(guó) , 我 國(guó) 也 是 。 以 前 , 不 僅 中 國(guó) , 我 國(guó) 也 是 。 我 現(xiàn) 在 好 得 多 了 。 我 現(xiàn) 在 好 多 了 。訓(xùn)練
python train.py設(shè)置config.py中arch='convseq2seq',訓(xùn)練sighan數(shù)據(jù)集(2104條樣本),200個(gè)epoch,單卡P40GPU訓(xùn)練耗時(shí):3分鐘。
預(yù)測(cè)
python infer.py預(yù)測(cè)輸出效果樣例截圖:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-ptmhIWA3-1636205742537)(./docs/git_image/convseq2seq_ret.png)]
PS:
Dataset
| 人民日?qǐng)?bào)2014版語料 | 人民日?qǐng)?bào)2014版 | 百度網(wǎng)盤(密碼uc11) 飛書(密碼cHcu) | 383M |
| NLPCC 2018 GEC官方數(shù)據(jù)集 | NLPCC2018-GEC | 官方trainingdata | 114M |
| NLPCC 2018+HSK熟語料 | nlpcc2018+hsk+CGED | 百度網(wǎng)盤(密碼m6fg) 飛書(密碼gl9y) | 215M |
| NLPCC 2018+HSK原始語料 | HSK+Lang8 | 百度網(wǎng)盤(密碼n31j) 飛書(密碼Q9LH) | 81M |
訓(xùn)練集trainingdata[解壓后114.5MB],該數(shù)據(jù)格式是原始文本,未做切詞處理。
Custom Language Model
什么是語言模型?-wiki
語言模型對(duì)于糾錯(cuò)步驟至關(guān)重要,當(dāng)前默認(rèn)使用的是從千兆中文文本訓(xùn)練的中文語言模型zh_giga.no_cna_cmn.prune01244.klm(2.8G),
此處也提供人民日?qǐng)?bào)2014版語料訓(xùn)練得到的輕量版語言模型people2014corpus_chars.klm(密碼o5e9)。
大家可以用中文維基(繁體轉(zhuǎn)簡(jiǎn)體,pycorrector.utils.text_utils下有此功能)等語料數(shù)據(jù)訓(xùn)練通用的語言模型,或者也可以用專業(yè)領(lǐng)域語料訓(xùn)練更專用的語言模型。更適用的語言模型,對(duì)于糾錯(cuò)效果會(huì)有比較好的提升。
1)標(biāo)準(zhǔn)人工切詞及詞性數(shù)據(jù)people2014.tar.gz,
2)未切詞文本數(shù)據(jù)people2014_words.txt,
3)kenlm訓(xùn)練字粒度語言模型文件及其二進(jìn)制文件people2014corpus_chars.arps/klm,
4)kenlm詞粒度語言模型文件及其二進(jìn)制文件people2014corpus_words.arps/klm。
尊重版權(quán),傳播請(qǐng)注明出處。
Todo
- 優(yōu)化形似字字典,提高形似字糾錯(cuò)準(zhǔn)確率
- 整理中文糾錯(cuò)訓(xùn)練數(shù)據(jù),使用seq2seq做深度中文糾錯(cuò)模型
- 添加中文語法錯(cuò)誤檢測(cè)及糾正能力
- 規(guī)則方法添加用戶自定義糾錯(cuò)集,并將其糾錯(cuò)優(yōu)先度調(diào)為最高
- seq2seq_attention 添加dropout,減少過擬合
- 在seq2seq模型框架上,新增Pointer-generator network、Beam search、Unknown words replacement、Coverage mechanism等特性
- 更新bert的fine-tuned使用wiki,適配transformers 2.10.0庫
- 升級(jí)代碼,兼容TensorFlow 2.0庫
- 升級(jí)bert糾錯(cuò)邏輯,提升基于mask的糾錯(cuò)效果
- 新增基于electra模型的糾錯(cuò)邏輯,參數(shù)更小,預(yù)測(cè)更快
- 新增專用于糾錯(cuò)任務(wù)深度模型,使用bert/ernie預(yù)訓(xùn)練模型,加入文本音似、形似特征。
- 規(guī)則方法,改進(jìn)generate_items疑似錯(cuò)字生成函數(shù),提速并優(yōu)化邏輯。
- 預(yù)測(cè)提速,規(guī)則方法加入vertebi動(dòng)態(tài)規(guī)劃,深度模型使用beamsearch搜索結(jié)果,引入GPU + fp16預(yù)測(cè)部署。
- 語言模型糾錯(cuò)ppl閾值參數(shù),使用動(dòng)態(tài)調(diào)整方法替換寫死的閾值。
Reference
- 基于文法模型的中文糾錯(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
- Revisiting Pre-trained Models for Chinese Natural Language Processing
總結(jié)
以上是生活随笔為你收集整理的中文文本纠错工具推荐:pycorrector的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android EditText 不得不
- 下一篇: [js] 如何提升JSON.string