深度學習解決大規模文本分類問題 - 綜述和實踐

from  https://zhuanlan.zhihu.com/p/25928551


(1)文本預處理

文本分詞

去停用詞


(2)文本表示和特徵提取

文本表示:    

文本表示的目的是把文本預處理後的轉換成計算機可理解的方式,是決定文本分類質量最重要的部分。傳統做法常用詞袋模型(BOW, Bag Of Words)或向量空間模型(Vector Space Model),最大的不足是忽略文本上下文關係,每個詞之間彼此獨立,並且無法表徵語義信息。詞袋模型的示例如下:

               ( 0, 0, 0, 0, .... , 1, ... 0, 0, 0, 0)

一般來說詞庫量至少都是百萬級別,因此詞袋模型有個兩個最大的問題:高緯度、高稀疏性。詞袋模型是向量空間模型的基礎,因此向量空間模型通過特徵項選擇降低維度,通過特徵權重計算增加稠密性。

特徵提取:

向量空間模型的文本表示方法的特徵提取對應特徵項的選擇和特徵權重計算兩部分。特徵選擇的基本思路是根據某個評價指標獨立的對原始特徵項(詞項)進行評分排序,從中選擇得分最高的一些特徵項,過濾掉其餘的特徵項。常用的評價有文檔頻率、互信息、信息增益、χ²統計量等。

特徵權重計算——TF-IDF方法。主要思路是一個詞的重要度與在類別內的詞頻成正比,與所有類別出現的次數成反比。

二、深度學習文本分類方法


2.1文本的分佈式表示:詞向量(word embedding)

文本的表示通過詞向量的表示方式,把文本數據從高緯度高稀疏的神經網絡難處理的方式,變成了類似圖像、語音的的連續稠密數據。深度學習算法本身有很強的數據遷移性,很多之前在圖像領域很適用的深度學習算法比如CNN等也可以很好的遷移到文本領域了。

2.2 深度學習文本分類模型

1)fastText

preview

原理是把句子中所有的詞向量進行平均(某種意義上可以理解爲只有一個avg pooling特殊CNN),然後直接接 softmax 層。其實文章也加入了一些 n-gram 特徵的 trick 來捕獲局部序列信息。文章倒沒太多信息量,算是“水文”吧,帶來的思考是文本分類問題是有一些“線性”問題的部分[from項亮],也就是說不必做過多的非線性轉換、特徵組合即可捕獲很多分類信息,因此有些任務即便簡單的模型便可以搞定了。


2)TextCNN

本篇文章的題圖選用的就是14年這篇文章提出的TextCNN的結構(見下圖)。fastText 中的網絡結果是完全沒有考慮詞序信息的,而它用的 n-gram 特徵 trick 恰恰說明了局部序列信息的重要意義。卷積神經網絡(CNN Convolutional Neural Network)最初在圖像領域取得了巨大成功,CNN原理就不講了,核心點在於可以捕捉局部相關性,具體到文本分類任務中可以利用CNN來提取句子中類似 n-gram 的關鍵信息。

preview

TextCNN的詳細過程原理圖見下:

preview

TextCNN詳細過程:第一層是圖中最左邊的7乘5的句子矩陣,每行是詞向量,維度=5,這個可以類比爲圖像中的原始像素點了。然後經過有 filter_size=(2,3,4) 的一維卷積層,每個filter_size 有兩個輸出 channel。第三層是一個1-max pooling層,這樣不同長度句子經過pooling層之後都能變成定長的表示了,最後接一層全連接的 softmax 層,輸出每個類別的概率。

特徵:這裏的特徵就是詞向量,有靜態(static)和非靜態(non-static)方式。static方式採用比如word2vec預訓練的詞向量,訓練過程不更新詞向量,實質上屬於遷移學習了,特別是數據量比較小的情況下,採用靜態的詞向量往往效果不錯。non-static則是在訓練過程中更新詞向量。推薦的方式是 non-static 中的 fine-tunning方式,它是以預訓練(pre-train)的word2vec向量初始化詞向量,訓練過程中調整詞向量,能加速收斂,當然如果有充足的訓練數據和資源,直接隨機初始化詞向量效果也是可以的。

通道(Channels):圖像中可以利用 (R, G, B) 作爲不同channel,而文本的輸入的channel通常是不同方式的embedding方式(比如 word2vec或Glove),實踐中也有利用靜態詞向量和fine-tunning詞向量作爲不同channel的做法。

一維卷積(conv-1d):圖像是二維數據,經過詞向量表達的文本爲一維數據,因此在TextCNN卷積用的是一維卷積。一維卷積帶來的問題是需要設計通過不同 filter_size 的 filter 獲取不同寬度的視野。

Pooling層:利用CNN解決文本分類問題的文章還是很多的,比如這篇 A Convolutional Neural Network for Modelling Sentences 最有意思的輸入是在 pooling 改成 (dynamic) k-max pooling ,pooling階段保留 k 個最大的信息,保留了全局的序列信息。比如在情感分析場景,舉個例子:

            “ 我覺得這個地方景色還不錯,但是人也實在太多了 ”

雖然前半部分體現情感是正向的,全局文本表達的是偏負面的情感,利用 k-max pooling能夠很好捕捉這類信息。

以機器翻譯爲例簡單介紹下,下圖中 x_{t} 是源語言的一個詞,y_{t} 是目標語言的一個詞,機器翻譯的任務就是給定源序列得到目標序列。翻譯 y_{t} 的過程產生取決於上一個詞 y_{t-1} 和源語言的詞的表示 h_{j}x_{j} 的 bi-RNN 模型的表示),而每個詞所佔的權重是不一樣的。比如源語言是中文 “我 / 是 / 中國人” 目標語言 “i / am / Chinese”,翻譯出“Chinese”時候顯然取決於“中國人”,而與“我 / 是”基本無關。下圖公式, \alpha _{ij} 則是翻譯英文第 i 個詞時,中文第 j 個詞的貢獻,也就是注意力。顯然在翻譯“Chinese”時,“中國人”的注意力值非常大。

Attention的核心point是在翻譯每個目標詞(或 預測商品標題文本所屬類別)所用的上下文是不同的,這樣的考慮顯然是更合理的。

加入Attention之後最大的好處自然是能夠直觀的解釋各個句子和詞對分類類別的重要性。

5)TextRCNN(TextRNN + CNN)

preview

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

preview

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

preview

最後再接跟TextCNN相同卷積層,pooling層即可,唯一不同的是卷積層 filter_size = 1就可以了,不再需要更大 filter_size 獲得更大視野,這裏詞的表示也可以只用雙向RNN輸出。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章