下面,借助樸素貝葉斯分類器的基本思想,編寫乙個單詞拼寫糾正器,它大致實現的功能如下:
如果使用者輸入的單詞存在,則直接提示在字典中發現,並返回
如果單詞不在詞典中,糾正器會猜測使用者的可能輸入,然後做出最多兩步的距離調整,並返回糾正後,使用者最可能想輸入的前三個單詞
如果經過最多的兩步調整後,還是未找到,則提示想輸入的單詞在字典中不存在。
以上是糾正器能實現的糾正例項,那麼該如何實現這麼乙個單詞拼寫錯誤檢查和糾正的工具呢。
如果使用者實際輸入的單詞為 w(word的簡寫), 然後拼寫糾正器猜測使用者實際想輸入的單詞為 c1, c2 , c3 , ……. 因此,我們可以猜測使用者輸入了 p(c1 | w) ,p(c2 | w),p(c3 | w)等等這些多種猜測。如果發現p(c1 | w) 的概率最大,那麼使用者很有可能想輸入的那個單詞為 c1 。這個概率可以統一表示為:
p(c | w)
如何求解這個概率的最大值?
p(w | c) 的求解方法通常會有很多種,比如使用者想輸入hello,但是實際輸入了 hella,它們之間的區別僅僅是最後乙個字元輸入錯誤,這個出現的概率還是挺大的吧;但是,再看看下面這個例子。
如果使用者想輸入awesome, 但是實際輸入成了owesomes,輸錯了1個字元,多新增了 1個字元,這種情況發生的概率就比上面那種小一些吧。
因此,在本文中設計的糾正器沒有直接去量化 p(w | c) 這個概率,而是採取了從定性上進行分析,通常經過一步調整出現的概率大於經過兩步調整出現的概率。所以,當糾正器遇到乙個待糾正的詞語時,它會糾正一步,如果發現了,就直接返回了;否則才會進行兩步調整,這種調整的優先順序的原理是根據 p(w | c) 。
這樣先驗概率 p(c) 和類條件概率 p(w | c) 的求解方法就弄明白了,當一步糾正就能在語料庫找到對應後,就不會進行兩步糾正,但是一步糾正會返回多個,此時再根據p(c)找出這些中的出現頻次最多的,這樣最終的結果便是猜測到的使用者最有可能想輸入的單詞。
import re, collections
deftolower
(text):
return re.findall('[a-z]+',text.lower())
defprior
(cwords):
model = collections.defaultdict(lambda:1)
for f in cwords:
model[f]+=1
return model
ipath = './bigword.txt'
uipath = ipath.encode("utf8")
htxt = open(uipath,'r',errors ='ignore')
cwords = tolower(htxt.read())
#get p(c)
nwords = train(cwords)
nwords
類條件概率
alpha = 'abcdefghijklmnopqrstuvwxyz'
#一步調整
def version1(word):
n = len(word)
add_a_char = [word[0:i] + c + word[i:] for i in range(n+1) for c in alpha]
delete_a_char = [word[0:i] + word[i+1:] for i in range(n)]
revise_a_char = [word[0:i] + c + word[i+1:] for i in range(n) for c in alpha]
swap_adjacent_two_chars = [word[0:i] + word[i+1]+ word[i]+ word[i+2:] for i in range(n-1)]
return
set( add_a_char + delete_a_char +
revise_a_char + swap_adjacent_two_chars)
#兩步調整
defversion2
(word):
return set(e2 for e1 in edits1(word) for e2 in edits1(e1))
樸素貝葉斯分類器
defidentify
(words):
return set(w for w in words if w in nwords)
defgetmax
(wanteds):
threewanteds=
maxword = max(wanteds,key=lambda w : nwords[w])
wanteds.remove(maxword)
if len(wanteds)>0:
maxword = max(wanteds,key=lambda w : nwords[w])
wanteds.remove(maxword)
if len(wanteds)>0:
maxword = max(wanteds,key=lambda w : nwords[w])
return threewanteds
def
bayesclassifier
(word):
#如果字典中有輸入的單詞,直接返回
if identify([word]):
return
'found: '+ word
#一步調整
wanteds = identify(version1(word))
if len(wanteds)>0:
return getmax(wanteds)
#兩步調整
wanteds = identify(version2(word))
if len(wanteds)>0:
return getmax(wanteds)
#不再修正,直接提示這個單詞不在當前的詞典中
else:
return [word + ' not found in dictionary!' ]
歡迎關注 演算法channel
利用貝葉斯公式實現單詞拼寫糾正器
下面總結幾個我在學習貝葉斯公式的時候能夠對我的理解有所幫助的要點,首先引用一句話 概率論只不過把常識用數學公式表達了出來 拉普拉斯 貝葉斯公式將人的思維方式用數學公式表達出來,所以貝葉斯公式在機器學習中的應用則是將人的思維賦予機器。先抄一遍貝葉斯公式 貝葉斯公式的直觀理解就是,展示了先驗概率跟後驗概...
力扣題目學習 拼寫單詞
給你乙份 詞彙表 字串陣列 words 和一張 字母表 字串 chars。假如你可以用 chars 中的 字母 字元 拼寫出 words 中的某個 單詞 字串 那麼我們就認為你掌握了這個單詞。注意 每次拼寫時,chars 中的每個字母都只能用一次。返回詞彙表 words 中你掌握的所有單詞的 長度之...
貝葉斯單詞拼寫檢查器
記錄一下簡單的單詞拼寫檢查器,達到能對錯誤單詞進行簡單的修正的目的。要是遇到我們從來沒有過見過的新詞怎麼辦.假如說乙個詞拼寫完全正確,但是語料庫中沒有包含這個詞,從而這個詞也永遠不會出現在訓練集中.於是,我們就要返回出現這個詞的概率是0.這個情況不太妙,因為概率為0這個代表了這個事件絕對不可能發生,...