天天看點

自然語言處理-錯字識别(基于Python)kenlm、pycorrector

中文文本糾錯劃分

中文文本糾錯任務,常見錯誤類型包括:

  • 諧音字詞,如 配副眼睛-配副眼鏡
  • 混淆音字詞,如 流浪織女-牛郎織女
  • 字詞順序颠倒,如 伍迪艾倫-艾倫伍迪
  • 字詞補全,如愛有天意-假如愛有天意
  • 形似字錯誤,如 高梁-高粱
  • 中文拼音全拼,如 xingfu-幸福
  • 中文拼音縮寫,如 sz-深圳
  • 文法錯誤,如想象難以-難以想象

當然,針對不同業務場景,這些問題并不一定全部存在,比如輸入法中需要處理前四種,搜尋引擎需要處理所有類型,語音識别後文本糾錯隻需要處理前兩種, 其中’形似字錯誤’主要針對五筆或者筆畫手寫輸入等。

簡單總結了一下中文别字錯誤類型:

  1. 别字: 感帽,随然,傳然,嘔土
  2. 人名,地名錯誤:哈蜜(正:哈密)
  3. 拼音錯誤:咳數(ke shu)—> ke sou,
  4. 知識性錯誤:廣州黃浦(埔)
  5. 使用者發音、方言糾錯:我系東北滴黑社會,俚蛾幾現在在我手上。(我是東北的黑社會,你兒子現在在我手上。)
  6. 重複性錯誤:在 上 上面 上面 那 什麼 啊
  7. 口語化問題:呃 。 呃 ,啊,那使用者名稱是叫什麼呢?(正:那使用者名稱是叫什麼呢?)

解決方案

規則的解決思路

  • 中文糾錯分為兩步走,第一步是錯誤檢測,第二步是錯誤糾正;
  • 錯誤檢測部分先通過結巴中文分詞器切詞,由于句子中含有錯别字,是以切詞結果往往會有切分錯誤的情況,這樣從字粒度和詞粒度兩方面檢測錯誤,

    整合這兩種粒度的疑似錯誤結果,形成疑似錯誤位置候選集;

  • 錯誤糾正部分,是周遊所有的疑似錯誤位置,并使用音似、形似詞典替換錯誤位置的詞,然後通過語言模型計算句子困惑度,對所有候選集結果比較并排序,得到最優糾正詞。

深度模型的解決思路

  • 端到端的深度模型可以避免人工提取特征,減少人工工作量,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

結果報錯

自然語言處理-錯字識别(基于Python)kenlm、pycorrector

根據報錯繼續執行pip install pypinyin 安裝pypinyin子產品。

之後執行pip install pycorrector還是報錯。

算了還是換成半自動安裝把

自然語言處理-錯字識别(基于Python)kenlm、pycorrector

我擦還是不行。經過輾轉反側的查詢。最後執行

pip install https://github.com/kpu/kenlm/archive/master.zip

之後在執行pip install pycorrector/。。。成功了。

自然語言處理-錯字識别(基于Python)kenlm、pycorrector

以上安裝參考連接配接:

https://github.com/kpu/kenlm

https://github.com/shibing624/pycorrector

其工作流程如下:

自然語言處理-錯字識别(基于Python)kenlm、pycorrector

自帶的幾個詞表

自然語言處理-錯字識别(基于Python)kenlm、pycorrector

幾個現成的工具包:

  1. 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使用的是人民日報資料。擴充性強。

測試樣本效果:‘感帽了’,‘你兒字今年幾歲了’, ‘少先隊員因該為老人讓坐’,‘随然今天很熱’,‘傳然給我’,‘嘔土不止’,‘哈蜜瓜’,‘廣州黃浦’,‘在 上 上面 上面 那 什麼 啊’,‘呃 。 呃 ,啊,那使用者名稱是叫什麼呢?’, ‘我生病了,咳數了好幾天’, ‘對京東新人度大打折扣’,‘我想買哥蘋果手機’

  1. https://github.com/ccheng16/correction 10 months ago

簡介:

使用語言模型計算句子或序列的合理性

bigram, trigram, 4-gram 結合,并對每個字的分數求平均以平滑每個字的得分

根據Median Absolute Deviation算出outlier分數,并結合jieba分詞結果确定需要修改的範圍

根據形近字、音近字構成的混淆集合列出候選字,并對需要修改的範圍逐字改正

句子中的錯誤會使分詞結果更加細碎,結合替換字之後的分詞結果确定需要改正的字

探測句末語氣詞,如有錯誤直接改正

特點:

訓練的語言模型很多,根據介紹看,整體比較完善,看起來高大上。不過code跑不起來,作者沒回應—–後面再改一下作者代碼,看看能否跑起來。

  1. https://github.com/PengheLiu/Cn_Speck_Checker 2 years ago

簡介:

針對醫學資料訓練出來的,基于編輯距離,可自行訓練–效果一般,統計詞頻和共現資訊,不太完善,傳回大量candidates

特點:

人們通常越往後字打錯的可能越大,因而可以考慮每個字在單詞中的位置給予一定權重,這中方法有助于改進上面的第一種“傳然”- "雖然"的情況;

考慮拼音的重要性,對漢語來講,通常人們打錯時拼音是拼對的,隻是選擇時候選擇錯了,因而對候選詞也可以優先選擇同拼音的字。

單詞、短句效果:1/13 效果差,因為訓練語料是醫學文章

速度:None

可擴充性:詞典+模型。擴充性還可以。

