第一天學習進度–文本處理基礎知識學習
參考教程–python機器學習基礎教程
首先在對應目錄創建一個文件夾,裡面放上對應分類名稱(非中文)的文件夾,這個步驟是要讀取對應類型的數據。
結構如下圖所示:

我在txttype中放置了兩個分類的文件夾,每個類別的文件夾中放置了對應類型的文本(數量不限),每個需要訓練的語句都單獨作為一個文本,文本的名稱不做具體要求。
在python中寫入對應的程式碼:
from sklearn.datasets import load_files import numpy as np
#載入數據集
reviews_train = load_files(r"C:\Users\Halo\Desktop\1.6項目開發過程\txttype")
# load_files返回一個Bunch對象,其中包含訓練文本和訓練標籤
text_train, y_train = reviews_train.data, reviews_train.target
print("文本序列類型: {}".format(type(text_train)))
print("文本序列長度: {}".format(len(text_train)))
# print("text_train[1]:\n{}".format(text_train[1]))
#數據清洗
text_train = [doc.replace(b"<br />", b" ") for doc in text_train]
print("每個類型的樣本: {}".format(np.bincount(y_train)))
可以發現對應的文本文件已經被正確讀取

接著進行第二步,將文本數據轉化為詞袋
計算詞袋在書中的步驟原話為:
計算詞袋錶示包括以下三個步驟。
(1) 分詞(tokenization) 。將每個文檔劃分為出現在其中的單詞 [ 稱為詞例(token)],比如 按空格和標點劃分。
(2) 構建詞表(vocabulary building)。收集一個詞表,裡面包含出現在任意文檔中的所有詞, 並對它們進行編號(比如按字母順序排序)。
(3) 編碼(encoding)。對於每個文檔,計算詞表中每個單詞在該文檔中的出現頻次

將上述的過程合併之後:
from sklearn.feature_extraction.text import CountVectorizer bards_words =["The fool doth think he is wise,", "but the wise man knows himself to be a fool"] #切詞 vect = CountVectorizer() vect.fit(bards_words) print("Vocabulary size: {}".format(len(vect.vocabulary_))) print("Vocabulary content:\n {}".format(vect.vocabulary_)) #詞袋應用 bag_of_words = vect.transform(bards_words) print("bag_of_words: \n{}".format(repr(bag_of_words.toarray())))
上述是對於該用法的簡單應用,下面將配合參數調節對數據進行讀取。
可以先獲取前20個特徵
#切詞並獲得詞袋 vect = CountVectorizer().fit(text_train) #應用詞袋 X_train = vect.transform(text_train) print("X_train:\n{}".format(repr(X_train))) #獲得文本特徵 feature_names = vect.get_feature_names() print("特徵數量: {}".format(len(feature_names))) print("前20個特徵:\n{}".format(feature_names[:20]))
運行結果:

接著對模型進行評估:
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
#交叉驗證對LogisticRegression進行評估 scores = cross_val_score(LogisticRegression(), X_train, y_train, cv=5) print("平均交叉驗證精度: {:.2f}".format(np.mean(scores)))
運行結果:

在利用交叉驗證調節正則化參數C:
#交叉驗證調節正則化參數C from sklearn.model_selection import GridSearchCV param_grid = {'C': [0.001, 0.01, 0.1, 1, 10]} grid = GridSearchCV(LogisticRegression(), param_grid, cv=5) grid.fit(X_train, y_train) print("最好的交叉驗證分數: {:.2f}".format(grid.best_score_)) print("最好參數值: ", grid.best_params_)
運行結果:

接下來將數據應用到實際的測試集合上上看看該性能指標:
#載入測試集 reviews_test = load_files(r"C:\Users\Halo\Desktop\1.6項目開發過程\txttest") text_test, y_test = reviews_test.data, reviews_test.target print("測試集數量: {}".format(len(text_test))) print("文本序列長度: {}".format(np.bincount(y_test))) text_test = [doc.replace(b"<br />", b" ") for doc in text_test] #在測試集上評估參數泛化性能 X_test = vect.transform(text_test) print("測試集評估參數泛化性能:{:.2f}".format(grid.score(X_test, y_test)))
運行結果:

若數據過多,則可以對數據進行清洗:
#集合清洗 vect = CountVectorizer(min_df=5).fit(text_train) X_train = vect.transform(text_train) print("min_df: {}".format(repr(X_train))) feature_names = vect.get_feature_names() print("前50個特徵:\n{}".format(feature_names[:50])) #再次用玩個搜索看模型性能 grid = GridSearchCV(LogisticRegression(), param_grid, cv=5) grid.fit(X_train, y_train) print("最好交叉驗證分數: {:.2f}".format(grid.best_score_))
運行結果:



