21行Python程式碼實現拼寫檢查器
引入
大家在使用谷歌或者百度搜尋時,輸入搜尋內容時,谷歌總是能提供非常好的拼寫檢查,比如你輸入 speling,谷歌會馬上返回 spelling。
下面是用21行python程式碼實現的一個簡易但是具備完整功能的拼寫檢查器。
程式碼
import re, collections def words(text): return re.findall('[a-z]+', text.lower()) def train(features): model = collections.defaultdict(lambda: 1) for f in features: model[f] += 1 return model NWORDS = train(words(file('big.txt').read())) alphabet = 'abcdefghijklmnopqrstuvwxyz' def edits1(word): splits = [(word[:i], word[i:]) for i in range(len(word) + 1)] deletes = [a + b[1:] for a, b in splits if b] transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1] replaces = [a + c + b[1:] for a, b in splits for c in alphabet if b] inserts = [a + c + b for a, b in splits for c in alphabet] return set(deletes + transposes + replaces + inserts) def known_edits2(word): return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS) def known(words): return set(w for w in words if w in NWORDS) def correct(word): candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word] return max(candidates, key=NWORDS.get)
correct函式是程式的入口,傳進去錯誤拼寫的單詞會返回正確。如:
>>> correct("cpoy") 'copy' >>> correct("engilsh") 'english' >>> correct("sruprise") 'surprise'
除了這段程式碼外,作為機器學習的一部分,肯定還應該有大量的樣本資料,準備了big.txt作為我們的樣本資料。
背後原理
上面的程式碼是基於貝葉斯來實現的,事實上谷歌百度實現的拼寫檢查也是通過貝葉斯實現,不過肯定比這個複雜多了。
首先簡單介紹一下背後的原理,如果讀者之前瞭解過了,可以跳過這段。
給一個詞,我們試圖選取一個最可能的正確的的拼寫建議(建議也可能就是輸入的單詞)。有時也不清楚(比如lates應該被更正為late或者latest?),我們用概率決定把哪一個作為建議。我們從跟原始詞w相關的所有可能的正確拼寫中找到可能性最大的那個拼寫建議c:
argmaxc P(c|w)
通過貝葉斯定理,上式可以轉化為
argmaxc P(w|c) P(c) / P(w)
下面介紹一下上式中的含義:
- P(c|w)代表在輸入單詞w 的情況下,你本來想輸入 單詞c的概率。
- P(w|c)代表使用者想輸入單詞c卻輸入w的概率,這個可以我們認為給定的。
- P(c)代表在樣本資料中單詞c出現的概率
- P(w)代表在樣本數字中單詞w出現的概率
可以確定P(w)對於所有可能的單詞c概率都是一樣的,所以上式可以轉換為
argmaxc P(w|c) P(c)
我們所有的程式碼都是基於這個公式來的,下面分析具體程式碼實現
程式碼分析
利用words()函式提取big.txt中的單詞
def words(text): return re.findall('[a-z]+', text.lower())
re.findall(‘[a-z]+’是利用python正規表示式模組,提取所有的符合’[a-z]+’條件的,也就是由字母組成的單詞。(這裡不詳細介紹正規表示式了,有興趣的同學可以看 正規表示式簡介。text.lower()是將文字轉化為小寫字母,也就是“the”和“The”一樣定義為同一個單詞。
利用train()函式計算每個單詞出現的次數然後訓練出一個合適的模型
def train(features): model = collections.defaultdict(lambda: 1) for f in features: model[f] += 1 return model NWORDS = train(words(file('big.txt').read()))
這樣NWORDS[w]代表了單詞w在樣本中出現的次數。如果有一個單詞並沒有出現在我們的樣本中該怎麼辦?處理方法是將他們的次數預設設為1,這裡通過collections模組和lambda表示式實現。collections.defaultdict()建立了一個預設的字典,lambda:1將這個字典中的每個值都預設設為1。(lambda表示式可以看lambda簡介
現在我們處理完了公式argmaxc P(w|c) P(c)
中的P(c),接下來處理P(w|c)即想輸入單詞c卻錯誤地輸入單詞w的概率,通過 “edit distance“--將一個單詞變為另一個單詞所需要的編輯次數來衡量,一次edit可能是一次刪除,一個交換(兩個相鄰的字母),一次插入,一次修改。下面的函式返回一個將c進行一次編輯所有可能得到的單詞w的集合:
def edits1(word): splits = [(word[:i], word[i:]) for i in range(len(word) + 1)] deletes = [a + b[1:] for a, b in splits if b] transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1] replaces = [a + c + b[1:] for a, b in splits for c in alphabet if b] inserts = [a + c + b for a, b in splits for c in alphabet] return set(deletes + transposes + replaces + inserts)
相關論文顯示,80-95%的拼寫錯誤跟想要拼寫的單詞都只有1個編輯距離,如果覺得一次編輯不夠,那我們再來一次
def known_edits2(word): return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
同時還可能有編輯距離為0次的即本身就拼寫正確的:
def known(words): return set(w for w in words if w in NWORDS)
我們假設編輯距離1次的概率遠大於2次的,0次的遠大於1次的。下面通過correct函式先選擇編輯距離最小的單詞,其對應的P(w|c)就會越大,作為候選單詞,再選擇P(c)最大的那個單詞作為拼寫建議
def correct(word): candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word] return max(candidates, key=NWORDS.get)
相關文章
- 雜湊表:如何實現word編輯器的拼寫檢查?
- idea取消拼寫檢查Idea
- vscode配置拼寫檢查VSCode
- pycharm一些減少程式碼warning的拼寫檢查設定PyCharm
- python程式碼檢查工具(靜態程式碼審查)Python
- java 實現中英文拼寫檢查和錯誤糾正?可我只會寫 CRUD 啊!Java
- PowerPoint 教程:如何在 PowerPoint 中檢查拼寫?
- python 程式碼實現查詢功能介面測試Python
- 手寫演算法-python程式碼實現Kmeans演算法Python
- 1行Python程式碼實現FTP伺服器PythonFTP伺服器
- 程式碼樣式檢查
- Win10系統下禁用OneNote中拼寫檢查的方法Win10
- angular髒檢查原理及虛擬碼實現Angular
- Python課程程式碼實現Python
- 實現【檢視更多】功能的程式碼
- Vue eslint 程式碼檢查配置VueEsLint
- ESLint 靜態程式碼檢查EsLint
- ReactFlow程式碼靜態檢查React
- JS程式碼檢查工具ESLintJSEsLint
- CSS程式碼檢查工具stylelintCSS
- golangci-lint 程式碼檢查GolangGC
- 使用Tensorflow實現口算檢查器(1):模型選擇模型
- 生產消費實現-寫程式碼
- 美團外賣Android Lint程式碼檢查實踐Android
- 何為程式碼檢查服務的門禁級檢查
- Python實現拼多多商品資訊抓取方法Python
- 使用 Upsource 實現程式碼審查 - jetbrains 系列AI
- (十八)前端使用eslint程式碼檢查前端EsLint
- android 程式碼質量檢查工具Android
- java 程式碼編譯檢查工具Java編譯
- python加法程式碼如何寫Python
- 大家有沒有關於 Python 執行起來不錯的程式碼檢查工具?用於 CICD 裡面的靜態程式碼檢查Python
- Python程式碼實現“FlappyBird”小遊戲PythonAPP遊戲
- Python新手教程:40行python程式碼寫一個桌面翻譯器Python
- 輕鬆連線 ChatGPT實現程式碼審查ChatGPT
- 分享實用監控指令碼:使用Shell檢查程式是否存在指令碼
- 編譯檢查dsp程式碼的方法編譯
- python讀寫Excel表格程式碼PythonExcel
- 幾道JS程式碼手寫題以及一些程式碼實現JS