利用樸素貝葉斯實現拼寫檢查器

2021-09-26 14:23:37 字數 2108 閱讀 5520

import re

import collections

class spellcheck():

"""p(c|w) = p(w|c)p(c) / p(w)

p(c):文章出現正確拼寫詞c的概率,程式中直接用詞頻表示

p(w|c):使用者把詞c錯敲成w的概率

"""alphabet = list('abcdefghijklmnopqrstuvwxyz')

# 讀取資料

def get_data(self):

fp = open("big.txt", 'r', encoding='utf-8')

return fp.read()

# 只拿文字中的單詞

def get_words(self):

text = self.get_data().lower()

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

# 詞頻統計,返回的是詞語和出現的次數

def train(self):

result = collections.defaultdict(lambda: 1)

for word in self.get_words():

result[word] += 1

return result

def edit_first(self, word):

"""只編輯一次就把乙個單詞變為另乙個單詞

:return: 所有與單詞word編輯距離為1的集合

"""length = len(word)

return set([word[0:i] + word[i + 1:] for i in range(length)] + # 從頭至尾,依次將word中刪除乙個字母,構成乙個新單詞

[word[0:i] + word[i + 1] + word[i] + word[i + 2:] for i in range(length - 1)] + # 從頭至尾,依次將word中相鄰的兩個字母調換順序,構成乙個新單詞

[word[0:i] + c + word[i + 1:] for i in range(length) for c in self.alphabet] + # 從頭至尾,依次將word中的乙個字母進行修改

[word[0:i] + c + word[i:] for i in range(length + 1) for c in self.alphabet]) # 從頭到尾,依次在word中插入乙個字母

def edit_second(self, word):

""":return: 編輯兩次的集合

"""words = self.train()#得到存放著所有單詞詞頻的字典

return set(e2 for e1 in self.edit_first(word) for e2 in self.edit_first(e1) if e2 in words)

def already_words(self, word):

""":return: 返回已知的和錯誤單詞相近的正確單詞集合,允許進行兩次編輯

"""words = self.train()

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

def check(self, word):

words = self.train()

#輸入的單詞是否在字典中 一次編輯的單詞是否在字典中 二次編輯的單詞是否在字典中

neighborhood = self.already_words([word]) \

or self.already_words(self.edit_first(word)) \

or self.already_words(self.edit_second(word)) \

or [word]

# 取概率最大的正確單詞,即詞頻最多的

return max(neighborhood, key=lambda w: words[w])

if __name__ == '__main__':

s = spellcheck()

print("當前輸入的值為:musac","**值為:",s.check('musac'))

貝葉斯實現拼寫檢查器

貝葉斯實現拼寫檢查器 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 把語料中的單詞全部抽取出來,轉成小寫,並且去除單詞中間的特殊符號 詞頻統計,並把最少...