文本分類綜述,機器學習/深度學習方法總結

文本分類綜述,機器學習/深度學習方法總結

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->騰訊

文本表示

將文本轉換成計算機可理解的方式。一篇文檔表示成向量,整個語料庫表示成矩陣

 egin{pmatrix} a_{11} & a_{21} & cdots & a_{V1} \ a_{12} & a_{22} & cdots & a_{V2} \ vdots & vdots & ddots & vdots \ a_{1N} & a_{2N} & cdots & a_{VN} \ end{pmatrix}

  • 詞袋模型(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。就是詞袋模型。

a_{ij}=egin{cases}1,&TF_{ij}>0\2,&TF_{ij}=0end{cases}

  • TFIDF型權重(Boolean weighting)

TF:詞頻率

a_{ij}=TF_{ij}

TF*IDF: 詞頻率乘以逆文本頻率

a_{ij}=TF_{ij}*log(frac{N}{DF_i+1})

TFC: TF*IDF的歸一化,使得同一文本中的詞語可以相互比較

a_{ij}=frac{TF_{ij}*log(frac{N}{DF_i+1})}{sqrt{sum_k[TF_{kj}*log(frac{N}{DF_k+1})]^2}}

  • 基於熵概念的權重(Entropy weighting)

    idf的作用是懲罰在語料中出現較多的詞語。但是如果某一特徵(詞語)在同類文檔中大量出現時,應該賦予較高的權重。 a_{ij}=log(TF_{ij}+1)*(E_i)=log(TF_{ij}+1)*(1+frac{1}{logN}[frac{TF_{ij}}{DF_i}log(frac{TF_{ij}}{DF_i})])

特徵選擇

特徵選擇是根據某個評價指標獨立的對原始特徵項(詞項)進行評分排序,從中選擇得分最高的一些特徵項,過濾掉其餘的特徵項,從而達到降維的目的

  • 基於DF
    • DF小於某個閾值的去掉(太少,沒有代表性)
    • DF大於某個閾值的去掉(太多,沒有區分度)
  • 基於熵 該值越大,說明分布越均勻,越有可能出現在較多的類別中(區分度差);該值越小,說明分布越傾斜,詞可能出現在較少的類別中(區分度好)

    Entropy(t)=-sum_{i=1}^MP(c_i)logP(c_i)
  • 信息增益

    體現詞項為整個分類所能提供的信息量(不考慮該詞項的熵考慮該詞項後的熵的差值)

    Gain(t) =Entropy(S)-Entropy(S_t) \ ={-sum_{i=1}^MP(c_i)logP(c_i)}-[P(t){-sum_{i=1}^MP(c_i|t)logP(c_i|t)}+P(overline t){-sum_{i=1}^MP(c_i|t)logP(c_i|overline t)}]
  • chi^2 統計量

    統計詞項和類別之間的獨立性。 chi^2 越大,兩者獨立性越小,相關性越大

 chi^2(t,c_i)=frac{N(AD-CB)^2}{(A+C)(B+D)(A+B)(C+D)}

chi_{AVG}^2(t)=sum_{i=1}^MP(c_i)chi^2(t,c_i)

chi_{MAX}^2(t)=max_{i=1}^M{chi^2(t,c_i)}

分類器

將文本用向量表示之後,可適用於大部分機器學習方法

  • 樸素貝葉斯
  • 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或者截斷,保證句子長度為固定值 s=7 ,單詞embedding成 d=5 維度的向量,這樣句子被表示為(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每個時刻的輸出為 [h_1, h_2,...,h_T] ,在上文TextRNN中我們已經提到,最後時刻的輸出會用作softmax的輸入,既 h=f(wH_T+b) 。Attention層其實就是普通的一層,它接收 h_t ?,得到一個相應score,並經過歸一化之後代表當前詞的重要性,既 u_t=f(w_{attetion}h_t+b_{attention}) , alpha_t = frac{exp(u_t)}{sum_{k=1}^Texp(u_k)} 。Attention向量是每個時刻輸出的加權平均,既 c=sum_talpha_th_t 。最終輸出為 logit = softmax(f(w[h;c] + b))

  • TextRCNN

    參考的是中科院15年發表在AAAI上的這篇文章 Recurrent Convolutional Neural Networks for Text Classification

利用前向和後向RNN得到每個詞的前向和後向上下文的表示:

c_l(w_i)=f(W^{(l)}c_l(w_{i-1})+W^{(sl)}e(w_{i-1}))

c_r(w_i)=f(W^{(r)}c_l(w_{i+1})+W^{(sr)}e(w_{i+1}))

這樣詞的表示就變成詞向量和前向後向上下文向量concat起來的形式了,即:

x_i=[c_l(w_i);e(w_i);c_r(w_i)]

最後再接跟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 | 自然語言處理 | 文本分類 |