中文文本糾錯劃分
中文文本糾錯任務,常見錯誤類型包括:
- 諧音字詞,如 配副眼睛-配副眼鏡
- 混淆音字詞,如 流浪織女-牛郎織女
- 字詞順序颠倒,如 伍迪艾倫-艾倫伍迪
- 字詞補全,如愛有天意-假如愛有天意
- 形似字錯誤,如 高梁-高粱
- 中文拼音全拼,如 xingfu-幸福
- 中文拼音縮寫,如 sz-深圳
- 文法錯誤,如想象難以-難以想象
當然,針對不同業務場景,這些問題并不一定全部存在,比如輸入法中需要處理前四種,搜尋引擎需要處理所有類型,語音識别後文本糾錯隻需要處理前兩種, 其中’形似字錯誤’主要針對五筆或者筆畫手寫輸入等。
簡單總結了一下中文别字錯誤類型:
- 别字: 感帽,随然,傳然,嘔土
- 人名,地名錯誤:哈蜜(正:哈密)
- 拼音錯誤:咳數(ke shu)—> ke sou,
- 知識性錯誤:廣州黃浦(埔)
- 使用者發音、方言糾錯:我系東北滴黑社會,俚蛾幾現在在我手上。(我是東北的黑社會,你兒子現在在我手上。)
- 重複性錯誤:在 上 上面 上面 那 什麼 啊
- 口語化問題:呃 。 呃 ,啊,那使用者名稱是叫什麼呢?(正:那使用者名稱是叫什麼呢?)
解決方案
規則的解決思路
- 中文糾錯分為兩步走,第一步是錯誤檢測,第二步是錯誤糾正;
-
錯誤檢測部分先通過結巴中文分詞器切詞,由于句子中含有錯别字,是以切詞結果往往會有切分錯誤的情況,這樣從字粒度和詞粒度兩方面檢測錯誤,
整合這兩種粒度的疑似錯誤結果,形成疑似錯誤位置候選集;
- 錯誤糾正部分,是周遊所有的疑似錯誤位置,并使用音似、形似詞典替換錯誤位置的詞,然後通過語言模型計算句子困惑度,對所有候選集結果比較并排序,得到最優糾正詞。
深度模型的解決思路
- 端到端的深度模型可以避免人工提取特征,減少人工工作量,RNN序列模型對文本任務拟合能力強,rnn_attention在英文文本糾錯比賽中取得第一名成績,證明應用效果不錯;
- CRF會計算全局最優輸出節點的條件機率,對句子中特定錯誤類型的檢測,會根據整句話判定該錯誤,阿裡參賽2016中文文法糾錯任務并取得第一名,證明應用效果不錯
- seq2seq模型是使用encoder-decoder結構解決序列轉換問題,目前在序列轉換任務中(如機器翻譯、對話生成、文本摘要、圖像描述)使用最廣泛、效果最好的模型之一。
特征
- kenlm: kenlm統計語言模型工具
- rnn_lm: TensorFlow、PaddlePaddle均有實作棧式雙向LSTM的語言模型
-
rnn_attention模型: 參考Stanford
University的nlc模型,該模型是參加2014英文文本糾錯比賽并取得第一名的方法
- rnn_crf模型: 參考阿裡巴巴2016參賽中文文法糾錯比賽并取得第一名的方法
- seq2seq模型: 使用序列模型解決文本糾錯任務,文本文法糾錯任務中常用模型之一
- seq2seq_attention模型: 在seq2seq模型加上attention機制,對于長文本效果更好,模型更容易收斂,但容易過拟合
錯誤檢測
- 字粒度:語言模型困惑度(ppl)檢測某字的似然機率值低于句子文本平均值,則判定該字是疑似錯别字的機率大。
- 詞粒度:切詞後不在詞典中的詞是疑似錯詞的機率大。
錯誤糾正
- 通過錯誤檢測定位所有疑似錯誤後,取所有疑似錯字的音似、形似候選詞,
- 使用候選詞替換,基于語言模型得到類似翻譯模型的候選排序結果,得到最優糾正詞。 思考
思考
現在的處理手段,在詞粒度的錯誤召回還不錯,但錯誤糾正的準确率還有待提高,更多優質的糾錯集及糾錯詞庫會有提升,我更希望算法上有更大的突破。
另外,現在的文本錯誤不再局限于字詞粒度上的拼寫錯誤,需要提高中文文法錯誤檢測(CGED, Chinese Grammar Error Diagnosis)及糾正能力,列在TODO中,後續調研。
pycorrector
中文文本糾錯工具。音似、形似錯字(或變體字)糾正,可用于中文拼音、筆畫輸入法的錯誤糾正。python3開發。
pycorrector依據語言模型檢測錯别字位置,通過拼音音似特征、筆畫五筆編輯距離特征及語言模型困惑度特征糾正錯别字。
安裝
pip install pycorrector
結果報錯
根據報錯繼續執行pip install pypinyin 安裝pypinyin子產品。
之後執行pip install pycorrector還是報錯。
算了還是換成半自動安裝把
我擦還是不行。經過輾轉反側的查詢。最後執行
pip install https://github.com/kpu/kenlm/archive/master.zip
之後在執行pip install pycorrector/。。。成功了。
以上安裝參考連接配接:
https://github.com/kpu/kenlm
https://github.com/shibing624/pycorrector
其工作流程如下:
自帶的幾個詞表
幾個現成的工具包:
- https://github.com/shibing624/pycorrector pycorrector
簡介:考慮了音似、形似錯字(或變體字)糾正,可用于中文拼音、筆畫輸入法的錯誤糾正,能夠給出給出出錯位置。
語言模型:
Kenlm(統計語言模型工具)
RNNLM(TensorFlow、PaddlePaddle均有實作棧式雙向LSTM的語言模型)
代碼:
import pycorrector
corrected_sent, detail = pycorrector.correct(‘少先隊員因該為老人讓坐’)
print(corrected_sent, detail)
單詞、短句效果:9/13 效果尚可
速度:0.366050 all, 0.028157692 avg ;
可擴充性:詞典可擴充,可使用自己的語料進行訓練,該repo使用的是人民日報資料。擴充性強。
測試樣本效果:‘感帽了’,‘你兒字今年幾歲了’, ‘少先隊員因該為老人讓坐’,‘随然今天很熱’,‘傳然給我’,‘嘔土不止’,‘哈蜜瓜’,‘廣州黃浦’,‘在 上 上面 上面 那 什麼 啊’,‘呃 。 呃 ,啊,那使用者名稱是叫什麼呢?’, ‘我生病了,咳數了好幾天’, ‘對京東新人度大打折扣’,‘我想買哥蘋果手機’
- https://github.com/ccheng16/correction 10 months ago
簡介:
使用語言模型計算句子或序列的合理性
bigram, trigram, 4-gram 結合,并對每個字的分數求平均以平滑每個字的得分
根據Median Absolute Deviation算出outlier分數,并結合jieba分詞結果确定需要修改的範圍
根據形近字、音近字構成的混淆集合列出候選字,并對需要修改的範圍逐字改正
句子中的錯誤會使分詞結果更加細碎,結合替換字之後的分詞結果确定需要改正的字
探測句末語氣詞,如有錯誤直接改正
特點:
訓練的語言模型很多,根據介紹看,整體比較完善,看起來高大上。不過code跑不起來,作者沒回應—–後面再改一下作者代碼,看看能否跑起來。
- https://github.com/PengheLiu/Cn_Speck_Checker 2 years ago
簡介:
針對醫學資料訓練出來的,基于編輯距離,可自行訓練–效果一般,統計詞頻和共現資訊,不太完善,傳回大量candidates
特點:
人們通常越往後字打錯的可能越大,因而可以考慮每個字在單詞中的位置給予一定權重,這中方法有助于改進上面的第一種“傳然”- "雖然"的情況;
考慮拼音的重要性,對漢語來講,通常人們打錯時拼音是拼對的,隻是選擇時候選擇錯了,因而對候選詞也可以優先選擇同拼音的字。
單詞、短句效果:1/13 效果差,因為訓練語料是醫學文章
速度:None
可擴充性:詞典+模型。擴充性還可以。
測試樣本效果:‘感帽了’,‘你兒字今年幾歲了’, ‘少先隊員因該為老人讓坐’,‘随然今天很熱’,‘傳然給我’,‘嘔土不止’,‘哈蜜瓜’,‘廣州黃浦’,‘在 上 上面 上面 那 什麼 啊’,‘呃 。 呃 ,啊,那使用者名稱是叫什麼呢?’, ‘我生病了,咳數了好幾天’, ‘對京東新人度大打折扣’,‘我想買哥蘋果手機’
- proofreadv1 – 效果一般,主要用于搜尋引擎中的搜尋關鍵詞的别字糾錯 5 years ago
詞頻字典+bi-gram
https://github.com/apanly/proofreadv1
模型比較老舊,不考慮
- https://github.com/taozhijiang/chinese_correct_wsd 3 years ago
京東客服機器人語料做的中文糾錯–更接近我們的應用場景,主要解決同音自動糾錯問
題,比如:
對京東新人度大打折扣 – > 對京東信任度大打折扣
我想買哥蘋果手機 糾正句:我想買個蘋果手機
但代碼多年未更新,目前跑不起來。
- https://github.com/beyondacm/Autochecker4Chinese 9 months ago
original sentence:感帽,随然,傳然,嘔土
corrected sentence:感冒,雖然,傳染,嘔吐
original sentence:對京東新人度大打折扣,我想買哥蘋果手機
corrected sentence:對京東新人度大打折扣,我國買賣蘋果手機
單詞、短句效果:5/13 效果差
速度:2.860311 all , 0.220023 avg; with print
可擴充性:詞典可擴充,不使用自己的語料進行訓練。擴充性一般。
測試樣本效果:‘感帽了’,‘你兒字今年幾歲了’, ‘少先隊員因該為老人讓坐’,‘随然今天很熱’,‘傳然給我’,‘嘔土不止’,‘哈蜜瓜’,‘廣州黃浦’,‘在 上 上面 上面 那 什麼 啊’,‘呃 。 呃 ,啊,那使用者名稱是叫什麼呢?’, ‘我生病了,咳數了好幾天’, ‘對京東新人度大打折扣’,‘我想買哥蘋果手機’
- https://github.com/SeanLee97/xmnlp 3-4 months ago
nlp工具包,包含分詞、情感分析,沒有專注于錯别字糾正,效果較差
單詞、短句效果:3/13 效果差
速度:2.860311 all , 0.220023 avg; without print: 0:00:00.000017 all
可擴充性:既沒發現詞典、也沒發現模型。擴充性較差。
測試樣本效果:‘感帽了’,‘你兒字今年幾歲了’, ‘少先隊員因該為老人讓坐’,‘随然今天很熱’,‘傳然給我’,‘嘔土不止’,‘哈蜜瓜’,‘廣州黃浦’,‘在 上 上面 上面 那 什麼 啊’,‘呃 。 呃 ,啊,那使用者名稱是叫什麼呢?’, ‘我生病了,咳數了好幾天’, ‘對京東新人度大打折扣’,‘我想買哥蘋果手機’
總結:
- 效果:現有錯别字糾正package大部分是通用領域的錯别字檢查,缺乏統一的評判标準,效果參差不齊。長句效果差,短句、單詞效果好一些,未來應用到産品中,也要根據标點符号截成短句,再進行錯别字檢查。
- 口語化、重複性的問題,所有package不能解決此類問題。
- 誤判率的問題!!!錯别字糾正功能有可能把正确的句子改成錯誤的。。這就要求,正确率x要遠大于誤判率y。假設有m個問題,其中2%是有錯别字的,m*2%x>m(1-2%)*y,根據個人的經驗,誤判率y是可以控制在1%以下的,如果有比較好的詞表,可以控制在0.5%以下。根據上述不等式,誤判率控制在0.5%以下,正确率達到24.5%就能滿足上述不等式。
- 項目中,若測試資料不含重複錯别字樣本(錯别字:帳單,其中的帳這個錯别字隻出現過一次),錯别字糾正的正确率達到了50%,誤判率0.49%左右。若包含重複樣本,正确率達到了70%以上。
後面這三點比較關鍵:
- 項目中使用了基于n-gram語言模型,使用kenLM訓練得到的,DNN LM和n-gram LM各有優缺點,這裡賣個關子,感興趣的可以思考一下二者差別。另外,基于字的語言模型,誤判率會較高;基于詞的語言模型,誤判率會低一些(符合我個人的判斷,在我的實驗裡情況也确實如此)。
- 訓練語言模型的語料中并不clean,包含了很多錯别字,這會提高誤判率。使用更幹淨的語料有助于降低誤判率,提高正确率。
- 專業相關詞表很關鍵,沒有高品質的詞表,很多字也會被誤認為是錯别字,是以也會提高誤判率。
測試樣本:
‘感帽了’,‘你兒字今年幾歲了’, ‘少先隊員因該為老人讓坐’,‘随然今天很熱’,‘傳然給我’,‘嘔土不止’,‘哈蜜瓜’,‘廣州黃浦’,‘在 上 上面 上面 那 什麼 啊’,‘呃 。 呃 ,啊,那使用者名稱是叫什麼呢?’, ‘我生病了,咳數了好幾天’, ‘對京東新人度大打折扣’,‘我想買哥蘋果手機’
效果評價簡介:
a. 單詞、短句效果:一共13個測試樣本,9/13表示13個樣本中,糾正了9個錯誤。(長句效果差,沒有考慮)
b. 速度:考慮了13個樣本的總時間(用all表示,機關統一為秒),以及平均每個樣本的糾錯時間(用avg表示)
其中, with print 表示該糾錯方法的用時包含了“輸出到terminal的時間”,without print表示該糾錯方法的用時沒有包含“輸出到terminal的時間”。這麼劃分的原因是 輸出到terminal比較耗時,部分package可以選擇輸出or不輸出。
c. 可擴充性:主要(1)考慮該糾錯方法是否包含 自定義的錯别字詞典,友善個性化定制;(2)考慮該糾錯方法,是否提供模型代碼友善,在小娜的文本上進行訓練語言模型。
以上來部分來源于知乎:參考直通車