實戰:https://github.com/jiangxinyang227/NLP-Project
一、簡介:
1、傳統的文本分類方法:【人工特征工程+淺層分類模型】
(1)文本預處理:
①(中文)
文本分詞
-
- 正向/逆向/雙向最大匹配;
- 基於理解的句法和語義分析消歧;
- 基於統計的互信息/CRF方法;
- WordEmbedding + Bi-LSTM+CRF方法
去停用詞:維護一個停用詞表
(2)特征提取
特征選擇的基本思路是根據某個評價指標獨立的對原始特征項(詞項)進行評分排序,從中選擇得分最高的一些特征項,過濾掉其余的特征項。常用的評價有文檔頻率、互信息、信息增益、χ²統計量等。
特征權重主要是經典的TF-IDF方法及其擴展方法,主要思路是一個詞的重要度與在類別內的詞頻成正比,與所有類別出現的次數成反比。
當選用數學方法進行特征提取時,決定文本特征提取效果的最主要因素是評估函數的質量。常見的評估函數主要有如下方法:
2.1 TF-IDF
TF:詞頻,計算該詞描述文檔內容的能力 IDF:逆向文檔頻率,用於計算該詞區分文檔的的能力
-
- 思想:一個詞的重要程度與在類別內的詞頻成正比,與所有類別出現的次數成反比。
- 評價:a.TF-IDF的精度並不是特別高。b.TF-IDF並沒有體現出單詞的位置信息。
2.2 詞頻(TF)
詞頻是一個詞在文檔中出現的次數。通過詞頻進行特征選擇就是將詞頻小於某一閾值的詞刪除。
-
- 思想:出現頻次低的詞對過濾的影響也比較小。
- 評價:有時頻次低的詞匯含有更多有效的信息,因此不宜大幅刪減詞匯。
2.3 文檔頻次法(DF)
它指的是在整個數據集中,有多少個文本包含這個單詞。
-
- 思想:計算每個特征的文檔頻次,並根據閾值去除文檔頻次特別低(沒有代表性)和特別高的特征(沒有區分度)
- 評價:簡單、計算量小、速度快、時間復雜度和文本數量成線性關系,非常適合超大規模文本數據集的特征選擇。
2.4 互信息方法(Mutual information)
互信息用於衡量某個詞與類別之間的統計獨立關系,在過濾問題中用於度量特征對於主題的區分度。
-
- 思想:在某個特定類別出現頻率高,在其他類別出現頻率低的詞匯與該類的互信息較大。
- 評價:優點-不需要對特征詞和類別之間關系的性質做任何假設。缺點-得分非常容易受詞邊緣概率的影響。實驗結果表明互信息分類效果通常比較差。
2.5 期望交叉熵
交叉熵反映了文本類別的概率分布和在出現了某個特定詞的條件下文本類別的概率分布之間的距離 思想:特征詞t 的交叉熵越大, 對文本類別分布的影響也越大。 評價:熵的特征選擇不考慮單詞未發生的情況,效果要優於信息增益。
2.6 信息增益
信息增益是信息論中的一個重要概念, 它表示了某一個特征項的存在與否對類別預測的影響。
-
- 思想:某個特征項的信息增益值越大, 貢獻越大, 對分類也越重要。
- 評價:信息增益表現出的分類性能偏低,因為信息增益考慮了文本特征未發生的情況。 2.4.7 卡方校驗
它指的是在整個數據集中,有多少個文本包含這個單詞。
-
- 思想:在指定類別文本中出現頻率高的詞條與在其他類別文本中出現頻率比較高的詞條,對判定文檔是否屬於該類別都是很有幫助的.
- 評價:卡方校驗特征選擇算法的准確率、分類效果受訓練集影響較小,結果穩定。對存在類別交叉現象的文本進行分類時,性能優於其他類別的分類方法。
2.7 其他評估函數
-
- 二次信息熵(QEMI)
- 文本證據權(The weight of Evidence for Text)
- 優勢率(Odds Ratio)
- 遺傳算法(Genetic Algorithm)
- 主成分分析(PCA)
- 模擬退火算法(Simulating Anneal)
- N-Gram算法
2.9 傳統特征提取方法總結
傳統的特征選擇方法大多采用以上特征評估函數進行特征權重的計算。
但由於這些評估函數都是基於統計學原理的,因此一個缺點就是需要一個龐大的訓練集,才能獲得對分類起關鍵作用的特征,這需要消耗大量的人力和物力。
另外基於評估函數的特征提取方法建立在特征獨立的假設基礎上,但在實際中這個假設很難成立。
2.10 通過映射和變化來進行特征提取
特征選擇也可以通過用映射或變換的方法把原始特征變換為較少的新特征 傳統的特征提取降維方法,會損失部分文檔信息,以DF為例,它會剔除低頻詞匯,而很多情況下這部分詞匯可能包含較多信息,對於分類的重要性比較大。 如何解決傳統特征提取方法的缺點:找到頻率低詞匯的相似高頻詞,例如:在介紹月亮的古詩中,玉兔和嬋娟是低頻詞,我們可以用高頻詞月亮來代替,這無疑會提升分類系統對文本的理解深度。詞向量能夠有效的表示詞語之間的相似度。
(3)文本表示
文本表示的目的是把文本預處理后的轉換成計算機可理解的方式,是決定文本分類質量最重要的部分。傳統做法常用詞袋模型(BOW, Bag Of Words)或向量空間模型(Vector Space Model),最大的不足是忽略文本上下文關系,每個詞之間彼此獨立,並且無法表征語義信息。詞袋模型的示例如下:
( 0, 0, 0, 0, .... , 1, ... 0, 0, 0, 0)
一般來說詞庫量至少都是百萬級別,因此詞袋模型有個兩個最大的問題:高緯度、高稀疏性。詞袋模型是向量空間模型的基礎,因此向量空間模型通過特征項選擇降低維度,通過特征權重計算增加稠密性。
基於語義的文本表示:傳統做法在文本表示方面除了向量空間模型,還有基於語義的文本表示方法,比如LDA主題模型、LSI/PLSI概率潛在語義索引等方法,一般認為這些方法得到的文本表示可以認為文檔的深層表示,而word embedding文本分布式表示方法則是深度學習方法的重要基礎,下文會展現。
(4)分類器:
貝葉斯、KNN、SVM、最大熵
2、基於深度學習的文本分類方法:
文本分類應用場景:情感分類、檢測垃圾郵件、用戶query的自動標簽(query意圖識別)、文章分類話題
文本數據准備:X為文本,Y為0,1標簽。
文本預處理:(英文)詞干提取、詞性還原、大小寫轉換、詞向量化,(中文)分詞、去停用詞、詞性標注、詞向量化
特征處理:https://www.jiqizhixin.com/articles/2018-10-29-10
文本向量化:TF-IDF、BOW、One-hot、分布式表示方式(word2vec、glove)等。
文本分類模型:(傳統)貝葉斯、SVM、隨機森林、KNN等,(深度學習)textCNN、FastText、RNN、LSTM、HAN、TextRNN(Bi-directional RNN)、TextRNN + Attention、TextRCNN(TextRNN + CNN)
業務例子:
問題描述:淘寶商品的一個典型的例子見下圖,圖中商品的標題是“夏裝雪紡條紋短袖t恤女春半袖衣服夏天中長款大碼胖mm顯瘦上衣夏”。淘寶網后台是通過樹形的多層的類目體系管理商品的,覆蓋葉子類目數量達上萬個,商品量也是10億量級,我們是任務是根據商品標題預測其所在葉子類目,示例中商品歸屬的類目為“女裝/女士精品>>蕾絲衫/雪紡衫”。很顯然,這是一個非常典型的短文本多分類問題。接下來分別會介紹下文本分類傳統和深度學習的做法,最后簡單梳理下實踐的經驗。
二、fasttext模型
原理是把句子中所有的詞向量進行平均(某種意義上可以理解為只有一個avg pooling特殊CNN),然后直接接 softmax 層。其實文章也加入了一些 n-gram 特征的 trick 來捕獲局部序列信息。文章倒沒太多信息量,算是“水文”吧,帶來的思考是文本分類問題是有一些“線性”問題的部分[from項亮],也就是說不必做過多的非線性轉換、特征組合即可捕獲很多分類信息,因此有些任務即便簡單的模型便可以搞定了。
實戰:https://blog.csdn.net/Kaiyuan_sjtu/article/details/84404290
三、textCNN模型:
本篇文章的題圖選用的就是14年這篇文章提出的TextCNN的結構(見下圖)。fastText 中的網絡結果是完全沒有考慮詞序信息的,而它用的 n-gram 特征 trick 恰恰說明了局部序列信息的重要意義。卷積神經網絡(CNN Convolutional Neural Network)最初在圖像領域取得了巨大成功,CNN原理就不講了,核心點在於可以捕捉局部相關性,具體到文本分類任務中可以利用CNN來提取句子中類似 n-gram 的關鍵信息。
TextCNN的詳細過程原理圖見下:
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能夠很好捕捉這類信息。
四、TextCNN + Attention(Attention-based Convolutional Neural Networks for Sentence Classification)
https://blog.csdn.net/tcx1992/article/details/83344272
https://zhuanlan.zhihu.com/p/24890809
https://blog.csdn.net/liuchonge/article/details/69587681
Attention Pooling-based Convolutional Neural Network for Sentence Modeling
BasicCNN難以捕獲長期的上下文信息和非連續詞之間的相關性。這種弱點在dependency-based CNN中得以部分克服,但在實際使用中它總是需要額外的資源來獲得良好的依賴樹,例如口語處理。 一種新的基於注意力機制的CNN可以用來緩解這個問題。
圖1展示了ATT-CNN模型的架構。 如圖1所示,在輸入層和卷積層之間引入了attention層。 具體地,attention層是為每個單詞創建上下文向量。 上下文向量與單詞向量拼接,作為單詞新的表示,將其輸入到卷積層。 直觀來看,一對彼此遠離的詞往往聯系較少。 因此,可以考慮將距離衰減添加到注意機制中。
attention機制的思想是在導出xxi的上下文向量gigi時學習將注意力集中在特定的重要單詞上。 圖1中的紅色矩形表示gigi。注意機制是另外的MLP,與ATT-CNN的所有其他組件共同訓練。 當預測句子類別時,該機制確定哪些單詞應該比句子上的其他單詞更受關注。 打分后的單詞以加權和組合:
gi=∑j
四、TextRNN(Bi-direction RNN,雙向LSTM)
盡管TextCNN能夠在很多任務里面能有不錯的表現,但CNN有個最大問題是固定 filter_size 的視野,一方面無法建模更長的序列信息,另一方面 filter_size 的超參調節也很繁瑣。CNN本質是做文本的特征表達工作,而自然語言處理中更常用的是遞歸神經網絡(RNN, Recurrent Neural Network),能夠更好的表達上下文信息。具體在文本分類任務中,Bi-directional RNN(實際使用的是雙向LSTM)從某種意義上可以理解為可以捕獲變長且雙向的的 "n-gram" 信息。
RNN算是在自然語言處理領域非常一個標配網絡了,在序列標注/命名體識別/seq2seq模型等很多場景都有應用,Recurrent Neural Network for Text Classification with Multi-Task Learning文中介紹了RNN用於分類問題的設計,下圖LSTM用於網絡結構原理示意圖,示例中的是利用最后一個詞的結果直接接全連接層softmax輸出了
五、TextRNN + Attention
CNN和RNN用在文本分類任務中盡管效果顯著,但都有一個不足的地方就是不夠直觀,可解釋性不好,特別是在分析badcase時候感受尤其深刻。而注意力(Attention)機制是自然語言處理領域一個常用的建模長時間記憶機制,能夠很直觀的給出每個詞對結果的貢獻,基本成了Seq2Seq模型的標配了。實際上文本分類從某種意義上也可以理解為一種特殊的Seq2Seq,所以考慮把Attention機制引入近來,研究了下學術界果然有類似做法。
Attention機制介紹:
詳細介紹Attention恐怕需要一小篇文章的篇幅,感興趣的可參考14年這篇paper NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE。
詳細介紹Attention恐怕需要一小篇文章的篇幅,感興趣的可參考14年這篇paper NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE。
以機器翻譯為例簡單介紹下,下圖中 是源語言的一個詞,
是目標語言的一個詞,機器翻譯的任務就是給定源序列得到目標序列。翻譯
的過程產生取決於上一個詞
和源語言的詞的表示
(
的 bi-RNN 模型的表示),而每個詞所占的權重是不一樣的。比如源語言是中文 “我 / 是 / 中國人” 目標語言 “i / am / Chinese”,翻譯出“Chinese”時候顯然取決於“中國人”,而與“我 / 是”基本無關。下圖公式,
則是翻譯英文第
個詞時,中文第
個詞的貢獻,也就是注意力。顯然在翻譯“Chinese”時,“中國人”的注意力值非常大。
Attention的核心point是在翻譯每個目標詞(或 預測商品標題文本所屬類別)所用的上下文是不同的,這樣的考慮顯然是更合理的。
TextRNN + Attention 模型:
我們參考了這篇文章 Hierarchical Attention Networks for Document Classification,下圖是模型的網絡結構圖,它一方面用層次化的結構保留了文檔的結構,另一方面在word-level和sentence-level。淘寶標題場景只需要 word-level 這一層的 Attention 即可。
加入Attention之后最大的好處自然是能夠直觀的解釋各個句子和詞對分類類別的重要性。
六、TextRCNN(TextRNN + CNN)
我們參考的是中科院15年發表在AAAI上的這篇文章 Recurrent Convolutional Neural Networks for Text Classification 的結構:
利用前向和后向RNN得到每個詞的前向和后向上下文的表示:
這樣詞的表示就變成詞向量和前向后向上下文向量concat起來的形式了,即:
最后再接跟TextCNN相同卷積層,pooling層即可,唯一不同的是卷積層 filter_size = 1就可以了,不再需要更大 filter_size 獲得更大視野,這里詞的表示也可以只用雙向RNN輸出。
七、HAN(Hierarchy Attention Network)
相較於TextCNN,HAN最大的進步在於完全保留了文章的結構信息,並且特別難能可貴的是,基於attention結構有很強的解釋性。
他的結構如下圖所示:
輸入詞向量序列后,通過詞級別的Bi-GRU后,每個詞都會有一個對應的Bi-GRU輸出的隱向量h,再通過uw向量與每個時間步的h向量點積得到attention權重,然后把h序列做一個根據attention權重的加權和,得到句子summary向量s2,每個句子再通過同樣的Bi-GRU結構再加attention得到最終輸出的文檔特征向量v向量,然后v向量通過后級dense層再加分類器得到最終的文本分類結果。模型結構非常符合人的從詞->句子->再到篇章的理解過程。
最重要的是該模型在提供了更好的分類精度的情況下,可視化效果非常好。同時在調參過程中,我們發現attention部分對於模型的表達能力影響非常大,整個模型在所有位置調整L2-Loss對模型表達能力帶來的影響遠不如在兩處attention的地方大,這同時也能解釋為什么可視化效果比較好,因為attention對於模型的輸出貢獻很大,而attention又恰恰是可以可視化的。
下面我們來看一下他在法律領域罪名預測任務上的可視化效果。下面的可視化的結果並不是找了極少數效果好的,而是大部分情況下模型的可視化能夠解釋他的輸出。需要注意的是,此處為了讓不太重要句子中相對重要的詞並不完全不可見,詞的亮度=sqrt(句子權重)*詞權重。
在非常長的文本中,HAN覺得中間那些完全是廢話,不如那句“公訴機關認為”有用,就放棄了。