測試樣本效果:‘感帽了’,‘你兒字今年幾歲了’, ‘少先隊員因該為老人讓坐’,‘随然今天很熱’,‘傳然給我’,‘嘔土不止’,‘哈蜜瓜’,‘廣州黃浦’,‘在 上 上面 上面 那 什麼 啊’,‘呃 。 呃 ,啊,那使用者名稱是叫什麼呢?’, ‘我生病了,咳數了好幾天’, ‘對京東新人度大打折扣’,‘我想買哥蘋果手機’

  1. proofreadv1 – 效果一般,主要用于搜尋引擎中的搜尋關鍵詞的别字糾錯 5 years ago

詞頻字典+bi-gram

https://github.com/apanly/proofreadv1

模型比較老舊,不考慮

  1. https://github.com/taozhijiang/chinese_correct_wsd 3 years ago

京東客服機器人語料做的中文糾錯–更接近我們的應用場景,主要解決同音自動糾錯問

題,比如:

對京東新人度大打折扣 – > 對京東信任度大打折扣

我想買哥蘋果手機 糾正句:我想買個蘋果手機

但代碼多年未更新,目前跑不起來。

  1. 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

可擴充性:詞典可擴充,不使用自己的語料進行訓練。擴充性一般。

測試樣本效果:‘感帽了’,‘你兒字今年幾歲了’, ‘少先隊員因該為老人讓坐’,‘随然今天很熱’,‘傳然給我’,‘嘔土不止’,‘哈蜜瓜’,‘廣州黃浦’,‘在 上 上面 上面 那 什麼 啊’,‘呃 。 呃 ,啊,那使用者名稱是叫什麼呢?’, ‘我生病了,咳數了好幾天’, ‘對京東新人度大打折扣’,‘我想買哥蘋果手機’

  1. 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

可擴充性:既沒發現詞典、也沒發現模型。擴充性較差。

測試樣本效果:‘感帽了’,‘你兒字今年幾歲了’, ‘少先隊員因該為老人讓坐’,‘随然今天很熱’,‘傳然給我’,‘嘔土不止’,‘哈蜜瓜’,‘廣州黃浦’,‘在 上 上面 上面 那 什麼 啊’,‘呃 。 呃 ,啊,那使用者名稱是叫什麼呢?’, ‘我生病了,咳數了好幾天’, ‘對京東新人度大打折扣’,‘我想買哥蘋果手機’

總結:

  1. 效果:現有錯别字糾正package大部分是通用領域的錯别字檢查,缺乏統一的評判标準,效果參差不齊。長句效果差,短句、單詞效果好一些,未來應用到産品中,也要根據标點符号截成短句,再進行錯别字檢查。
  2. 口語化、重複性的問題,所有package不能解決此類問題。
  3. 誤判率的問題!!!錯别字糾正功能有可能把正确的句子改成錯誤的。。這就要求,正确率x要遠大于誤判率y。假設有m個問題,其中2%是有錯别字的,m*2%x>m(1-2%)*y,根據個人的經驗,誤判率y是可以控制在1%以下的,如果有比較好的詞表,可以控制在0.5%以下。根據上述不等式,誤判率控制在0.5%以下,正确率達到24.5%就能滿足上述不等式。
  4. 項目中,若測試資料不含重複錯别字樣本(錯别字:帳單,其中的帳這個錯别字隻出現過一次),錯别字糾正的正确率達到了50%,誤判率0.49%左右。若包含重複樣本,正确率達到了70%以上。

後面這三點比較關鍵:

  1. 項目中使用了基于n-gram語言模型,使用kenLM訓練得到的,DNN LM和n-gram LM各有優缺點,這裡賣個關子,感興趣的可以思考一下二者差別。另外,基于字的語言模型,誤判率會較高;基于詞的語言模型,誤判率會低一些(符合我個人的判斷,在我的實驗裡情況也确實如此)。
  2. 訓練語言模型的語料中并不clean,包含了很多錯别字,這會提高誤判率。使用更幹淨的語料有助于降低誤判率,提高正确率。
  3. 專業相關詞表很關鍵,沒有高品質的詞表,很多字也會被誤認為是錯别字,是以也會提高誤判率。

測試樣本:

‘感帽了’,‘你兒字今年幾歲了’, ‘少先隊員因該為老人讓坐’,‘随然今天很熱’,‘傳然給我’,‘嘔土不止’,‘哈蜜瓜’,‘廣州黃浦’,‘在 上 上面 上面 那 什麼 啊’,‘呃 。 呃 ,啊,那使用者名稱是叫什麼呢?’, ‘我生病了,咳數了好幾天’, ‘對京東新人度大打折扣’,‘我想買哥蘋果手機’

效果評價簡介:

a. 單詞、短句效果:一共13個測試樣本,9/13表示13個樣本中,糾正了9個錯誤。(長句效果差,沒有考慮)

b. 速度:考慮了13個樣本的總時間(用all表示,機關統一為秒),以及平均每個樣本的糾錯時間(用avg表示)

其中, with print 表示該糾錯方法的用時包含了“輸出到terminal的時間”,without print表示該糾錯方法的用時沒有包含“輸出到terminal的時間”。這麼劃分的原因是 輸出到terminal比較耗時,部分package可以選擇輸出or不輸出。

c. 可擴充性:主要(1)考慮該糾錯方法是否包含 自定義的錯别字詞典,友善個性化定制;(2)考慮該糾錯方法,是否提供模型代碼友善,在小娜的文本上進行訓練語言模型。

以上來部分來源于知乎:參考直通車