1. 程式人生 > 其它 >【小實驗講解】貝葉斯拼寫檢查器

【小實驗講解】貝葉斯拼寫檢查器

技術標籤: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'))