1. 程式人生 > >用貝葉斯實現拼寫檢查器

用貝葉斯實現拼寫檢查器

alt rec lam 最終 findall features 判斷 edit correct

貝葉斯公式

p(A|D)=p(A)*p(D|A)/p(D);

可以應用於垃圾郵件的過濾和拼寫檢查

例如:對於拼寫檢查,寫出一個單詞D,判斷該單詞為正確單詞A的概率。為上述條件概率的描述。

其中p(A)為先驗概率,可以根據現有的數據庫中的單詞,來獲得A單詞的概率p(A)。由於正確的單詞不僅僅有A,還有可能有A1,A2....

最終比較p(A1|D),p(A2|D),p(A3|D)...由於分母比較時相同,可以只比較分子p(A)*p(D|A)

p(A|D)正比於p(A)*p(D|A)

分別計算p(A1)*p(D|A1),p(A2)*p(D2|A)。其中p(D|A),例如在寫A=good,錯寫為D=gooe是的概率。是根據增刪減距離獲得。

若 p(A1)*p(D|A1)=p(A2)*p(D2|A),則根據實際生活中先驗概率的選擇p(A1),p(A2)大小選擇。

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(open(big.txt
).read())) alphabelt=abcdefghijklmnopqrstuvwxyz def edits1(word): n=len(word) return set([word[0:i]+word[i+1:] for i in range(n)]+ #deletion [word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n-1)]+ #transposition [word[0:i]+c+word[i+1:]for i in range(n) for
c in alphabelt]+ #alteration [word[0:i]+c+word[i:] for i in range(n+1)for c in alphabelt]) #insertion 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=lambda w:NWORDS[w])

print(correct(‘goode‘))

good

用貝葉斯實現拼寫檢查器