文本分類綜述,機器學習/深度學習方法總結
11 人贊了文章
實習過程中mentor讓調研文本分類相關的知識,所以在此做一個總結。
介紹
定義
- 在給定的分類體系中,將文本分到指定的某個或某幾個類別當中
- 分類對象:短文本(句子/標題/商品評論)、長文本(文章)
- 分類體系一般由人工構造
- 政治、體育、軍事
- 正能量、負能量
- 好評、中性、差評
- 分類模式
- binary:2類問題,屬於或不屬於
- multi-class:多類問題
- multi-label:多標籤問題,一個文本可以屬於多類
應用
- 垃圾郵件的判定
- 是垃圾郵件、不是垃圾郵件
- 根據標題為圖文視頻打標籤
- 政治、體育、娛樂、暴力、涉黃……
- 根據用戶閱讀內容建立畫像標籤
- 娛樂、教育、醫療……
方法
- 人工方法
- 基於規則的特徵匹配,容易理解(足球、聯賽->體育)
- 依賴專家系統,不同人物需要專門構建特徵規則。費時費力
- 準確率不高
- 機器學習方法
- 特徵工程+演算法(Naive Bayes/SVM/LR/KNN……)
- 深度學習方法
- 詞向量+模型(FastText/TextCNN/TextRNN/TextRCNN)
傳統方法
分類流程
文本預處理
英文
- 數據中非英文部分
- html、json等格式,提取出文本數據
- 文本泛化:數字、表情符號、網址……
- 拼寫檢查更正
- 詞幹提取(steming)、詞形還原(lemmatization)
- has/had/having->have am/is/are->is isnt->is not
- 大寫轉小寫
- 去停用詞
- a, to, the, according, any...
中文
- 數據中非中文部分
- html、json等格式,提取出文本數據
- 文本泛化:數字、英文、網址……
- 中文編碼問題
- 中文分詞
- 結巴分詞、nltk、SnowNLP……
- 去停用詞
- 啊、哎、哎喲、但是、不如……
- 詞語替換
- 俺->我,俺們->我們,裝13->裝逼
- 禾斗匕匕->科比,孬->不好,灰機->飛機
- CEO->首席執行官,Tencent->騰訊
文本表示
將文本轉換成計算機可理解的方式。一篇文檔表示成向量,整個語料庫表示成矩陣
- 詞袋模型(Bag of Words,unigram)
- 忽略其詞序和語法,句法,將文本僅僅看做是一個詞集合。若詞集合共有NN個詞,每個文本表示為一個NN維向量,元素為0/1,表示該文本是否包含對應的詞。( 0, 0, 0, 0, .... , 1, ... 0, 0, 0, 0)
- 一般來說詞庫量至少都是百萬級別,因此詞袋模型有個兩個最大的問題:高緯度、高稀疏性
- n-grams 詞袋模型(Bag of n-grams)
- 與詞袋模型類似,考慮了局部的順序信息,但是向量的維度過大,基本不採用。如果詞集合大小為NN,則bi-gram的單詞總數為N^2N2 向量空間模型
- 向量空間模型(Vector Space Model)
- 以詞袋模型為基礎,向量空間模型通過特徵選擇降低維度,通過特徵權重計算增加稠密性。
特徵權重計算
- 布爾權重如果出現則為1,沒出現則為0。就是詞袋模型。
- TFIDF型權重(Boolean weighting)
TF:詞頻率
TF*IDF: 詞頻率乘以逆文本頻率
TFC: TF*IDF的歸一化,使得同一文本中的詞語可以相互比較
- 基於熵概念的權重(Entropy weighting)idf的作用是懲罰在語料中出現較多的詞語。但是如果某一特徵(詞語)在同類文檔中大量出現時,應該賦予較高的權重。
特徵選擇
特徵選擇是根據某個評價指標獨立的對原始特徵項(詞項)進行評分排序,從中選擇得分最高的一些特徵項,過濾掉其餘的特徵項,從而達到降維的目的
- 基於DF
- DF小於某個閾值的去掉(太少,沒有代表性)
- DF大於某個閾值的去掉(太多,沒有區分度)
- 基於熵 該值越大,說明分布越均勻,越有可能出現在較多的類別中(區分度差);該值越小,說明分布越傾斜,詞可能出現在較少的類別中(區分度好)
- 信息增益 體現詞項為整個分類所能提供的信息量(不考慮該詞項的熵和考慮該詞項後的熵的差值)
- 統計量 統計詞項和類別之間的獨立性。 越大,兩者獨立性越小,相關性越大
分類器
將文本用向量表示之後,可適用於大部分機器學習方法- 樸素貝葉斯
- KNN方法
- 決策樹
- 支持向量機
- GBDT/XGBOOST
深度學習方法
利用詞向量表示文本,將沒歌詞表達為nn維稠密,連續的實數向量。
- fastText 論文:Bag of Tricks for Efficient Text Classification
原理是把句子中所有的詞進行lookup得到詞向量之後,對向量進行平均(某種意義上可以理解為只有一個avg pooling特殊CNN),然後直接接 softmax 層預測label。在label比較多的時候,為了降低計算量,論文最後一層採用了層次softmax的方法,既根據label的頻次建立哈夫曼樹,每個label對應一個哈夫曼編碼,每個哈夫曼樹節點具有一個向量作為參數進行更新,預測的時候隱層輸出與每個哈夫曼樹節點向量做點乘,根據結果決定向左右哪個方向移動,最終落到某個label對應的節點上。
特點就是快,在效果和其他方法差不多的情況下,訓練速度比其他方法快一個量級。- TextCNN
論文:Convolutional Neural Networks for Sentence Classification
詳細原理如下:
首先,對句子做padding或者截斷,保證句子長度為固定值 ,單詞embedding成 維度的向量,這樣句子被表示為(s,d)(s,d)大小的矩陣(類比圖像中的像素)。然後經過有 filter_size=(2,3,4) 的一維卷積層,每個filter_size 有兩個輸出 channel。第三層是一個1-max pooling層,這樣不同長度句子經過pooling層之後都能變成定長的表示了,最後接一層全連接的 softmax 層,輸出每個類別的概率。
重點1:卷積是一維卷積,只在ss方向上做卷積,不在dd方向上做卷積,既卷積核的寬度大小為dd。因為文本和圖像不同,文本的局部特徵只存在於上下文單詞之間,既所謂的n-gram。卷積核大小設置為(2,3,4)就是為了分別尋找2-gram,3-gram,4-gram特徵。重點2:這裡的特徵就是詞向量,有靜態(static)和非靜態(non-static)方式。static方式採用比如word2vec預訓練的詞向量,訓練過程不更新詞向量,實質上屬於遷移學習了,特別是數據量比較小的情況下,採用靜態的詞向量往往效果不錯。non-static則是在訓練過程中更新詞向量。推薦的方式是 non-static 中的 fine-tunning方式,它是以預訓練(pre-train)的word2vec向量初始化詞向量,訓練過程中調整詞向量,能加速收斂,當然如果有充足的訓練數據和資源,直接隨機初始化詞向量效果也是可以的。- TextRNN 論文:Recurrent Neural Network for Text Classification with Multi-Task Learning 利用CNN進行文本分類,說到底還是利用卷積核尋找n-gram特徵。卷積核的大小是超參。而RNN基本是處理文本信息的標配了,因為RNN先天就是為處理時間序列而設計的,它通過前後時刻的輸出鏈接保證了「記憶」的留存。但RNN循環機制過於簡單,前後時刻的鏈接採用了最簡單的f=activate(ws+b)f=activate(ws+b)的形式,這樣在梯度反向傳播時出現了時間上的連乘操作,從而導致了梯度消失和梯度爆炸的問題。RNN的 變種LSTM/GRU在一定程度上減緩了梯度消失和梯度爆炸問題,因此現在使用的其實要比RNN更多。利用RNN做文本分類也比較好理解。對於英文,都是基於詞的。對於中文,首先要確定是基於字的還是基於詞的。如果是基於詞,要先對句子進行分詞。之後,每個字/詞對應RNN的一個時刻,隱層輸出作為下一時刻的輸入。最後時刻的隱層輸出h_ThT?catch住整個句子的抽象特徵,再接一個softmax進行分類。
- TextRNN + Attention
RNN雖然號稱能保持長久「記憶」,但其實還是無法「記住」太長久的東西。越靠後的字詞對最終輸出的影響越大,但是這和人類閱讀文本的習慣是不一樣的。一句話中對文本意義影響最大一必定是句子中間的某幾個重點辭彙。Attention的提出就是為了應對這個問題。詳細介紹Attention恐怕需要一小篇文章的篇幅,感興趣的可 參考14年這篇paper NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE。具體原理不作介紹,大家可以看論文呀~
Attention運用到文本分類當中,參考論文Hierarchical Attention Networks for Document Classification。論文為了對doc進行分類,將doc從兩個層次進行特徵提取,首先在word層面提取sentence特徵,然後從sentence層面提取doc特徵,並且每個層次都運用了Attention。在此我類比到句子分類中,講一下Attention是怎麼運用的。假設RNN每個時刻的輸出為 ,在上文TextRNN中我們已經提到,最後時刻的輸出會用作softmax的輸入,既 。Attention層其實就是普通的一層,它接收 ?,得到一個相應score,並經過歸一化之後代表當前詞的重要性,既 , 。Attention向量是每個時刻輸出的加權平均,既 。最終輸出為 。
- TextRCNN 參考的是中科院15年發表在AAAI上的這篇文章 Recurrent Convolutional Neural Networks for Text Classification
利用前向和後向RNN得到每個詞的前向和後向上下文的表示:
這樣詞的表示就變成詞向量和前向後向上下文向量concat起來的形式了,即: 最後再接跟TextCNN相同卷積層,pooling層即可,唯一不同的是卷積層 filter_size = 1就可以了,不再需要更大 filter_size 獲得更大視野,這裡詞的表示也可以只用雙向RNN輸出。
- VDCNN 論文:Very Deep Convolutional Networks for Text Classification 上述提到的文本分類模型都是淺層模型,目前NLP領域的模型,無論是機器翻譯、文本分類、序列標註等問題大都使用淺層模型。這篇論文探究的是深層模型在文本分類任務中的有效性,文中最優性能網路達到了29層。具體請見此處。
推薦閱讀:
※Question Answer Matching
※本周最新AI論文良心推薦,你想pick誰?
※深度學習中的注意力模型(2017版)
※IBM宣布語音識別錯誤率接近人類水平
※四種計算文本相似度的方法對比
TAG:深度學習DeepLearning | 自然語言處理 | 文本分類 |