文本上的演算法
㈠ 文本分類方法有哪些
文本分類問題: 給定文檔p(可能含有標題t),將文檔分類為n個類別中的一個或多個
文本分類應用: 常見的有垃圾郵件識別,情感分析
文本分類方向: 主要有二分類,多分類,多標簽分類
文本分類方法: 傳統機器學習方法(貝葉斯,svm等),深度學習方法(fastText,TextCNN等)
本文的思路: 本文主要介紹文本分類的處理過程,主要哪些方法。致力讓讀者明白在處理文本分類問題時應該從什麼方向入手,重點關注什麼問題,對於不同的場景應該採用什麼方法。
文本分類的處理大致分為 文本預處理 、文本 特徵提取 、 分類模型構建 等。和英文文本處理分類相比,中文文本的預處理是關鍵技術。
針對中文文本分類時,很關鍵的一個技術就是中文分詞。特徵粒度為詞粒度遠遠好於字粒度,其大部分分類演算法不考慮詞序信息,基於字粒度的損失了過多的n-gram信息。下面簡單總結一下中文分詞技術:基於字元串匹配的分詞方法、基於理解的分詞方法和基於統計的分詞方法 [1]。
1,基於字元串匹配的分詞方法:
過程:這是 一種基於詞典的中文分詞 ,核心是首先建立統一的詞典表,當需要對一個句子進行分詞時,首先將句子拆分成多個部分,將每一個部分與字典一一對應,如果該詞語在詞典中,分詞成功,否則繼續拆分匹配直到成功。
核心: 字典,切分規則和匹配順序是核心。
分析:優點是速度快,時間復雜度可以保持在O(n),實現簡單,效果尚可;但對歧義和未登錄詞處理效果不佳。
2, 基於理解的分詞方法:基於理解的分詞方法是通過讓計算機模擬人對句子的理解 ,達到識別詞的效果。其基本思想就是在分詞的同時進行句法、語義分析,利用句法信息和語義信息來處理歧義現象。它通常包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統可以獲得有關詞、句子等的句法和語義信息來對分詞歧義進行判斷,即它模擬了人對句子的理解過程。這種分詞方法需要使用大量的語言知識和信息。由於漢語語言知識的籠統、復雜性,難以將各種語言信息組織成機器可直接讀取的形式,因此目前基於理解的分詞系統 還處在試驗階段 。
3,基於統計的分詞方法:
過程:統計學認為分詞是一個 概率最大化問題 ,即拆分句子,基於語料庫,統計 相鄰的字組成的詞語出現的概率 ,相鄰的詞出現的次數多,就出現的概率大, 按照概率值進行分詞 ,所以一個完整的語料庫很重要。
主要的統計模型有: N元文法模型(N-gram),隱馬爾可夫模型(Hidden Markov Model ,HMM),最大熵模型(ME),條件隨機場模型(Conditional Random Fields,CRF)等。
1, 分詞 : 中文任務分詞必不可少,一般使用jieba分詞,工業界的翹楚。
2, 去停用詞:建立停用詞字典 ,目前停用詞字典有2000個左右,停用詞主要包括一些副詞、形容詞及其一些連接詞。通過維護一個停用詞表,實際上是一個特徵提取的過程,本質 上是特徵選擇的一部分。
3, 詞性標注 : 在分詞後判斷詞性(動詞、名詞、形容詞、副詞…),在使用jieba分詞的時候設置參數就能獲取。
文本分類的核心都是如何從文本中抽取出能夠體現文本特點的關鍵特徵,抓取特徵到類別之間的映射。 所以特徵工程很重要,可以由四部分組成:
1,基於詞袋模型的特徵表示:以詞為單位(Unigram)構建的詞袋可能就達到幾萬維,如果考慮二元片語(Bigram)、三元片語(Trigram)的話詞袋大小可能會有幾十萬之多,因此基於詞袋模型的特徵表示通常是極其稀疏的。
(1)詞袋特徵的方法有三種:
(2)優缺點:
2,基於embedding的特徵表示: 通過詞向量計算文本的特徵。(主要針對短文本)
4,基於任務本身抽取的特徵:主要是針對具體任務而設計的,通過我們對數據的觀察和感知,也許能夠發現一些可能有用的特徵。有時候,這些手工特徵對最後的分類效果提升很大。舉個例子,比如對於正負面評論分類任務,對於負面評論,包含負面詞的數量就是一維很強的特徵。
5,特徵融合:對於特徵維數較高、數據模式復雜的情況,建議用非線性模型(如比較流行的GDBT, XGBoost);對於特徵維數較低、數據模式簡單的情況,建議用簡單的線性模型即可(如LR)。
6,主題特徵:
LDA(文檔的話題): 可以假設文檔集有T個話題,一篇文檔可能屬於一個或多個話題,通過LDA模型可以計算出文檔屬於某個話題的概率,這樣可以計算出一個DxT的矩陣。LDA特徵在文檔打標簽等任務上表現很好。
LSI(文檔的潛在語義): 通過分解文檔-詞頻矩陣來計算文檔的潛在語義,和LDA有一點相似,都是文檔的潛在特徵。
這部分不是重點,傳統機器學習演算法中能用來分類的模型都可以用,常見的有:NB模型,隨機森林模型(RF),SVM分類模型,KNN分類模型,神經網路分類模型。
這里重點提一下貝葉斯模型,因為工業用這個模型用來識別垃圾郵件[2]。
1,fastText模型: fastText 是word2vec 作者 Mikolov 轉戰 Facebook 後16年7月剛發表的一篇論文: Bag of Tricks for Efficient Text Classification [3]。
模型結構:
改進:注意力(Attention)機制是自然語言處理領域一個常用的建模長時間記憶機制,能夠很直觀的給出每個詞對結果的貢獻,基本成了Seq2Seq模型的標配了。實際上文本分類從某種意義上也可以理解為一種特殊的Seq2Seq,所以考慮把Attention機制引入近來。
過程:
利用前向和後向RNN得到每個詞的前向和後向上下文的表示:
詞的表示變成詞向量和前向後向上下文向量連接起來的形式:
模型顯然並不是最重要的: 好的模型設計對拿到好結果的至關重要,也更是學術關注熱點。但實際使用中,模型的工作量占的時間其實相對比較少。雖然再第二部分介紹了5種CNN/RNN及其變體的模型,實際中文本分類任務單純用CNN已經足以取得很不錯的結果了,我們的實驗測試RCNN對准確率提升大約1%,並不是十分的顯著。最佳實踐是先用TextCNN模型把整體任務效果調試到最好,再嘗試改進模型。
理解你的數據: 雖然應用深度學習有一個很大的優勢是不再需要繁瑣低效的人工特徵工程,然而如果你只是把他當做一個黑盒,難免會經常懷疑人生。一定要理解你的數據,記住無論傳統方法還是深度學習方法,數據 sense 始終非常重要。要重視 badcase 分析,明白你的數據是否適合,為什麼對為什麼錯。
超參調節: 可以參考 深度學習網路調參技巧 - 知乎專欄
一定要用 dropout: 有兩種情況可以不用:數據量特別小,或者你用了更好的正則方法,比如bn。實際中我們嘗試了不同參數的dropout,最好的還是0.5,所以如果你的計算資源很有限,默認0.5是一個很好的選擇。
未必一定要 softmax loss: 這取決與你的數據,如果你的任務是多個類別間非互斥,可以試試著訓練多個二分類器,也就是把問題定義為multi lable 而非 multi class,我們調整後准確率還是增加了>1%。
類目不均衡問題: 基本是一個在很多場景都驗證過的結論:如果你的loss被一部分類別dominate,對總體而言大多是負向的。建議可以嘗試類似 booststrap 方法調整 loss 中樣本權重方式解決。
避免訓練震盪: 默認一定要增加隨機采樣因素盡可能使得數據分布iid,默認shuffle機制能使得訓練結果更穩定。如果訓練模型仍然很震盪,可以考慮調整學習率或 mini_batch_size。
知乎的文本多標簽分類比賽,給出第一第二名的介紹網址:
NLP大賽冠軍總結:300萬知乎多標簽文本分類任務(附深度學習源碼)
2017知乎看山杯 從入門到第二
㈡ 利用神經網路進行文本分類演算法綜述(持續更新中)
傳統的文本分類一般都是使用詞袋模型/Tf-idf作為特徵+機器學習分類器來進行分類的。隨著深度學習的發展,越來越多的神經網路模型被用來進行文本分類。本文將對這些神經網路模型做一個簡單的介紹。
本文介紹了一種詞向量模型,雖然算不得文本分類模型,但由於其可以說是fasttext的基礎。因此也簡單提一下。
作者認為cbow和skipgram及大部分詞向量模型都沒有考慮到單詞的多態性,而簡單的將一個單詞的多種形態視為獨立的單詞。例如like的不同形式有likes,liking,liked,likes,這些單詞的意思其實是相同的,但cbow/skipgram模型卻認為這些單詞是各自獨立的,沒有考慮到其形態多樣性。
因此作者提出了一個可以有效利用單詞字元級別信息的n-gram詞向量模型,該模型是以skipgram模式實現的。例如單詞 where,其n-gram表示為<wh, whe, her, ere, re>, where。其中<>分別表示前後綴。在原始的skipgram模型中,輸入僅僅只是where的onehot向量,而在此模型中輸入則變成了<wh, whe, her, ere, re>, where的onehot編碼的加和,有效的利用了字元級別的信息,因此效果更加好。
而在loss方面,文中採用了負采樣+binary LogisticRegression的策略。即對每一個目標單詞都預測為正負中的一種。
在本文中作者提供了一個基於神經網路的文本分類模型,這個模型是基於cbow的,與cbow非常類似。
和CBOW一樣,fastText模型也只有三層:輸入層、隱含層、輸出層(Hierarchical Softmax),輸入都是多個經向量表示的單詞,輸出都是一個特定的target,隱含層都是對多個詞向量的疊加平均。不同的是,CBOW的輸入是目標單詞的上下文,fastText的輸入是多個單詞及其n-gram特徵的embeding表示方式,這些特徵用來表示單個文檔;CBOW的輸入單詞被onehot編碼過,fastText的輸入特徵是被embedding過;CBOW的輸出是目標詞彙,fastText的輸出是文檔對應的類標。輸出層的實現同樣使用了層次softmax,當然如果自己實現的話,對於類別數不是很多的任務,個人認為是可以直接使用softmax的。
最後,貼一個Keras的模型fasttext簡化版。
基於詞向量表示,本文提出利用卷積神經網路來進行文本分類。其演算法如上圖所示:
在本文中,作者嘗試了多種不同的詞向量模式:
在上一篇文章中CNN網路的輸入一般是預訓練好的詞向量,而在本文中作者提出一種直接將embedding訓練與分類任務結合在一起,且能有效提取/保留詞序信息,也即有效訓練出n-gram的模型方法,其實也可以理解為一種利用CNN來進行embedding的方法。
此外,另一個問題是輸入序列長度變化問題(在上一篇文章textCNN中通過padding解決的?),在本文作者提出使用一個動態可變的pooling層來解決這個問題,使得卷積層輸出的大小是相同的。關於可變pooling其實與圖像識別中的 空間金字塔池化 (Spatial Pyramid Pooling) 是類似的。
這篇文章有點將fastText與TextCNN結合在一起的感覺,將n-gram embedding與分類任務結合在了一起進行訓練,通過CNN來進行Embedding。
Text Categorization via Region Embedding》
在本篇文章中作者提出了一個tv-embedding(即two-view embedding),它也屬於region embedding(也可以理解為ngram embedding)。這種方法與上面的bow-CNN表示相似,使用bow(bag of words)的方式來表示一個區域的詞句,然後通過某個區域(region,左右鄰域的單詞或詞句)來預測其前後的區域(單詞或詞句),即輸入區域是view1,target區域是view2。tv-embedding是單獨訓練的,在使用的時候與CNN中的embedding組合在一起(形成多個channel?)。作者認為,word2vec方法預訓練得到的embedding向量是普適性的,而通過特定任務的數據集的訓練得到tv-embedding具有任務相關的一些信息,更有利於提升我們的模型效果。
吐槽一下,這篇文章沒太看懂,也可能是英語太差,作者文章中沒有那種一眼就能讓人理解的網路圖,像textCNN的圖就非常一目瞭然,看圖就知道是怎麼做的了。
本文提出了一個使用監督學習加半監督預訓練的基於LSTM的文本分類模型。文章作者與上面相同,所以用到的很多技術可以說與上面也是同出一轍。因此簡單說下本文的一些思路。
作者認為已有的直接使用LSTM作為文本分類模型並直接將LSTM的最後一個輸出作為後續全連接分類器的方法面臨兩個問題:(1)這種方式一般都是與word embedding整合在一起(即輸入onehot經過一個embedding層再進入LSTM),但是embedding訓練不穩定,不好訓練;(2)直接使用LSTM最後一個輸出來表示整個文檔不準確,一般來說LSTM輸入中後面的單詞會在最後輸出中佔有較重的權重,但是這對於文章表示來說並不總是對的。因此作者對這兩點進行了改進:
本文其實可以看作是作者將自己前面的tv-embedding半監督訓練與RCNN的一個融合吧,大有一種一頓操作猛如虎,一看人頭0-5的感覺(因為作者的實驗結果跟一般的CNN相比其實也搶不了多少)。
本文的作者也是前面兩篇使用CNN來進行文本分類處理的文章的作者。因此在本文中,結合了前面兩篇文章提出的一些方法,並使用了一個深層的卷積神經網路。具體的細節包括:
更多詳細的關於DPCNN的細節可以查看 從DPCNN出發,撩一下深層word-level文本分類模型 。
本文提出了一種基於CNN+Attention的文本分類模型。作者認為已有的基於CNN的文本分類模型大都使用的是固定大小的卷積核,因此其學習到的表示也是固定的n-gram表示,這個n與CNN filter大小相關。但是在進行句子的語義表示時,不同句子發揮重要作用的ngram詞語常常是不同的,也即是變化的。因此,模型能根據句子來自適應的選擇每個句子最佳的n-gram對於提升模型的語義表示能力是非常關鍵的。本文便是由此思路提出了一種自適應的來選擇不同n-gram表示的模型。
本文模型在主題結構上參照了CV中的DenseNet,藉由DenseNet中的稠密連接來提取到豐富的n-gram特徵表示。舉例來說,在layer3的特徵不僅能學習到f(x1, x2, x3),還能學習到f(x1(x2,x3))這種更多層次,更加豐富的特徵。網路的結構主要包括三部分:DenseCNN主網路,Attention mole和最後的全連接層分類網路。下面對這三部分進行簡單的說明:
本文通過Dense connection + Attention來自動獲取對於文本語義最重要的n-gram特徵,結果很好。但是缺點是,這個網路比較適合較短的文本,文中對輸入文本進行了padding補齊,對於不同數據集最大長度分別為50,100等,但這對於較長的文本明顯是不足的。因此對於較長的文本或許HAN這種借用RNN來不限制輸入長短的網路會更好。
本文提出了一種結合循環神經網路(RNN)和卷積神經網路來進行文本分類的方法,其結構如上圖所示,該網路可以分為三部分:
雖然說是RNN與CNN的結合,但是其實只用到了CNN中的pooling,多少有一點噱頭的意思。文中還提到了RCNN為什麼比CNN效果好的原因,即為什麼RCNN能比CNN更好的捕捉到上下文信息:CNN使用了固定大小window(也即kernel size)來提取上下文信息,其實就是一個n-gram。因此CNN的表現很大程度上受window大小的影響,太小了會丟失一些長距離信息,太大了又會導致稀疏性問題,而且會增加計算量。
在眾多自然語言處理任務中,一個非常突出的問題就是訓練數據不足,且標注難度大。因此文本提出了一種多任務共享的RNN模型框架,其使用多個不同任務數據集來訓練同一個模型共享參數,已達到擴充數據集的作用。
文中作者提出了三個模型,如上圖所示:
三個模型的訓練方式相同:
本文提出了一個層次LSTM+Attention模型。作者認為,雖然一篇文章有多個句子組成但真正其關鍵作用的可能是其中的某幾個,因此對各個句子施加了注意力機制,以使得對文章語義貢獻較多的句子佔有更多的權重。同樣的,組成一個句子的單詞有多個,但是發揮重要作用的可能就那麼幾個,因此使用注意力機制以使得重要單詞發揮更大的作用,這些便是本文的核心思想。整個網路可分為三層,兩個LSTM層分別用來進行word encode和sentence encode,最頂上為一個全連接分類層。若加上兩層注意力層,則可認為網路為5層。下面簡單聊聊這五層網路的結構:
總體來說,本文看起來還是比較有意思的,符合人閱讀文章的習慣,我們寫文章的時候也是有中心詞和中心句的。但是由於這個層級結構是否會導致訓練慢或者不好訓練還不得而知。最後,文中還提出對文章按長短先進行排序,長度相似的進入一個batch,這將訓練速度加快了3倍。
本文提出了一個基於圖神經網路的文本分類方法。該方法的主要思想是將所有文章及其包含的詞彙都放到一個圖網路裡面去,圖網路中的節點分為兩種類型:單詞節點和文章節點。其中連接單詞節點和文章節點的邊的權重使用TF-IDF來表示,而單詞與單詞之間邊的權重則是使用點互信息(PMI)來表示。點互信息與傳統語言模型中的條件概率計算方式非常相似。只不過PMI採用的是滑窗方式而條件概率是直接在所有語料中進行統計,可以認為是將所有語料當做一個大窗口,這時就又與PMI相同了。
A表示圖網路的鄰接矩陣,表示如下:
GCN同樣也是可以含有多層隱藏層的,其各個層的計算方式如下:
其中A'為歸一化對稱鄰接矩陣, W0 ∈ R^(m×k) 為權重矩陣,ρ是激活函數,例如 ReLU ρ(x) = max(0,x) 如前所述,可以通過疊加多個GCN層來合並更高階的鄰域信息:
其中j表示層數。
損失函數定義為所有已標記文檔的交叉熵誤差:
文中提到Text GCN運行良好的原因有兩個方面:
但是其也有一些缺:
總的來說,文章的idea還是挺有意思的,效果也還不錯。初識GCN可能還是有一點難以理解,可以參考如下資料進行進一步學習:
基於圖卷積網路的文本分類演算法
如何理解 Graph Convolutional Network(GCN)?