
文檔處理
樸素貝葉斯算法常用于文檔的分類問題上,但計算機是不能直接了解文檔内容的,怎麼把文檔内容轉換為計算機可以計算的數字,這是自然語言處理(NLP)中很重要的内容。
TF-IDF方法
今天我們簡單講解TF-IDF方法,将文本資料轉換為數字。TF-IDF是一個統計方法,用來評估單個單詞在文檔中的重要程度。
TF表示詞頻,對一個文檔而言,詞頻就是詞在文檔出現的次數除以文檔的詞語總數。例如:一篇文檔有1000個字,“我”字出現25次,那就是0.025;“Python”出現5次就是0.005。
IDF表示一個詞的逆向文檔頻率指數。可以由總文檔數除以包含該詞出現的文檔數目,然後取對數。例如:有10000個文檔,“Python”隻出現了10篇文章,則IDF=log(10000/10)=3;“我”字在所有文檔都出現過,則IDF為0。
詞頻和權重指數相乘,就是詞在文檔中的重要程度。可以看出,詞語的重要性随它在文檔中出現的次數呈正比例增加,但同時會随着它在語料庫中出現的頻率呈反比下降。
實戰——文檔分類
資料導入和TF-IDF
在sklearn中,通過load_files方法可以将子目錄的名字轉換為文檔類别(target),将目錄所有文檔讀入記憶體(data)。
from sklearn.datasets import load_files
news_train = load_files('data/379/train')
通過TfidfVectorizer方法,将文檔資料進行轉換:
from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer(encoding='latin-1')
X_train = vect.fit_transform(news_train.data)
模型訓練
樸素貝葉斯算法使用sklearn.naive_bayes子產品中的MultinomialNB方法。
from sklearn.naive_bayes import MultinomialNB
y_train = news_train.target
clf = MultinomialNB(alpha=0.0001)
clf.fit(X_train, y_train)
train_score = clf.score(X_train, y_train)
# result
# 0.99787556904400609
模型評估
簡單的,可以通過score方法來評估整個模型的精度。
news_test = load_files('data/379/test')
X_test = vect.transform(news_test.data)
y_test = news_test.target
clf.score(X_test, y_test)
# result
# 0.90881728045325783
我們也可以通過classification_report方法來檢視全方位的評價。
from sklearn.metrics import classification_report
pred = clf.predict(X_test)
print(classification_report(y_test, pred, target_names=news_test.target_names))
也可以檢視我們的混淆矩陣。
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, pred)
print(cm)