用貝葉斯實現拼寫檢查器
阿新 • • 發佈:2018-06-29
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) forc 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
用貝葉斯實現拼寫檢查器