編者按:文本分類是各類應用中的一種基礎機器學習問題,近日,一篇關于文本分類的文章成功引起學界大牛和競賽機構注意,讓他們在twitter上爭相轉載。那么,它到底講述了什么內容呢?考慮到原文過長,本文是其中的(上)篇。
文本分類是一種應用廣泛的算法,它是各種用于大規模處理文本數據的軟件系統的核心,常被用于垃圾郵件識別及幫助論壇機器人標記不當評論。
當然,以上只是文本分類的兩種常規應用,它們處理的是預定義的二元分類問題。在多元分類任務中,算法分類主要基于本文中的關鍵詞
分類器標記垃圾郵件,并把它們過濾到垃圾郵件文件夾中
另一種常見的文本分類是情感分析,它的目標是識別文本內容積極與否:文字所表達的思想類型。同樣的,這也是多元分類問題,我們可以采用二元的喜歡/不喜歡評級形式,也可以進一步細化,如設成1星到5星的星級評級。情感分析的常見應用包括分析影評,判斷消費者是否喜歡這部電影,或者是分析大型商場的評論,推測普通大眾對某個品牌新產品的看法。
本指南將介紹一些解決文本分類問題的機器學習最佳實踐,你可以從中學到:
用機器學習解決文本分類問題
如何為文本分類問題挑選正確的模型
如何用TensorFlow實現你選擇的模型
文本分類流程
第一步:收集數據
第二步:探索數據
第2.5步:選擇一個模型
第三步:準備數據
第四步:構建、訓練、評估模型
第五步:調整超參數
第六步:部署模型
文本分類流程
第一步:收集數據
收集數據是解決任何監督學習問題的最重要一步,數據的質量和數量直接決定著文本分類器的性能上限。
如果你沒有想要解決的的特定問題,或者只是對一般的文本分類感興趣,你可以直接用已經開源的大量數據集。這個GitHub repo里可能包含不少你可以用到的鏈接:github.com/google/eng-edu/blob/master/ml/guides/textclassification/loaddata.py。
但是,如果你有一個待解決的特定問題,你就得先收集必要數據。當然,有些數據是現成的,一些組織會提供訪問其數據的公共API,比如Twitter API或NY Times API,如果有用,你可以直接通過它們來解決自己的問題。
以下是收集數據過程中的一些注意事項:
如果使用公共API,請在使用前先閱讀它們的使用限制,比如某些API會對你的訪問速度設限。
收集訓練樣本的量永遠是越多越好,這有助于模型更好地概括。
如果涉及分類,確保每個類的樣本數量不會過度失衡,換句話說,每個類中都應該有相當數量的樣本。
確保你的樣本可以覆蓋所有可能的輸入空間,而不僅僅是最常見的幾種情況。
在本指南中,我們將以斯坦福大學開源的大型電影評論數據集(IMDb)為例,說明整個本文分類流程。該數據集包含人們在IMDb網站上發布的電影評論,以及評論者是否喜歡電影的相應標簽(“positive”或“negative”)。這是用于情緒分析問題的一個經典數據集。
第二步:探索數據
構建、訓練模型只是整個流程的一部分,如果事先能了解數據特征,這會對之后的模型構建大有裨益,比如更高的準確率,或是更少的數據和更少的計算資源。
加載數據集
首先,讓我們將數據集加載到Python中:
def load_imdb_sentiment_analysis_dataset(data_path, seed=123):
"""Loads the IMDb movie reviews sentiment analysis dataset.
# Arguments
data_path: string, path to the data directory.
seed: int, seed for randomizer.
# Returns
A tuple of training and validation data.
Number of training samples: 25000
Number of test samples: 25000
Number of categories: 2 (0 - negative, 1 - positive)
# References
Mass et al., http://www.aclweb.org/anthology/P11-1015
Download and uncompress archive from:
http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
"""
imdb_data_path = os.path.join(data_path, 'aclImdb')
# Load the training data
train_texts = []
train_labels = []
for category in ['pos', 'neg']:
train_path = os.path.join(imdb_data_path, 'train', category)
for fname in sorted(os.listdir(train_path)):
if fname.endswith('.txt'):
with open(os.path.join(train_path, fname)) as f:
train_texts.append(f.read())
train_labels.append(0if category == 'neg'else1)
# Load the validation data.
test_texts = []
test_labels = []
for category in ['pos', 'neg']:
test_path = os.path.join(imdb_data_path, 'test', category)
for fname in sorted(os.listdir(test_path)):
if fname.endswith('.txt'):
with open(os.path.join(test_path, fname)) as f:
test_texts.append(f.read())
test_labels.append(0if category == 'neg'else1)
# Shuffle the training data and labels.
random.seed(seed)
random.shuffle(train_texts)
random.seed(seed)
random.shuffle(train_labels)
return ((train_texts, np.array(train_labels)),
(test_texts, np.array(test_labels)))
檢查數據
加載完數據后,最好對其一一檢查:選擇一些樣本,手動檢查它們是否符合你的預期。比如示例用的電影評論數據集,我們可以輸出一些隨機樣本,檢查情緒標簽和評論包含的情緒是否一致。
“十分鐘的故事非要講兩小時,要不是沒什么大事,我早就中途起身走人了。”
這是數據集中被標記為“negative”的評論,很顯然,評論者覺得電影非常拖沓、無聊,這和標簽是匹配的。
收集關鍵指標
完成檢查后,你需要收集以下重要指標,它們有助于表征文本分類任務:
樣本數:數據集中的樣本總數。
類別數:數據集中的主題或分類數。
每個類的樣本數:如果是均衡的數據集,所有類應該包含數量相近的樣本;如果是不均衡的數據集,每個類所包含的樣本數會有巨大差異。
每個樣本中的單詞數:這是文本分類問題,所以要統計樣本所包含單詞數的中位數。
單詞詞頻分布:數據集中每個單詞的出現頻率(出現次數)。
樣本長度分布:數據集中每個樣本的
第2.5步:選擇一個模型
到目前為止,我們已經匯總了數據,也深入了解了數據中的關鍵特征。接下來,根據第二步中收集的各個指標,我們就要開始考慮應該使用哪種分類模型了。這也意味著我們會提出以下這些問題:“我們該怎么把文本數據轉成算法輸入?”(數據預處理和向量化),“我們應該使用什么類型的模型?”,“我們的模型應該實用什么參數配置?”……
得益于數十年的研究,現在數據預處理和模型配置的選擇非常多元化,但這么多的選擇其實也帶來了不少麻煩,我們手頭只有一個特定問題,它的范圍也很寬泛,那么怎么選才是最好的呢?最老實的方法是一個個試過去,去掉不好的,留下最好的,但這種做法并不現實。
在本文中,我們嘗試著簡化選擇文本分類模型的過程。對于給定數據集,我們的目標只有兩個:準確率接近最高,訓練時間盡可能最低。我們針對不同類型的問題(特別是情感分析和主題分類問題)進行了大量(~450K)實驗,共計使用12個數據集,交替測試了不同數據預處理技術和不同模型架構的情況。這個過程有助于我們獲得影響優化的各個參數。
下面的模型選擇和流程圖是以上實驗的總結。
數據準備與模型算法構建
計算比率:樣本數/單個樣本平均單詞數
如果以上比率小于1500,對文本進行分詞,然后用簡單的多層感知器(MLP)模型對它們進行分類(下圖左側分支)
a.用n元模型對句子分詞,并把詞轉換成詞向量
b.根據向量的重要程度評分,從中抽出排名前2萬的詞
c.構建MLP模型
如果以上比率大于1500,則將文本標記成序列,用sepCNN模型對它們進行分類(下圖右側分支)
a.對樣本進行分詞,根據單詞詞頻選擇其中的前2萬個
b.將樣本轉換為單詞序列向量
c.如果比率小于1500,用預訓練的sepCNN模型進行詞嵌入,效果可能會很好
調整超參數,尋找模型的最佳參數配置
在下面的流程圖中,黃色框表示數據和模型的準備階段,灰色框和綠色框表示過程中的每個選擇,其中綠色表示“推薦選擇”。你可以把這張圖作為構建第一個實驗模型的起點,因為它能以較低的計算成本提供較良好的性能。之后如果有需要,你可以再在這基礎上繼續改進迭代。
文本分類流程圖
這個流程圖回答了兩個關鍵問題:
我們應該使用哪種學習算法或模型?
我們應該如何準備數據以有效地學習文本和標簽之間的關系?
其中,第二個問題取決于第一個問題的答案,我們預處理數據的方式取決于選擇的具體模型。文本分類模型大致可分為兩類:使用單詞排序信息的序列模型和把文本視為一組單詞的n-gram模型。其中序列模型的類型包括卷積神經網絡(CNN)、遞歸神經網絡(RNN)及其變體。n-gram模型的類型包括邏輯回歸、MLP、DBDT和SVM。
對于電影評論數據集,樣本數/單個樣本平均單詞數約為144,所以我們會構建一個MLP模型。
-
文本分類
+關注
關注
0文章
18瀏覽量
7330 -
分類器
+關注
關注
0文章
152瀏覽量
13201 -
機器學習
+關注
關注
66文章
8425瀏覽量
132771
原文標題:ML通用指南:文本分類詳細教程(上)
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論