一個21行Python代碼實現拼字檢查器的方法

來源:互聯網
上載者:User

引入

大家在使用Google或者百度搜尋時,輸入搜尋內容時,Google總是能提供非常好的拼字檢查,比如你輸入 speling,Google會馬上返回 spelling
下面是用21行python代碼實現的一個簡易但是具備完整功能的拼字檢查器。

代碼

import re, collectionsdef 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 modelNWORDS = 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作為我們的樣本資料。

背後原理

上面的代碼是基於貝葉斯來實現的,事實上Google百度實現的拼字檢查也是通過貝葉斯實現,不過肯定比這個複雜多了。
首先簡單介紹一下背後的原理,如果讀者之前瞭解過了,可以跳過這段。
給一個詞,我們試圖選取一個最可能的正確的的拼字建議(建議也可能就是輸入的單詞)。有時也不清楚(比如lates應該被更正為late或者latest?),我們用機率決定把哪一個作為建議。我們從跟原始詞w相關的所有可能的正確拼字中找到可能性最大的那個拼字建議c:

argmaxc  P(c|w)

通過貝葉斯定理,上式可以轉化為

argmaxc P(w|c) P(c) / P(w)

下面介紹一下上式中的含義:

  1. P(c|w)代表在輸入單詞w 的情況下,你本來想輸入 單詞c的機率。

  2. P(w|c)代表使用者想輸入單詞c卻輸入w的機率,這個可以我們認為給定的。

  3. P(c)代表在樣本資料中單詞c出現的機率

  4. 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]+’是利用pythonRegex模組,提取所有的符合’[a-z]+’條件的,也就是由字母組成的單詞。(這裡不詳細介紹Regex了,有興趣的同學可以看 Regex簡介。text.lower()是將文本轉化為小寫字母,也就是“the”和“The”一樣定義為同一個單詞。

利用train()Function Compute每個單詞出現的次數然後訓練出一個合適的模型

def train(features):    model = collections.defaultdict(lambda: 1)    for f in features:        model[f] += 1    return modelNWORDS = 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
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.