基於貝葉斯演算法的拼寫檢查器

2021-08-09 20:16:31 字數 1205 閱讀 9537

涉及到了對整段文字的機器學習,通過學習根據詞頻計算每個單詞的先驗概率,在輸入乙個非正確的單詞後選擇編輯距離最近先驗概率最高的詞作為結果。

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

nw = train(words(open('big.txt').read()))

alphabet = 'abcdefghijklmnopqrstuvwxyz'

def edits1(word):#列舉編輯距離為一的單詞集合

n = len(word)

return set([word[0:i]+word[i+1:] for i in range(n)] +

[word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n-1)] +

[word[0:i]+c+word[i+1:] for i in range(n) for c in alphabet] +

[word[0:i]+c+word[i:] for i in range(n+1) for c in alphabet])

def edits2(word):

return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in nw)#編輯距離為2,只包含在學習集中的正確單詞

def known(words):

return set (w for w in words if w in nw)

def correct(word):

candidates = known([word]) or known(edits1(word)) or known(edits2(word))

return max(candidates,key = lambda w: nw[w])#輸出先驗概率最高的詞

correct(raw_input('input'))

貝葉斯拼寫檢查器

要是遇到我們從來沒有過見過的新詞怎麼辦.假如說乙個詞拼寫完全正確,但是語料庫中沒有包含這個詞,從而這個詞也永遠不會出現在訓練集中.於是,我們就要返回出現這個詞的概率是0.這個情況不太妙,因為概率為0這個代表了這個事件絕對不可能發生,而在我們的概率模型中,我們期望用乙個很小的概率來代表這種情況.lam...

貝葉斯拼寫檢查器

p w c 在使用者想鍵入 c 的情況下敲成 w 的概率.因為這個是代表使用者會以多大的概率把 c 敲錯成 w argmaxc,用來列舉所有可能的 c 並且選取概率最大的 import re,collections 把語料中的單詞全部抽取出來,轉成小寫,並且去除單詞中間的特殊符號 詞頻統計,並把最少...

貝葉斯拼寫檢查器

本拼寫檢查器是基於樸素貝葉斯的基礎來寫的,貝葉斯公式以及原理就不在詳述。直接上 import re,collections defwords text return re.findall a z text.lower deftrain features model collections.defau...