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