pycorrector:一鍵式文本糾錯工具,整合了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer、T5等多種模型,讓您立即享受糾錯的便利和效果
pycorrector: 中文文本糾錯工具。支持中文音似、形似、語法錯誤糾正,python3開發。實現了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer等多種模型的文本糾錯,并在SigHAN數據集評估各模型的效果。
1.中文文本糾錯任務,常見錯誤類型:
當然,針對不同業務場景,這些問題并不一定全部存在,比如拼音輸入法、語音識別校對關注音似錯誤;五筆輸入法、OCR校對關注形似錯誤,
搜索引擎query糾錯關注所有錯誤類型。
本項目重點解決其中的"音似、形字、語法、專名錯誤"等類型。
2.解決方案
2.1 規則的解決思路
依據語言模型檢測錯別字位置,通過拼音音似特征、筆畫五筆編輯距離特征及語言模型困惑度特征糾正錯別字。
- 中文糾錯分為兩步走,第一步是錯誤檢測,第二步是錯誤糾正;
- 錯誤檢測部分先通過結巴中文分詞器切詞,由于句子中含有錯別字,所以切詞結果往往會有切分錯誤的情況,這樣從字粒度和詞粒度兩方面檢測錯誤, 整合這兩種粒度的疑似錯誤結果,形成疑似錯誤位置候選集;
- 錯誤糾正部分,是遍歷所有的疑似錯誤位置,并使用音似、形似詞典替換錯誤位置的詞,然后通過語言模型計算句子困惑度,對所有候選集結果比較并排序,得到最優糾正詞。
2.2 深度模型的解決思路
- 端到端的深度模型可以避免人工提取特征,減少人工工作量,RNN序列模型對文本任務擬合能力強,RNN Attn在英文文本糾錯比賽中取得第一名成績,證明應用效果不錯;
- CRF會計算全局最優輸出節點的條件概率,對句子中特定錯誤類型的檢測,會根據整句話判定該錯誤,阿里參賽2016中文語法糾錯任務并取得第一名,證明應用效果不錯;
- Seq2Seq模型是使用Encoder-Decoder結構解決序列轉換問題,目前在序列轉換任務中(如機器翻譯、對話生成、文本摘要、圖像描述)使用最廣泛、效果最好的模型之一;
- BERT/ELECTRA/ERNIE/MacBERT等預訓練模型強大的語言表征能力,對NLP屆帶來翻天覆地的改變,海量的訓練數據擬合的語言模型效果無與倫比,基于其MASK掩碼的特征,可以簡單改造預訓練模型用于糾錯,加上fine-tune,效果輕松達到最優。
PS:
- 作者糾錯分享
- 網友源碼解讀
2.2 模型推薦
-
Kenlm模型:本項目基于Kenlm統計語言模型工具訓練了中文NGram語言模型,結合規則方法、混淆集可以糾正中文拼寫錯誤,方法速度快,擴展性強,效果一般
-
MacBERT模型【推薦】:本項目基于PyTorch實現了用于中文文本糾錯的MacBERT4CSC模型,模型加入了錯誤檢測和糾正網絡,適配中文拼寫糾錯任務,效果好
-
Seq2Seq模型:本項目基于PyTorch實現了用于中文文本糾錯的Seq2Seq模型、ConvSeq2Seq模型,其中ConvSeq2Seq在NLPCC-2018的中文語法糾錯比賽中,使用單模型并取得第三名,可以并行訓練,模型收斂快,效果一般
-
T5模型:本項目基于PyTorch實現了用于中文文本糾錯的T5模型,使用Langboat/mengzi-t5-base的預訓練模型fine-tune中文糾錯數據集,模型改造的潛力較大,效果好
-
BERT模型:本項目基于PyTorch實現了基于原生BERT的fill-mask能力進行糾正錯字的方法,效果差
-
ELECTRA模型:本項目基于PyTorch實現了基于原生ELECTRA的fill-mask能力進行糾正錯字的方法,效果差
-
ERNIE_CSC模型:本項目基于PaddlePaddle實現了用于中文文本糾錯的ERNIE_CSC模型,模型在ERNIE-1.0上fine-tune,模型結構適配了中文拼寫糾錯任務,效果好
-
DeepContext模型:本項目基于PyTorch實現了用于文本糾錯的DeepContext模型,該模型結構參考Stanford University的NLC模型,2014英文糾錯比賽得第一名,效果一般
-
Transformer模型:本項目基于PyTorch的fairseq庫調研了Transformer模型用于中文文本糾錯,效果一般
-
思考
- 規則的方法,在詞粒度的錯誤召回還不錯,但錯誤糾正的準確率還有待提高,更多優質的糾錯集及糾錯詞庫會有提升,我更希望算法模型上有更大的突破。
- 現在的文本錯誤不再局限于字詞粒度上的拼寫錯誤,需要提高中文語法錯誤檢測(CGED, Chinese Grammar Error Diagnosis)及糾正能力,列在TODO中,后續調研。
3.Demo演示
Official Demo: https://www.mulanai.com/product/corrector/
HuggingFace Demo: https://huggingface.co/spaces/shibing624/pycorrector
run example: examples/gradio_demo.py to see the demo:
python examples/gradio_demo.py
4.模型評估(sighan15評估集)
提供評估腳本examples/evaluate_models.py:
- 使用sighan15評估集:SIGHAN2015的測試集pycorrector/data/cn/sighan_2015/test.tsv
,已經轉為簡體中文。 - 評估標準:糾錯準召率,采用嚴格句子粒度(Sentence Level)計算方式,把模型糾正之后的與正確句子完成相同的視為正確,否則為錯。
- 評估結果
評估數據集:SIGHAN2015測試集
GPU:Tesla V100,顯存 32 GB
Model Name | Model Hub Link | Backbone | GPU | Precision | Recall | F1 | QPS |
---|---|---|---|---|---|---|---|
Rule | - | kenlm | CPU | 0.6860 | 0.1529 | 0.2500 | 9 |
BERT-CSC | - | bert-base-chinese | GPU | 0.8029 | 0.4052 | 0.5386 | 2 |
BART-CSC | shibing624/bart4csc-base-chinese | fnlp/bart-base-chinese | GPU | 0.6984 | 0.6354 | 0.6654 | 58 |
T5-CSC | - | byt5-small | GPU | 0.5220 | 0.3941 | 0.4491 | 111 |
Mengzi-T5-CSC | shibing624/mengzi-t5-base-chinese-correction | mengzi-t5-base | GPU | 0.8321 | 0.6390 | 0.7229 | 214 |
ConvSeq2Seq-CSC | - | ConvSeq2Seq | GPU | 0.2415 | 0.1436 | 0.1801 | 6 |
ChatGLM-6B-CSC | shibing624/chatglm-6b-csc-zh-lora | ChatGLM | GPU | 0.5263 | 0.4052 | 0.4579 | 4 |
MacBERT-CSC | shibing624/macbert4csc-base-chinese | hfl/chinese-macbert-base | GPU | 0.8254 | 0.7311 | 0.7754 | 224 |
- 結論
- 中文拼寫糾錯模型效果最好的是MacBert-CSC,模型名稱是shibing624/macbert4csc-base-chinese,huggingface model:shibing624/macbert4csc-base-chinese
- 中文語法糾錯模型效果最好的是BART-CSC,模型名稱是shibing624/bart4csc-base-chinese,huggingface model:shibing624/bart4csc-base-chinese
- 最具潛力的模型是Mengzi-T5-CSC,模型名稱是shibing624/mengzi-t5-base-chinese-correction,huggingface model:shibing624/mengzi-t5-base-chinese-correction,未改變模型結構,僅fine-tune中文糾錯數據集,已經在
SIGHAN 2015
取得接近SOTA的效果 - 基于ChatGLM-6B的糾錯微調模型效果也不錯,模型名稱是shibing624/chatglm-6b-csc-zh-lora,huggingface model:shibing624/chatglm-6b-csc-zh-lora,大模型不僅能改錯還能潤色句子,但是模型太大,推理速度慢
5.使用指南
pip install -U pycorrector
or
pip install -r requirements.txtgit clone https://github.com/shibing624/pycorrector.git
cd pycorrector
pip install --no-deps .
通過以上兩種方法的任何一種完成安裝都可以。如果不想安裝依賴包,直接使用docker拉取安裝好的部署環境即可。
-
安裝依賴
-
docker使用
docker run -it -v ~/.pycorrector:/root/.pycorrector shibing624/pycorrector:0.0.2
后續調用python使用即可,該鏡像已經安裝好kenlm、pycorrector等包,具體參見Dockerfile。
使用示例:
- kenlm安裝
pip install kenlm
安裝kenlm-wiki
- 其他庫包安裝
pip install -r requirements.txt
6.應用場景
6.1 文本糾錯
example: examples/base_demo.py
import pycorrectorcorrected_sent, detail = pycorrector.correct('少先隊員因該為老人讓坐')
print(corrected_sent, detail)
output:
少先隊員應該為老人讓座 [('因該', '應該', 4, 6), ('坐', '座', 10, 11)]
規則方法默認會從路徑
~/.pycorrector/datasets/zh_giga.no_cna_cmn.prune01244.klm
加載kenlm語言模型文件,如果檢測沒有該文件,
則程序會自動聯網下載。當然也可以手動下載模型文件(2.8G)并放置于該位置。
6.2 錯誤檢測
example: examples/detect_demo.py
import pycorrectoridx_errors = pycorrector.detect('少先隊員因該為老人讓坐')
print(idx_errors)
output:
[['因該', 4, 6, 'word'], ['坐', 10, 11, 'char']]
返回類型是
list
,[error_word, begin_pos, end_pos, error_type]
,pos
索引位置以0開始。
6.3成語、專名糾錯
example: examples/proper_correct_demo.py
import syssys.path.append("..")
from pycorrector.proper_corrector import ProperCorrectorm = ProperCorrector()
x = ['報應接中邇來','今天在拼哆哆上買了點蘋果',
]for i in x:print(i, ' -> ', m.proper_correct(i))
output:
報應接中邇來 -> ('報應接踵而來', [('接中邇來', '接踵而來', 2, 6)])
今天在拼哆哆上買了點蘋果 -> ('今天在拼多多上買了點蘋果', [('拼哆哆', '拼多多', 3, 6)])
6.4 自定義混淆集
通過加載自定義混淆集,支持用戶糾正已知的錯誤,包括兩方面功能:1)【提升準確率】誤殺加白;2)【提升召回率】補充召回。
example: examples/use_custom_confusion.py
import pycorrectorerror_sentences = ['買iphonex,要多少錢','共同實際控制人蕭華、霍榮銓、張旗康',
]
for line in error_sentences:print(pycorrector.correct(line))print('*' * 42)
pycorrector.set_custom_confusion_path_or_dict('./my_custom_confusion.txt')
for line in error_sentences:print(pycorrector.correct(line))
output:
('買iphonex,要多少錢', []) # "iphonex"漏召,應該是"iphoneX"
('共同實際控制人蕭華、霍榮銓、張啟康', [['張旗康', '張啟康', 14, 17]]) # "張啟康"誤殺,應該不用糾
*****************************************************
('買iphonex,要多少錢', [['iphonex', 'iphoneX', 1, 8]])
('共同實際控制人蕭華、霍榮銓、張旗康', [])
其中
./my_custom_confusion.txt
的內容格式如下,以空格間隔:
iPhone差 iPhoneX
張旗康 張旗康
混淆集功能在
correct
方法中生效;
set_custom_confusion_dict
方法的path
參數為用戶自定義混淆集文件路徑(str)或混淆集字典(dict)。
6.5 自定義語言模型
默認提供下載并使用的kenlm語言模型zh_giga.no_cna_cmn.prune01244.klm
文件是2.8G,內存小的電腦使用pycorrector
程序可能會吃力些。
支持用戶加載自己訓練的kenlm語言模型,或使用2014版人民日報數據訓練的模型,模型小(140M),準確率稍低,模型下載地址:people2014corpus_chars.klm(密碼o5e9)。
example:examples/load_custom_language_model.py
from pycorrector import Corrector
import ospwd_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('少先隊員因該為老人讓坐')
print(corrected_sent, detail)
output:
少先隊員應該為老人讓座 [('因該', '應該', 4, 6), ('坐', '座', 10, 11)]
6.6 英文拼寫糾錯
支持英文單詞級別的拼寫錯誤糾正。
example:examples/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)]
6.7 中文簡繁互換
支持中文繁體到簡體的轉換,和簡體到繁體的轉換。
example:examples/traditional_simplified_chinese_demo.py
import pycorrectortraditional_sentence = '憂郁的臺灣烏龜'
simplified_sentence = pycorrector.traditional2simplified(traditional_sentence)
print(traditional_sentence, '=>', simplified_sentence)simplified_sentence = '憂郁的臺灣烏龜'
traditional_sentence = pycorrector.simplified2traditional(simplified_sentence)
print(simplified_sentence, '=>', traditional_sentence)
output:
憂郁的臺灣烏龜 => 憂郁的臺灣烏龜
憂郁的臺灣烏龜 => 憂郁的臺灣烏龜
6.8 命令行模式
支持批量文本糾錯
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 info
case:
python -m pycorrector input.txt -o out.txt -n -d
輸入文件:
input.txt
;輸出文件:out.txt
;關閉字粒度糾錯;打印詳細糾錯信息;糾錯結果以\t
間隔
本項目的初衷之一是比對、共享各種文本糾錯方法,拋磚引玉的作用,如果對大家在文本糾錯任務上有一點小小的啟發就是我莫大的榮幸了。
主要使用了多種深度模型應用于文本糾錯任務,分別是前面模型
小節介紹的macbert、seq2seq、
bert、electra、transformer
、ernie-csc、T5,各模型方法內置于pycorrector
文件夾下,有README.md
詳細指導,各模型可獨立運行,相互之間無依賴。
- 安裝依賴
pip install -r requirements-dev.txt
8. 模型推薦
各模型均可獨立的預處理數據、訓練、預測。
8.1 MacBert4csc模型[推薦]
基于MacBERT改變網絡結構的中文拼寫糾錯模型,模型已經開源在HuggingFace Models:https://huggingface.co/shibing624/macbert4csc-base-chinese
模型網絡結構:
- 本項目是 MacBERT 改變網絡結構的中文文本糾錯模型,可支持 BERT 類模型為 backbone。
- 在原生 BERT 模型上進行了魔改,追加了一個全連接層作為錯誤檢測即 detection ,
MacBERT4CSC 訓練時用 detection 層和 correction 層的 loss 加權得到最終的 loss。預測時用 BERT MLM 的 correction 權重即可。
詳細教程參考pycorrector/macbert/README.md
example:examples/macbert_demo.py
- 8.1.1 使用pycorrector調用糾錯:
import syssys.path.append("..")
from pycorrector.macbert.macbert_corrector import MacBertCorrectorif __name__ == '__main__':error_sentences = ['真麻煩你了。希望你們好好的跳無','少先隊員因該為老人讓坐','機七學習是人工智能領遇最能體現智能的一個分知','一只小魚船浮在平凈的河面上','我的家鄉是有明的漁米之鄉',]m = MacBertCorrector("shibing624/macbert4csc-base-chinese")for line in error_sentences:correct_sent, err = m.macbert_correct(line)print("query:{} => {}, err:{}".format(line, correct_sent, err))
output:
query:真麻煩你了。希望你們好好的跳無 => 真麻煩你了。希望你們好好的跳舞, err:[('無', '舞', 14, 15)]
query:少先隊員因該為老人讓坐 => 少先隊員應該為老人讓坐, err:[('因', '應', 4, 5)]
query:機七學習是人工智能領遇最能體現智能的一個分知 => 機器學習是人工智能領域最能體現智能的一個分知, err:[('七', '器', 1, 2), ('遇', '域', 10, 11)]
query:一只小魚船浮在平凈的河面上 => 一只小魚船浮在平凈的河面上, err:[]
query:我的家鄉是有明的漁米之鄉 => 我的家鄉是有名的漁米之鄉, err:[('明', '名', 6, 7)]
- 8.1.2 使用原生transformers庫調用糾錯:
import operator
import torch
from transformers import BertTokenizerFast, BertForMaskedLM
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")tokenizer = BertTokenizerFast.from_pretrained("shibing624/macbert4csc-base-chinese")
model = BertForMaskedLM.from_pretrained("shibing624/macbert4csc-base-chinese")
model.to(device)texts = ["今天新情很好", "你找到你最喜歡的工作,我也很高心。"]text_tokens = tokenizer(texts, padding=True, return_tensors='pt').to(device)
with torch.no_grad():outputs = model(**text_tokens)def get_errors(corrected_text, origin_text):sub_details = []for i, ori_char in enumerate(origin_text):if ori_char in [' ', '“', '”', '‘', '’', '\n', '…', '—', '擤']:# add unk wordcorrected_text = corrected_text[:i] + ori_char + corrected_text[i:]continueif i >= len(corrected_text):breakif ori_char != corrected_text[i]:if ori_char.lower() == corrected_text[i]:# pass english upper charcorrected_text = corrected_text[:i] + ori_char + corrected_text[i + 1:]continuesub_details.append((ori_char, corrected_text[i], i, i + 1))sub_details = sorted(sub_details, key=operator.itemgetter(2))return corrected_text, sub_detailsresult = []
for ids, (i, text) in zip(outputs.logits, enumerate(texts)):_text = tokenizer.decode((torch.argmax(ids, dim=-1) * text_tokens.attention_mask[i]),skip_special_tokens=True).replace(' ', '')corrected_text, details = get_errors(_text, text)print(text, ' => ', corrected_text, details)result.append((corrected_text, details))
print(result)
output:
今天新情很好 => 今天心情很好 [('新', '心', 2, 3)]
你找到你最喜歡的工作,我也很高心。 => 你找到你最喜歡的工作,我也很高興。 [('心', '興', 15, 16)]
模型文件:
macbert4csc-base-chinese├── config.json├── added_tokens.json├── pytorch_model.bin├── special_tokens_map.json├── tokenizer_config.json└── vocab.txt
8.2 ErnieCSC模型
基于ERNIE的中文拼寫糾錯模型,模型已經開源在PaddleNLP的
模型庫中https://bj.bcebos.com/paddlenlp/taskflow/text_correction/csc-ernie-1.0/csc-ernie-1.0.pdparams。
模型網絡結構:
詳細教程參考pycorrector/ernie_csc/README.md
example:examples/ernie_csc_demo.py
- 使用pycorrector調用糾錯:
from pycorrector.ernie_csc.ernie_csc_corrector import ErnieCSCCorrectorif __name__ == '__main__':error_sentences = ['真麻煩你了。希望你們好好的跳無','少先隊員因該為老人讓坐','機七學習是人工智能領遇最能體現智能的一個分知','一只小魚船浮在平凈的河面上','我的家鄉是有明的漁米之鄉',]corrector = ErnieCSCCorrector("csc-ernie-1.0")for line in error_sentences:result = corrector.ernie_csc_correct(line)[0]print("query:{} => {}, err:{}".format(line, result['target'], result['errors']))
output:
query:真麻煩你了。希望你們好好的跳無 => 真麻煩你了。希望你們好好的跳舞, err:[{'position': 14, 'correction': {'無': '舞'}}]
query:少先隊員因該為老人讓坐 => 少先隊員應該為老人讓座, err:[{'position': 4, 'correction': {'因': '應'}}, {'position': 10, 'correction': {'坐': '座'}}]
query:機七學習是人工智能領遇最能體現智能的一個分知 => 機器學習是人工智能領域最能體現智能的一個分知, err:[{'position': 1, 'correction': {'七': '器'}}, {'position': 10, 'correction': {'遇': '域'}}]
query:一只小魚船浮在平凈的河面上 => 一只小魚船浮在平凈的河面上, err:[]
query:我的家鄉是有明的漁米之鄉 => 我的家鄉是有名的漁米之鄉, err:[{'position': 6, 'correction': {'明': '名'}}]
- 使用PaddleNLP庫調用糾錯:
可以使用PaddleNLP提供的Taskflow工具來對輸入的文本進行一鍵糾錯,具體使用方法如下:
from paddlenlp import Taskflowtext_correction = Taskflow("text_correction")
text_correction('遇到逆竟時,我們必須勇于面對,而且要愈挫愈勇,這樣我們才能朝著成功之路前進。')
text_correction('人生就是如此,經過磨練才能讓自己更加拙壯,才能使自己更加樂觀。')
output:
[{'source': '遇到逆竟時,我們必須勇于面對,而且要愈挫愈勇,這樣我們才能朝著成功之路前進。','target': '遇到逆境時,我們必須勇于面對,而且要愈挫愈勇,這樣我們才能朝著成功之路前進。','errors': [{'position': 3, 'correction': {'竟': '境'}}]}][{'source': '人生就是如此,經過磨練才能讓自己更加拙壯,才能使自己更加樂觀。','target': '人生就是如此,經過磨練才能讓自己更加茁壯,才能使自己更加樂觀。','errors': [{'position': 18, 'correction': {'拙': '茁'}}]}]
8.3 Bart模型
from transformers import BertTokenizerFast
from textgen import BartSeq2SeqModeltokenizer = BertTokenizerFast.from_pretrained('shibing624/bart4csc-base-chinese')
model = BartSeq2SeqModel(encoder_type='bart',encoder_decoder_type='bart',encoder_decoder_name='shibing624/bart4csc-base-chinese',tokenizer=tokenizer,args={"max_length": 128, "eval_batch_size": 128})
sentences = ["少先隊員因該為老人讓坐"]
print(model.predict(sentences))
output:
['少先隊員應該為老人讓座']
如果需要訓練Bart模型,請參考 https://github.com/shibing624/textgen/blob/main/examples/seq2seq/training_bartseq2seq_zh_demo.py
- Release models
基于SIGHAN+Wang271K中文糾錯數據集訓練的Bart模型,已經release到HuggingFace Models:
- BART模型:模型已經開源在HuggingFace Models:https://huggingface.co/shibing624/bart4csc-base-chinese
#3 8.4 ConvSeq2Seq模型
pycorrector/seq2seq 模型使用示例:
- 訓練
data example:
#train.txt:
你說的是對,跟那些失業的人比起來你也算是辛運的。 你說的是對,跟那些失業的人比起來你也算是幸運的。
cd seq2seq
python train.py
convseq2seq
訓練sighan數據集(2104條樣本),200個epoch,單卡P40GPU訓練耗時:3分鐘。
- 預測
python infer.py
output:
- 如果訓練數據太少(不足萬條),深度模型擬合不足,會出現預測結果全為
unk
的情況,解決方法:增大訓練樣本集,使用下方提供的糾錯熟語料(nlpcc2018+hsk,130萬對句子)試試。 - 深度模型訓練耗時長,有GPU盡量用GPU,加速訓練,節省時間。
- Release models
基于SIGHAN2015數據集訓練的convseq2seq模型,已經release到github:
- convseq2seq model url: https://github.com/shibing624/pycorrector/releases/download/0.4.5/convseq2seq_correction.tar.gz
9.數據集
9.1 開源數據集
數據集 | 語料 | 下載鏈接 | 壓縮包大小 |
---|---|---|---|
SIGHAN+Wang271K中文糾錯數據集 | SIGHAN+Wang271K(27萬條) | 百度網盤(密碼01b9) shibing624/CSC | 106M |
原始SIGHAN數據集 | SIGHAN13 14 15 | 官方csc.html | 339K |
原始Wang271K數據集 | Wang271K | Automatic-Corpus-Generation dimmywang提供 | 93M |
人民日報2014版語料 | 人民日報2014版 | 飛書(密碼cHcu) | 383M |
NLPCC 2018 GEC官方數據集 | NLPCC2018-GEC | 官方trainingdata | 114M |
NLPCC 2018+HSK熟語料 | nlpcc2018+hsk+CGED | 百度網盤(密碼m6fg) 飛書(密碼gl9y) | 215M |
NLPCC 2018+HSK原始語料 | HSK+Lang8 | 百度網盤(密碼n31j) 飛書(密碼Q9LH) | 81M |
中文糾錯比賽數據匯總 | Chinese Text Correction(CTC) | 中文糾錯匯總數據集(天池) | - |
說明:
- SIGHAN+Wang271K中文糾錯數據集(27萬條),是通過原始SIGHAN13、14、15年數據集和Wang271K數據集格式轉化后得到,json格式,帶錯誤字符位置信息,SIGHAN為test.json,
macbert4csc模型訓練可以直接用該數據集復現paper準召結果,詳見pycorrector/macbert/README.md。 - NLPCC 2018 GEC官方數據集NLPCC2018-GEC,
訓練集trainingdata[解壓后114.5MB],該數據格式是原始文本,未做切詞處理。 - 漢語水平考試(HSK)和lang8原始平行語料[HSK+Lang8]百度網盤(密碼n31j),該數據集已經切詞,可用作數據擴增。
- NLPCC 2018 + HSK + CGED16、17、18的數據,經過以字切分,繁體轉簡體,打亂數據順序的預處理后,生成用于糾錯的熟語料(nlpcc2018+hsk)
,百度網盤(密碼:m6fg) [130萬對句子,215MB]
SIGHAN+Wang271K中文糾錯數據集,數據格式:
[{"id": "B2-4029-3","original_text": "晚間會聽到嗓音,白天的時候大家都不會太在意,但是在睡覺的時候這嗓音成為大家的惡夢。","wrong_ids": [5,31],"correct_text": "晚間會聽到噪音,白天的時候大家都不會太在意,但是在睡覺的時候這噪音成為大家的惡夢。"}
]
字段解釋:
- id:唯一標識符,無意義
- original_text: 原始錯誤文本
- wrong_ids: 錯誤字的位置,從0開始
- correct_text: 糾正后的文本
9.2 自有數據集
可以使用自己數據集訓練糾錯模型,把自己數據集標注好,保存為跟訓練樣本集一樣的json格式,然后加載數據訓練模型即可。
- 已有大量業務相關錯誤樣本,主要標注錯誤位置(wrong_ids)和糾錯后的句子(correct_text)
- 沒有現成的錯誤樣本,可以寫腳本生成錯誤樣本(original_text),根據音似、形似等特征把正確句子的指定位置(wrong_ids)字符改為錯字,附上
第三方同音字生成腳本同音詞替換
10.總結
什么是語言模型?-wiki
語言模型對于糾錯步驟至關重要,當前默認使用的是從千兆中文文本訓練的中文語言模型zh_giga.no_cna_cmn.prune01244.klm(2.8G),
提供人民日報2014版語料訓練得到的輕量版語言模型people2014corpus_chars.klm(密碼o5e9)。
大家可以用中文維基(繁體轉簡體,pycorrector.utils.text_utils下有此功能)等語料數據訓練通用的語言模型,或者也可以用專業領域語料訓練更專用的語言模型。更適用的語言模型,對于糾錯效果會有比較好的提升。
- kenlm語言模型訓練工具的使用,請見博客:http://blog.csdn.net/mingzai624/article/details/79560063
- 附上訓練語料<人民日報2014版熟語料>,包括: 1)標準人工切詞及詞性數據people2014.tar.gz, 2)未切詞文本數據people2014_words.txt,
3)kenlm訓練字粒度語言模型文件及其二進制文件people2014corpus_chars.arps/klm, 4)kenlm詞粒度語言模型文件及其二進制文件people2014corpus_words.arps/klm。
- Todo
- 優化形似字字典,提高形似字糾錯準確率
- 整理中文糾錯訓練數據,使用seq2seq做深度中文糾錯模型
- 添加中文語法錯誤檢測及糾正能力
- 規則方法添加用戶自定義糾錯集,并將其糾錯優先度調為最高
- seq2seq_attention 添加dropout,減少過擬合
- 在seq2seq模型框架上,新增Pointer-generator network、Beam search、Unknown words replacement、Coverage mechanism等特性
- 更新bert的fine-tuned使用wiki,適配transformers 2.10.0庫
- 升級代碼,兼容TensorFlow 2.0庫
- 升級bert糾錯邏輯,提升基于mask的糾錯效果
- 新增基于electra模型的糾錯邏輯,參數更小,預測更快
- 新增專用于糾錯任務深度模型,使用bert/ernie預訓練模型,加入文本音似、形似特征。
-
Reference
-
基于文法模型的中文糾錯系統
-
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
-
Revisiting Pre-trained Models for Chinese Natural Language Processing
-
Ruiqing Zhang, Chao Pang et al. “Correcting Chinese Spelling Errors with Phonetic Pre-training”, ACL, 2021
-
DingminWang et al. “A Hybrid Approach to Automatic Corpus Generation for Chinese Spelling Check”, EMNLP, 2018
參考鏈接:https://github.com/shibing624/pycorrector
如果github進入不了也可進入 https://download.csdn.net/download/sinat_39620217/88205573 免費下載相關資料