【小實驗講解】貝葉斯拼寫檢查器
阿新 • • 發佈:2021-01-09
技術標籤:Python_小實驗原理解析python深度學習自然語言處理機器學習
貝葉斯拼寫檢查器
python程式碼
big.txt只是一個語料庫大家網上可以找得到。
拼寫檢查器的程式碼+註釋
# ##求解: argmaxc P(c|w) > argmaxc P(w|c) P(c) / P(w)
# - P(c), 文章中出現一個正確拼寫詞c的概率,也就是說,在英語文章中,c出現的概率有多大
# - P(w|c). 在使用者想鍵入c的情況下敲成心w的概率、因為這個是代表使用者會以多大的概率把c敲錯成w。
# - argmaxc, 用來列舉所有可能的c並且選取概率最大的
import collections
import re
# 所有單詞以及出現的次數
Dict_Word_Frequency = ''
def get_Words(text):
'''把語料中的單詞全部抽取出來, 轉成小寫, 並且去除單詞中間的特殊符號'''
new_text = re.findall('[a-z]+',text.lower())
return new_text
def get_Word_Frequency(words):
'''獲取詞頻,統計每個單詞出現的次數'''
# 建立字典(鍵為單詞名,值為詞頻),預設每個單詞出現一次
model = collections.defaultdict(lambda :1)
# 為每一個單詞計算詞頻
for i in words:
model[i] = model[i] + 1
return model
def calculate_Edits1(word):
'''返回所有編輯距離為1的單詞集合'''
# 所有字母
alphabet = 'abcdefghijklmnopqrstuvwxyz'
# 單詞長度
n = len(word)
# 所有可能拼錯的的單詞集合
word_sets = set()
# 缺少單詞的(eg:the-th)
for i in range(n):
word_sets.add(word[0:i] + word[i + 1:])
# 順序調換的(eg:the-eth)
for i in range(n - 1):
word_sets.add(word[0:i] + word[i + 1] + word[i] + word[i + 2:])
# 單詞替換的(eg:the-thy)
for c in alphabet:
for i in range(n):
word_sets.add(word[0:i] + c + word[i + 1:])
# 單詞多加的(eg:the-thei)
for c in alphabet:
for i in range(n):
word_sets.add(word[0:i] + c + word[i:])
return word_sets
def calculate_Edits2(word):
'''返回所有編輯距離為2的單詞集合,但只選擇正確的'''
# 所有可能拼錯的的單詞集合
word_sets =set()
for ele1 in calculate_Edits1(word):
for ele2 in calculate_Edits1(ele1):
word_sets.add(ele2)
return word_sets
def known(words):
'''只把那些正確的詞作為候選詞'''
word_sets = set()
for w in words:
if(w in Dict_Word_Frequency):
word_sets.add(w)
return word_sets
def correct(word):
'''如果known(set)非空, candidate 就會選取這個集合, 而不繼續計算後面的'''
candidates = known([word]) or known(calculate_Edits1(word)) or calculate_Edits2(word) or [word]
# 根據詞頻選擇candidates中詞頻最高的拿出來返回
return max(candidates, key=lambda w: Dict_Word_Frequency[w])
if __name__ == '__main__':
# 語料庫路徑
File_Path = 'big.txt'
# 讀取語料庫中的全部文字
All_Word_Text = open(File_Path).read()
# 把語料中的單詞全部抽取出來, 轉成小寫, 並且去除單詞中間的特殊符號
All_New_Word_Text = get_Words(All_Word_Text)
# 從所有單詞中獲取詞頻
Dict_Word_Frequency = get_Word_Frequency(All_New_Word_Text)
# 進行拼寫檢查
print(correct('thi'))