做者:塵心
連接:https://zhuanlan.zhihu.com/p/76003775
git
文本分類在文本處理中是很重要的一個模塊,它的應用也很是普遍,好比:垃圾過濾,新聞分類,詞性標註等等。它和其餘的分類沒有本質的區別,核心方法爲首先提取分類數據的特徵,而後選擇最優的匹配,從而分類。可是文本也有本身的特色,根據文本的特色,文本分類的通常流程爲:1.預處理;2.文本表示及特徵選擇;3.構造分類器;4.分類。github
一般來說,文本分類任務是指在給定的分類體系中,將文本指定分到某個或某幾個類別中。被分類的對象有短文本,例如句子、標題、商品評論等等,長文本,如文章等。分類體系通常人工劃分,例如:1)政治、體育、軍事 2)正能量、負能量 3)好評、中性、差評。所以,對應的分類模式能夠分爲:二分類與多分類問題。算法
文本分類的應用十分普遍,能夠將其應用在:網絡
文本分類問題算是天然語言處理領域中一個很是經典的問題了,相關研究最先能夠追溯專家規則(Pattern)進行分類,但顯然費時費力,覆蓋的範圍和準確率都很是有限。app
後來伴隨着統計學習方法的發展,特別是90年代後互聯網在線文本數量增加和機器學習學科的興起,逐漸造成了人工特徵工程+淺層分類建模流程。框架
傳統作法主要問題的文本表示是高緯度高稀疏的,特徵表達能力很弱,此外須要人工進行特徵工程,成本很高。而深度學習最初在圖像和語音取得巨大成功,也相應的推進了深度學習在NLP上的發展,使得深度學習的模型在文本分類上也取得了不錯的效果。dom
傳統的機器學習分類方法將整個文本分類問題就拆分紅了特徵工程和分類器兩部分。特徵工程分爲文本預處理、特徵提取、文本表示三個部分,最終目的是把文本轉換成計算機可理解的格式,並封裝足夠用於分類的信息,即很強的特徵表達能力。機器學習
3.1.1 文本預處理:函數
文本預處理過程是在文本中提取關鍵詞表示文本的過程,中文文本處理中主要包括文本分詞和去停用詞兩個階段。之因此進行分詞,是由於不少研究代表特徵粒度爲詞粒度遠好於字粒度,其實很好理解,由於大部分分類算法不考慮詞序信息。性能
中文分詞技術:
1)基於字符串匹配的分詞方法:
過程:這是一種基於詞典的中文分詞,核心是首先創建統一的詞典表,當須要對一個句子進行分詞時,首先將句子拆分紅多個部分,將每個部分與字典一一對應,若是該詞語在詞典中,分詞成功,不然繼續拆分匹配直到成功。
核心: 字典,切分規則和匹配順序是核心。
分析:優勢是速度快,時間複雜度能夠保持在O(n),實現簡單,效果尚可;但對歧義和未登陸詞處理效果不佳。
2)基於理解的分詞方法:
基於理解的分詞方法是經過讓計算機模擬人對句子的理解,達到識別詞的效果。其基本思想就是在分詞的同時進行句法、語義分析,利用句法信息和語義信息來處理歧義現象。它一般包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統能夠得到有關詞、句子等的句法和語義信息來對分詞歧義進行判斷,即它模擬了人對句子的理解過程。這種分詞方法須要使用大量的語言知識和信息。因爲漢語語言知識的籠統、複雜性,難以將各類語言信息組織成機器可直接讀取的形式,所以目前基於理解的分詞系統還處在試驗階段。
3)基於統計的分詞方法:
過程:統計學認爲分詞是一個機率最大化問題,即拆分句子,基於語料庫,統計相鄰的字組成的詞語出現的機率,相鄰的詞出現的次數多,就出現的機率大,按照機率值進行分詞,因此一個完整的語料庫很重要。
主要的統計模型有: N元文法模型(N-gram),隱馬爾可夫模型(Hidden Markov Model ,HMM),最大熵模型(ME),條件隨機場模型(Conditional Random Fields,CRF)等。
英文分詞技術:
英文分詞相比中文分詞要簡單得多,能夠根據空格和標點符號來分詞,而後對每個單詞進行詞幹還原和詞形還原,去掉停用詞和非英文內容
3.1.2 文本表示:
將文本轉換成計算機可理解的方式。一篇文檔表示成向量,整個語料庫表示成矩陣
詞袋法:
忽略其詞序和語法,句法,將文本僅僅看作是一個詞集合。若詞集合共有NN個詞,每一個文本表示爲一個NN維向量,元素爲0/1,表示該文本是否包含對應的詞。( 0, 0, 0, 0, .... , 1, ... 0, 0, 0, 0)
通常來講詞庫量至少都是百萬級別,所以詞袋模型有個兩個最大的問題:高緯度、高稀疏性
n-gram詞袋模型:
與詞袋模型相似,考慮了局部的順序信息,可是向量的維度過大,基本不採用。若是詞集合大小爲N,則bi-gram的單詞總數爲N2向量空間模型
向量空間模型:
以詞袋模型爲基礎,向量空間模型經過特徵選擇下降維度,經過特徵權重計算增長稠密性。
特徵權重計算:
通常有布爾權重、TFIDF型權重、以及基於熵概念權重這幾種方式,其中布爾權重是指若出現則爲1,不然爲0,也就是詞袋模型;而TFIDF則是基於詞頻來進行定義權重;基於熵的則是將出如今同一文檔的特徵賦予較高的權重。
3.1.3 機器學習分類器
將文本表示爲模型能夠處理的向量數據後,就可使用機器學習模型來進行處理,經常使用的模型有:
上文介紹了傳統的文本分類作法,傳統作法主要問題的文本表示是高緯度高稀疏的,特徵表達能力很弱,並且神經網絡很不擅長對此類數據的處理;此外須要人工進行特徵工程,成本很高。應用深度學習解決大規模文本分類問題最重要的是解決文本表示,再利用CNN/RNN等網絡結構自動獲取特徵表達能力,去掉繁雜的人工特徵工程,端到端的解決問題。
論文:Bag of Tricks for Efficient Text Classification
第一步:輸入層
在word2vec中,它的輸入就是單純的把詞袋向量化。可是在fasttext還加入了n-grams的思想。舉個例子「我 喜歡 她「,若是隻用這幾個詞的組合來反映這個句子,就是(」我」,」喜歡」,」她」),問題來了,句子「她 喜歡 我」的詞的組合也是(」我」,」喜歡」,」她」),但這兩個句子的意思徹底不一樣,因此若是隻用句子裏的詞來表明這個句子的意思,是不許確的,因此咱們要加入n-grams,好比說取n=2,那麼此時句子「我 喜歡 她「的詞語組合就是(」我」,」喜歡」,」她」,」我喜歡」,」喜歡她」)這就和句子」她喜歡我」所獲得的詞語組合不一樣了,咱們也能所以區分開這兩個句子。
因此此時咱們的輸入就是(」我」,」喜歡」,」她」,」我喜歡」,」喜歡她」)向量化後的5個向量,詞向量化參照。
第二步:中間層
其實這一步的思想更加樸素,就是將第一步中輸入的向量相加再求平均,獲得一個新的向量w,而後將這個向量輸入到輸出層。
第三步:輸出層
採用了層次softmax的方法,思想實質上是將一個全局多分類的問題,轉化成爲了若干個二元分類問題,從而將計算複雜度從O(V)降到O(logV)。既根據label的頻次創建哈夫曼樹,每一個label對應一個哈夫曼編碼,每一個哈夫曼樹節點具備一個向量做爲參數進行更新,預測的時候隱層輸出與每一個哈夫曼樹節點向量作點乘,根據結果決定向左右哪一個方向移動,最終落到某個label對應的節點上。
代碼連接:https://github.com/liyibo/text-classification-demos
論文:Convolutional Neural Networks for Sentence Classification
模型
詳細原理圖:
TextCNN詳細過程:
注:考慮了卷積核具備局部感覺野的特性
代碼連接:https://github.com/liyibo/text-classification-demos
論文:Recurrent Neural Network for Text Classification with Multi-Task Learning
利用CNN進行文本分類,說到底仍是利用卷積核尋找n-gram特徵。卷積核的大小是超參。而RNN則能夠處理時間序列,它經過先後時刻的輸出連接保證了「記憶」的留存。但RNN循環機制過於簡單,先後時刻的連接採用了最簡單的f=activate(ws+b)。這樣在梯度反向傳播時出現了時間上的連乘操做,從而致使了梯度消失和梯度爆炸的問題。RNN的變種LSTM/GRU在必定程度上減緩了梯度消失和梯度爆炸問題,所以如今使用的其實要比RNN更多。
利用RNN作文本分類也比較好理解,其實就是一個N vs 1模型。對於英文,都是基於詞的。對於中文,首先要肯定是基於字的仍是基於詞的。若是是基於詞,要先對句子進行分詞。以後,每一個字/詞對應RNN的一個時刻,隱層輸出做爲下一時刻的輸入。最後時刻的隱層輸出h爲整個句子的抽象特徵,再接一個softmax進行分類。
詳細的RNN的解釋能夠參考連接:https://zhuanlan.zhihu.com/p/28054589
代碼連接:https://github.com/liyibo/text-classification-demos
論文:Recurrent Convolutional Neural Networks for Text Classification
RCNN算法過程:
首先,採用雙向LSTM學習word的上下文
c_left = tf.concat([tf.zeros(shape), output_fw[:, :-1]], axis=1, name="context_left")
c_right = tf.concat([output_bw[:, 1:], tf.zeros(shape)], axis=1, name="context_right")
word_representation = tf.concat([c_left, embedding_inputs, c_right], axis=2, name="last")
以後再接跟TextCNN相同卷積層,pooling層便可,在seq_length維度進行 max pooling,而後進行fc操做就能夠進行分類了,能夠將該網絡當作是fasttext 的改進版本。
代碼連接:https://github.com/liyibo/text-classification-demos
論文:Hierarchical Attention Network for Document Classification
HAN爲Hierarchical Attention Networks,將待分類文本,分爲必定數量的句子,分別在word level和sentence level進行encoder和attention操做,從而實現對較長文本的分類。
本文是按照句子長度將文本分句的,實際操做中可按照標點符號等進行分句,理論上效果能好一點。
算法流程:
論文:Deep Pyramid Convolutional Neural Networks for Text Categorization
DPCNN主要的特點是引入了殘差結構,增長了多尺度信息,而且增長了用於文本分類CNN的網絡深度,以提取文本中遠程關係特哼,而且並無帶來較高的複雜度。實驗代表,其效果比普通CNN結構要好。
代碼連接:https://github.com/liyibo/text-classification-demos
Bert:
論文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
BERT是一種預訓練語言表示的方法,他將NLP模型的創建分爲了兩個階段:Pre-training和fine-tuning。Pre-training是爲了在大量文本語料(維基百科)上訓練了一個通用的「語言理解」模型,而後用這個模型去執行想作的NLP任務。Fine-training則是在具體的NLP任務上進行相應的微調學習。
Bert模型結構主要是採用了transformer的編碼結構,其主要創新點在於其訓練方式採用了1)它在訓練雙向語言模型時以減少的機率把少許的詞替成了Mask或者另外一個隨機的詞。感受其目的在於使模型被迫增長對上下文的記憶。2)增長了一個預測下一句的loss,迫使模型學習到句子之間的關係。
輸入表示:
論文的輸入表示(input representation)可以在一個token序列中明確地表示單個文本句子或一對文本句子(例如, [Question, Answer])。對於給定token,其輸入表示經過對相應的token、segment和position embeddings進行求和來構造。圖2是輸入表示的直觀表示:
關鍵創新:預訓練任務
任務1: Masked LM
爲了訓練一個深度雙向表示(deep bidirectional representation),研究團隊採用了一種簡單的方法,即隨機屏蔽(masking)部分輸入token,而後只預測那些被屏蔽的token。
數據生成器將執行如下操做,而不是始終用[MASK]替換所選單詞:
任務2:下一句預測
在爲了訓練一個理解句子的模型關係,預先訓練一個二進制化的下一句測任務,這一任務能夠從任何單語語料庫中生成。具體地說,當選擇句子A和B做爲預訓練樣本時,B有50%的多是A的下一個句子,也有50%的多是來自語料庫的隨機句子。
經過採用以上兩種預訓練方式,使得模型可以具備語義表徵性質,在fine-tuning階段就能夠搭連一個NN結構完成文本分類任務。
代碼連接:https://github.com/google-research/bert
論文:Densely Connected CNN with Multi-scale Feature Attention for Text Classification
若是說DPCNN算法是借鑑了計算機視覺中ResNet模型中殘差塊的想法,那麼Densely Connected CNN則是借鑑了DenseNet的密集型鏈接的作法。Densely Connected CNN主要採用short-cut操做將以前卷積提取出的feature加入到後續層的輸入,增長了多尺度信息的提取,使得卷積器真正觀測到的原始句子序列中的視野是愈來愈大的。其次,模型對不一樣尺度的feature採用了attention的作法,使得模型更好的利用feature信息。
代碼連接:
https://github.com/wangshy31/Densely-Connected-CNN-withMultiscale-Feature-Attention.git
論文:Graph Convolutional Networks for Text Classification
圖中節點的數量是單詞數量+文檔數量,O開頭的是文檔節點,其餘的是詞節點。圖中黑線的線表明文檔-詞的邊,灰色的表示詞-詞的邊。R(x)表示x的embedding表示。節點的不一樣顏色表明文檔的不一樣類型。
本文提出的TextGCN的初始輸入向量是詞和文檔所有用one-hot編碼表示。文檔-詞的邊基於詞在文檔中的出現信息,使TF-ID做爲邊的權重。詞-詞的連邊基於詞的全局詞共現信息。詞共現信息使用一個固定大小的滑動窗口在語料庫中滑動統計詞共現信息,而後使用點互信息(PMI)計算兩個詞節點連線的權重。
這裏的A是圖G的鄰接矩陣,D是圖G的度矩陣。W0和W1分別是GCN第一層和第二層可學習的卷積核權重,也是須要被訓練學習的。X是輸入特徵矩陣,是與節點數相同的維度的對角方形矩陣,這意味着輸入是圖中每一個節點的one-hot編碼。最後將輸出送到具備softmax函數的層,用於文本的分類。
代碼連接:https://github.com/yao8839836/text_gcn
論文:Investigating Capsule Networks with Dynamic Routing for Text Classification
Zhao等人提出了一種基於膠囊網絡的文本分類模型,並改進了Sabour等人提出的動態路由,提出了三種穩定動態路由。模型以下所示:
該模型首先利用標準的卷積網絡,經過多個卷積濾波器提取句子的局部語義表徵。而後將CNN的標量輸出替換爲向量輸出膠囊,從而構建Primary Capsule層。接着輸入到做者提出的改進的動態路由(共享機制的動態路由和非共享機制的動態路由),獲得卷積膠囊層。最後將卷積膠囊層的膠囊壓平,送入到全鏈接膠囊層,每一個膠囊表示屬於每一個類別的機率。
代碼連接:https://github.com/andyweizhao/capsule_text_classification.
論文:Variational Pretraining for Semi-supervised Text Classification
此篇論文講述,通常的半監督的文本分類模型基於大量數據和高昂計算力,致使他們在資源受限的環境下使用受限。因而,做者提出了一種基於預訓練半監督的文本分類輕量型模型。
此模型稱之爲VAMPIRE,它將variational autoencoder與document modeling相結合。
算法流程:
代碼連接:http://github.com/allenai/vampire
論文:XLNet: Generalized Autoregressive Pretraining for Language Understanding
XLNet引入了自迴歸語言模型(根據上文內容預測下一個可能跟隨的單詞,就是常說的自左向右的語言模型任務)以及自編碼語言模型(只能根據上文預測下一個單詞,或者反過來,只能根據下文預測前面一個單詞)的想法,可以同時利用上文和下文,因此信息利用充分。而BERT則是在第一個預訓練階段由於採起引入[Mask]標記來Mask掉部分單詞的訓練模式,而Fine-tuning階段是看不到這種被強行加入的Mask標記的,因此兩個階段存在使用模式不一致的情形,這可能會帶來必定的性能損失;另一個是,Bert在第一個預訓練階段,假設句子中多個單詞被Mask掉,這些被Mask掉的單詞之間沒有任何關係,是條件獨立的,而有時候這些單詞之間是有關係的。
明白了二者的差別後,咱們就容易發現XLNet的思路也就比較簡潔,通常來說,自迴歸語言模型有個缺點,要麼從左到右,要麼從右到左,若是咱們要根據上文,來預測某個單詞Ti,那麼它就無法看到下文的內容信息。怎麼讓模型具備從左向右的輸入和預測模式,並且內部又引入了當前單詞的上下文信息,則是XLNet主要的創新點。
具體的作法是,XLNet在第一階段預訓練時期,選擇捨去mask操做,將順序輸入的句子進行隨機排列組合。例如,句子輸入順序爲:X1,X2,X3,X4,在transformer階段採用了Attention掩碼機制,將句子順序變爲X4,X2,X1, X三、X3,X2, X1, X4等等這樣的序列,這樣在X4,X2,X1, X3中,X1即可以看到X4,X2,的信息,在X3,X2, X1, X4序列中,X1即可以看到X3,X2的信息。
如上圖所示,咱們在預測X3時,右上角圖所示中序列爲X2, X4 ,X3,X1,所以在預測X3時,使用了X2, X4的信息,其餘圖以此類推。
那麼Attention掩碼機制是什麼意思呢?咱們經過上圖來進行解釋,若是把白色當作掩蓋,紅色看做爲能看到信息,那麼在右側的Attention矩陣中能夠看出,咱們一行一行對應來看,就能看到每一個X看到的信息在Attention矩陣中已經表達出來,最後的順序也就變成了X3X2X4X1。
[此部分爲雙流自注意力機制]然而,這些都還不夠。這種預訓練方法可能會帶來歧義。在一個句子裏,咱們有可能針對不同的目標詞,產生出如出一轍的context。仍是用名句"山下一羣鵝,噓聲趕落河",假設咱們的分段長度爲11,把整個句子(含標點)都包括進來了。這時針對"鵝"字,在衆多的排列中,咱們能夠有一個天然的序列"山下一羣"來預測它。一樣針對"河"字,咱們在衆多排列中,也能夠有一個排序過的序列"山下一羣"來預測它。那麼如出一轍的序列(「山下一羣」)居然用來預測兩個不一樣的字,這致使了"鵝"和"河"在此時共享同樣的模型的預測結果。(參考triplemeng博客)。
爲了解決這個問題,一個簡單的想法就是引入對位置的依賴,用一個新的函數 表示,經過加入不一樣的被預測詞的位置,把上述狀況區分開了
在模型中,同時利用g和h,所謂的雙流即query stream和content stream,在fine-tuning階段,能夠徹底忽略掉第一個公式,僅利用content stream就能夠了。
其中:
query stream爲:爲預測token,只能利用它的位置信息即,但不利用。這裏的稱爲query representation。
content stream爲:在預測其餘token時,須要編碼信息來提供語境信息,因此這裏須要content representation,。
代碼連接:https://github.com/zihangdai/xlnet
論文:Transformable Convolutional Neural Network for Text Classification
這篇論文主要創新點在於提出了Transformable Convolution 和Transformable Pooling兩個處理方式,主要目的在於想經過以上兩種方式來獲取靜態特徵信息和動態特徵信息。
對於Transformable Convolution(Transformable Pooling也是一樣的道理),文章將filter(卷積核)中position(p)的集合稱之爲C,爲了將一部分的position與當前狀態的feature相關聯,將另外一部分與global信息關聯,把C分爲了兩部分S和D,每一部分單獨進行參數更新和計算。如上圖右上角,D中信息是經過上層feature map卷積得到的動態信息,而S則是上圖底部,經過反向傳播更新得到的全局信息。最後將這兩種信息經過如下公式進行綜合計算。
文章指出,直接採起卷積核在實際使用中不易處理,因此在計算方式上採用了一種mask的方式,使得矩陣相乘時得以實現分塊計算。
代碼連接:無
論文:Towards Explainable NLP: A Generative Explanation Framework for Text Classification
通常來說,分類模型只會給出一個類別機率分佈,沒法給出解釋性指標,來代表分類是否可信,因此Generative Explanation Framework的想法是:給出一個商品A,它具備quality, practicality, price三個屬性,若模型給出商品A爲good,而且可以指出分類理由是基於商品A的[quality:HIGH,practicality:HIGH,price:LOW]性質,咱們就認爲這樣的作法具備可解釋性。
所以,該方法數據樣本具備三個part:一個商品的描述文本、三個簡評、一個整體分數。此框架想經過使用描述文本數據訓練一個分類模型獲得分類的類別y以及Ppred,以後再利用上圖左側classifier C獲得的Pgold ,Pclassified分數,將三個P放入到度量公式EF(s)中獲得分類的置信度。
代碼連接:無