您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么用Python編寫一個拼寫糾錯器”,在日常操作中,相信很多人在怎么用Python編寫一個拼寫糾錯器問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用Python編寫一個拼寫糾錯器”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
代碼如下:
Python
# coding:utf-8
import re from collections import Counter
def words(text): return re.findall(r'\w+', text.lower())
# 統計詞頻 WORDS = Counter(words(open('big.txt').read()))
def P(word, N=sum(WORDS.values())): """詞'word'的概率""" return float(WORDS[word]) / N
def correction(word): """最有可能的糾正候選詞""" return max(candidates(word), key=P)
def candidates(word): """生成拼寫糾正詞的候選集合""" return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])
def known(words): """'words'中出現在WORDS集合的元素子集""" return set(w for w in words if w in WORDS)
def edits1(word): """與'word'的編輯距離為1的全部結果""" letters = 'abcdefghijklmnopqrstuvwxyz' splits = [(word[:i], word[i:]) for i in range(len(word) + 1)] deletes = [L + R[1:] for L, R in splits if R] transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R) > 1] replaces = [L + c + R[1:] for L, R in splits for c in letters] inserts = [L + c + R for L, R in splits for c in letters] return set(deletes + transposes + replaces + inserts)
def edits2(word): """與'word'的編輯距離為2的全部結果""" return (e2 for e1 in edits1(word) for e2 in edits1(e1)) |
函數correction(word)返回一個最有可能的糾錯還原單詞:
Python
>>>correction('speling') 'spelling' >>>correction('korrectud') 'corrected' |
該程序的4個部分:
1.選擇機制:在Python中,帶key的max()函數即可實現argmax的功能。
2.候選模型:先介紹一個新概念:對一個單詞的簡單編輯是指:刪除(移除一個字母)、置換(單詞內兩字母互換)、替換(單詞內一個字母改變)、插入(增加一個字母)。函數edits1(word)返回一個單詞的所有簡單編輯(譯者:稱其編輯距離為1)的集合,不考慮編輯后是否是合法單詞:
Python
def edits1(word): """與'word'的編輯距離為1的全部結果""" letters = 'abcdefghijklmnopqrstuvwxyz' splits = [(word[:i], word[i:]) for i in range(len(word) + 1)] deletes = [L + R[1:] for L, R in splits if R] transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R) > 1] replaces = [L + c + R[1:] for L, R in splits for c in letters] inserts = [L + c + R for L, R in splits for c in letters] return set(deletes + transposes + replaces + inserts) |
這個集合可能非常大。一個長度為n的單詞,有n個刪除編輯,n?1個置換編輯,26n個替換編輯,26(n+1)的插入編輯,總共54n+25個簡單編輯(其中存在重復)。例如:
Python
>>>len(edits1('something')) 442 |
然而,如果我們限制單詞為已知(known,譯者:即存在于WORDS字典中的單詞),那么這個單詞集合將顯著縮小:
Python
def known(words): """'words'中出現在WORDS集合的元素子集""" return set(w for w in words if w in WORDS)
>>>known(edits1('something')) ['something', 'soothing'] |
我們也需要考慮經過二次編輯得到的單詞(譯者:“二次編輯”即編輯距離為2,此處作者巧妙運用遞歸思想,將函數edits1返回集合里的每個元素再次經過edits1處理即可得到),這個集合更大,但仍然只有很少一部分是已知單詞:
Python
def edits2(word): """與'word'的編輯距離為2的全部結果""" return (e2 for e1 in edits1(word) for e2 in edits1(e1))
>>> len(set(edits2('something')) 90902
>>> known(edits2('something')) {'seething', 'smoothing', 'something', 'soothing'}
>>> known(edits2('somthing')) {'loathing', 'nothing', 'scathing', 'seething', 'smoothing', 'something', 'soothing', 'sorting'} |
我們稱edits2(w)結果中的每個單詞與w的距離為2。
3.語言模型:我們通過統計一個百萬級詞條的文本big.txt中各單詞出現的頻率來估計P(w),它的數據來源于古騰堡項目中公共領域的書摘,以及維基詞典中頻率最高的詞匯,還有英國國家語料庫,函數words(text)將文本分割為詞組,并統計每個詞出現的頻率保存在變量WORDS中,P基于該統計評估每個詞的概率:
Python
def words(text): return re.findall(r'\w+', text.lower())
# 統計詞頻 WORDS = Counter(words(open('big.txt').read()))
def P(word, N=sum(WORDS.values())): """詞'word'的概率""" return float(WORDS[word]) / N |
可以看到,去重后有32,192個單詞,它們一共出現1,115,504次,”the”是出現頻率最高的單詞,共出現79,808次(約占7%),其他詞概率低一些。
Python
>>> len(WORDS) 32192
>>> sum(WORDS.values()) 1115504
>>> WORDS.most_common(10) [('the', 79808), ('of', 40024), ('and', 38311), ('to', 28765), ('in', 22020), ('a', 21124), ('that', 12512), ('he', 12401), ('was', 11410), ('it', 10681), ('his', 10034), ('is', 9773), ('with', 9739), ('as', 8064), ('i', 7679), ('had', 7383), ('for', 6938), ('at', 6789), ('by', 6735), ('on', 6639)]
>>> max(WORDS, key=P) 'the'
>>> P('the') 0.07154434228832886
>>> P('outrivaled') 8.9645577245801e-07
>>> P('unmentioned') 0.0 |
4.錯誤模型:2007年坐在機艙內寫這個程序時,我沒有拼寫錯誤的相關數據,也沒有網絡連接(我知道這在今天可能難以想象)。沒有數據就不能構建拼寫錯誤模型,因此我采用了一個捷徑,定義了這么一個簡單的、有缺陷的模型:認定對所有已知詞距離為1的編輯必定比距離為2的編輯概率更高,且概率一定低于距離為0的單詞(即原單詞)。因此函數candidates(word)的優先級如下:
1. 原始單詞(如果已知),否則到2。
2. 所有距離為1的單詞,如果為空到3。
3. 所有距離為2的單詞,如果為空到4。
4. 原始單詞,即使它不是已知單詞。
到此,關于“怎么用Python編寫一個拼寫糾錯器”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。