圖5 HAN attention可視化1
如下圖所示,模型雖然在文本第二行中看到了竊取的字樣,但是他認為這個案件中主要的事件是搶劫,這就是保留文本結構的好處。

圖6 HAN attention可視化2
可以看到並不是所有的深度學習模型都是不可以理解的,這種可解釋性也會給實際應用帶來很多幫助。
八、 DPCNN
上面的幾個模型,論神經網絡的層數,都不深,大致就只有2~3層左右。大家都知道何凱明大神的ResNet是CV中的里程碑,15年參加ImageNet的時候top-5誤差率相較於上一年的冠軍GoogleNet直接降低了將近一半,證明了網絡的深度是非常重要的。

圖7 ImageNet歷年冠軍
那么問題來了,在文本分類領域網絡深度提升會帶來分類精度的大幅提升嗎?我們在一些比較復雜的任務中,以及數據量比較大(百萬級)的情況下有提升,但不是ResNet那種決定性的提升。
DPCNN的主要結構如下圖所示:

圖8 DPCNN結構
從詞向量開始(本文的重點在於模型的大結構,因此不去詳解文中的region embedding部分,直接將整個部分認為是一種詞向量的輸出。)先做了兩次寬度為3,filter數量為250個的卷積,然后開始做兩兩相鄰的max-pooling,假設輸入句子長度padding到1024個詞,那么在頭兩個卷積完成以后句子長度仍然為1024。在block 1的pooling位置,max pooling的width=3,stride=2,也即序列中相鄰的3個時間步中每一維feature map取這三個位置中最大的一個留下,也即位置0,1,2中取一個最大值,然后,移動2個時間步,在2,3,4時間步中取一次max,那么pooling輸出的序列長度就是511。
后面以此類推,序列長度是呈指數級下降的,這也是文章名字Deep Pyramid的由來。然后通過兩個卷積的非線性變換,提取更深層次的特征,再在輸出的地方疊加上未經過兩次卷積的quick connection通路(ResNet中使得深層網絡更容易訓練的關鍵)。因為每個block中的max pooling只是相鄰的兩個位置做max-pooling,所以每次丟失的結構信息很少,后面的卷積層又能提取更加抽象的特征出來。所以最終模型可以在不丟失太多結構信息的情況下,同時又做了比較深層的非線性變換。
我們實際測試中在非線性度要求比較高的分類任務中DPCNN會比HAN精度高,並且由於他是基於CNN的,訓練速度比基於GRU的HAN也要快很多。
參考:
https://python.ctolib.com/km1994-sentiment_analysis_keras.html
https://cloud.tencent.com/developer/article/1335257
https://blog.csdn.net/u014248127/article/details/80774668
http://www.yidianzixun.com/article/0KNcfHXG
https://www.cnblogs.com/skykill/p/6785882.html
https://www.jianshu.com/p/7f35a4b33f45
https://cloud.tencent.com/developer/article/1005817
一文讀懂深度學習:https://www.infoq.cn/article/swMEuzh-c96KgUdEGXgN
文本分類概述:https://blog.csdn.net/u014248127/article/details/80774668
實戰:http://www.yidianzixun.com/article/0KNcfHXG
https://cloud.tencent.com/developer/article/1335257
CNN實戰中文二分類:https://github.com/x-hacker/CNN_ChineseTextBinaryClassify/tree/master/CNN_%E4%B8%AD%E6%96%87%E4%BA%8C%E5%88%86%E7%B1%BB
https://github.com/Edward1Chou/Textclassification
文本分類的一些trip:https://www.zhihu.com/question/265357659 http://wulc.me/2019/02/06/%E6%96%87%E6%9C%AC%E5%88%86%E7%B1%BB%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E7%BB%8F%E9%AA%8C%E5%92%8C%20tricks/