貝葉斯實現拼寫檢查器

2021-09-13 02:47:02 字數 2193 閱讀 6254

貝葉斯實現拼寫檢查器

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()))

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 known_edist2(word):

return set(e2 for e1 in edist1(word) for e2 in edist1(e1) if e2 in edist1(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_edist2(word) or [word]

return max(candidates,key=lambda w:nwords[w])

print(correct('norw'))

求解:

argmaxc p(c|w)->argmaxc p(w|c)p(c)/p(w)

argmaxc:用來列舉所有可能的c並選取最大的

p(c):先驗概率,鍵入c的可能性是多大

p(w|c):想鍵入c敲成w

#把語料中的單詞全部抽取出來,轉成小寫,並且除去單詞中間的符號

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()))

print(nwords)

兩個詞之間的編輯距離,定義為使用了幾次插入,刪除,交換,替換的操作從乙個詞變到另乙個詞

#返回所有與單詞w編輯距離為1的集合

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 alphabet]+#alteration

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

#返回所有與單詞w編輯距離為2的集合

#在這些距離小於2的詞中間,只把那些正確的單詞作為候選詞

def known_edist2(word):

return set(e2 for e1 in edist1(word) for e2 in edist1(e1) if e2 in edist1(e1) if e2 in nwords)

貝葉斯拼寫檢查器

要是遇到我們從來沒有過見過的新詞怎麼辦.假如說乙個詞拼寫完全正確,但是語料庫中沒有包含這個詞,從而這個詞也永遠不會出現在訓練集中.於是,我們就要返回出現這個詞的概率是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...