小專案 貝葉斯實現拼寫檢查

2021-08-28 18:24:57 字數 1669 閱讀 1304

import re #正規表示式

from collections import defaultdict #

#定義乙個函式將文字中所有的單詞抽取出來,轉換成小寫並去除特殊字元

def words(text):

return re.findall("[a-z]+",text.lower())

#定義詞頻函式

def wordsfrequency(word):

#定義乙個字典

model = defaultdict(lambda:1) #定義乙個字典預設值為1,因為當我們遇到沒有見過的新詞,因為語料庫沒有這個詞則返回的概率為0

#就是表示不能發生事件,而在我們的概率模型中我們期望用乙個很小的概率代替這種情況,所以初始的詞頻都為1

print(type(model)) #for w in word:

model[w] += 1 #如果語料庫出現了這個詞則加一

return model

nwords = wordsfrequency(words(open(r'big.txt').read()))

#print(nwords)

alphabet = "abcdefghijklmnopqrstuvwxyz"

#print(len(alphabet))

#編輯距離

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

def edits1(word): #返回所有與單詞w編輯距離為1(做一次操作)的集合

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) for c in alphabet])

#與something編輯距離為2(做兩個操作,如替換兩個字母)的單詞居然達到了114324個

def edits2(word): #編輯距離為2的集合

return set(e2 for e1 in edits1(word) for e2 in edits1(e1))

#按照編輯距離來算資料量太大,我們需要優化,只返回在語料庫中出現的的詞"smoothing","something","soothing"

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

correctword = correct("morw")

print(correctword) #more

貝葉斯實現拼寫檢查器

貝葉斯實現拼寫檢查器 import re,collections def words text return re.findall a z text.lower def train features model collections.defaultdict lambda 1 for f in fe...

貝葉斯拼寫檢查器

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

貝葉斯拼寫檢查器

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