机器学习实战-贝叶斯算法-24
貝葉斯-新聞分類
from sklearn.datasets import fetch_20newsgroups from sklearn.model_selection import train_test_split news = fetch_20newsgroups(subset='all') print(news.target_names) print(len(news.data)) print(len(news.target)) print(len(news.target_names)) news.data[0] print(news.target[0]) print(news.target_names[news.target[0]]) x_train,x_test,y_train,y_test = train_test_split(news.data,news.target) # train = fetch_20newsgroups(subset='train') # x_train = train.data # y_train = train.target # test = fetch_20newsgroups(subset='test') # x_test = test.data # y_test = test.target from sklearn.feature_extraction.text import CountVectorizertexts=["dog cat fish","dog cat cat","fish bird", 'bird'] cv = CountVectorizer() cv_fit=cv.fit_transform(texts)# print(cv.get_feature_names()) print(cv_fit.toarray())print(cv_fit.toarray().sum(axis=0)) from sklearn import model_selection from sklearn.naive_bayes import MultinomialNBcv = CountVectorizer() cv_data = cv.fit_transform(x_train) mul_nb = MultinomialNB()scores = model_selection.cross_val_score(mul_nb, cv_data, y_train, cv=3, scoring='accuracy') print("Accuracy: %0.3f" % (scores.mean()))
TfidfVectorizer使用了一個高級的計算方法,稱為Term Frequency Inverse Document
Frequency (TF-IDF)。這是一個衡量一個詞在文本或語料中重要性的統計方法。直覺上講,該方法通過比較在整個語料庫的詞的頻率,尋求在當前文檔中頻率較高的詞。這是一種將結果進行標準化的方法,可以避免因為有些詞出現太過頻繁而對一個實例的特征化作用不大的情況(我猜測比如a和and在英語中出現的頻率比較高,但是它們對于表征一個文本的作用沒有什么作用)
貝葉斯拼寫檢查器
拼寫檢查器原理
在所有正確的拼寫詞中, 我們想要找一個正確的詞 c, 使得對于 w 的條件概率最大。求解:
P(c|w) -> P(w|c) P? / P(w)
比如:appla是條件w,apple和apply是正確的詞c,對于apple和apply來說P(w)都是一樣的,所以我們在上式中忽略它, 寫成:
P(w|c) P?
P?, 文章中出現這個正確拼寫的詞 c 的概率, 也就是說, 在英語文章中, c 出現的概率有多大。
假設可以認為單詞在文章中出現的概率越大,則正確拼寫的概率就越大,可以用單詞出現次數來代替這個量。好比說, 英語中出現 the 的概率 P(‘the’) 就相對高, 而出現 P(‘zxzxzxzyy’) 的概率接近0(假設后者也是一個詞的話).
P(w|c), 在用戶想鍵入 c 的情況下敲成 w 的概率。這個是代表用戶會以多大的概率把 c 敲錯成 w。
編輯距離:
兩個詞之間的編輯距離定義為使用了幾次插入(在詞中插入一個單字母), 刪除(刪除一個單字母), 交換(交換相鄰兩個字母), 替換(把一個字母換成另一個)的操作從一個詞變到另一個詞.
與 something 編輯距離為1或者2的單詞居然達到了 114,818 個
優化:只把那些正確的詞作為候選詞,優化之后edits2只能返回 3 個單詞: ‘smoothing’, ‘something’ 和 ‘soothing’
P(w|c)求解:正常來說把一個元音拼成另一個的概率要大于輔音 (因為人常常把 hello 打成 hallo 這樣); 把單詞的第一個字母拼錯的概率會相對小, 等等。但是為了簡單起見, 選擇了一個簡單的方法: 編輯距離為1的正確單詞比編輯距離為2的優先級高, 而編輯距離為0的正確單詞優先級比編輯距離為1的高.一般把hello打成hallo的可能性比把hello打成halo的可能性大。
def known(words):w = set()for word in words:if word in dic_words:w.add(word)return w# 先計算編輯距離,再根據編輯距離找到最匹配的單詞 def correct(word):# 獲取候選單詞#如果known(set)非空, candidates 就會選取這個集合, 而不繼續計算后面的candidates = known([word]) or known(edits1(word)) or known(edits2(word)) or word# 字典中不存在相近的詞if word == candidates:return word# 返回頻率最高的詞max_num = 0for c in candcidates:if dic_words[c] >= max_num:max_num = dic_words[c]candidate = creturn candidate總結
以上是生活随笔為你收集整理的机器学习实战-贝叶斯算法-24的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习实战-集成学习-23
- 下一篇: 机器学习实战-聚类分析KMEANS算法-