文字分類概述(nlp)
文字分類問題: 給定文件p(可能含有標題t),將文件分類為n個類別中的一個或多個
文字分類應用: 常見的有垃圾郵件識別,情感分析
文字分類方向: 主要有二分類,多分類,多標籤分類
文字分類方法: 傳統機器學習方法(貝葉斯,svm等),深度學習方法(fastText,TextCNN等)
本文的思路: 本文主要介紹文字分類的處理過程,主要哪些方法。致力讓讀者明白在處理文字分類問題時應該從什麼方向入手,重點關注什麼問題,對於不同的場景應該採用什麼方法。
文字分類的處理大致分為文字預處理、文字特徵提取、分類模型構建等。和英文文字處理分類相比,中文文字的預處理是關鍵技術。
一、中文分詞:
針對中文文字分類時,很關鍵的一個技術就是中文分詞。特徵粒度為詞粒度遠遠好於字粒度,其大部分分類演算法不考慮詞序資訊,基於字粒度的損失了過多的n-gram資訊。下面簡單總結一下中文分詞技術:基於字串匹配的分詞方法、基於理解的分詞方法和基於統計的分詞方法 [1]。
1,基於字串匹配的分詞方法:
過程:這是一種基於詞典的中文分詞,核心是首先建立統一的詞典表,當需要對一個句子進行分詞時,首先將句子拆分成多個部分,將每一個部分與字典一一對應,如果該詞語在詞典中,分詞成功,否則繼續拆分匹配直到成功。
核心: 字典,切分規則和匹配順序是核心。
分析:優點是速度快,時間複雜度可以保持在O(n),實現簡單,效果尚可;但對歧義和未登入詞處理效果不佳。
2,基於理解的分詞方法:基於理解的分詞方法是通過讓計算機模擬人對句子的理解,達到識別詞的效果。其基本思想就是在分詞的同時進行句法、語義分析,利用句法資訊和語義資訊來處理歧義現象。它通常包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統可以獲得有關詞、句子等的句法和語義資訊來對分詞歧義進行判斷,即它模擬了人對句子的理解過程。這種分詞方法需要使用大量的語言知識和資訊。由於漢語語言知識的籠統、複雜性,難以將各種語言資訊組織成機器可直接讀取的形式,因此目前基於理解的分詞系統還處在試驗階段。
3,基於統計的分詞方法:
過程:統計學認為分詞是一個概率最大化問題,即拆分句子,基於語料庫,統計相鄰的字組成的詞語出現的概率,相鄰的詞出現的次數多,就出現的概率大,按照概率值進行分詞,所以一個完整的語料庫很重要。
主要的統計模型有:
二、文字預處理:
1,分詞: 中文任務分詞必不可少,一般使用jieba分詞,工業界的翹楚。
2,去停用詞:建立停用詞字典,目前停用詞字典有2000個左右,停用詞主要包括一些副詞、形容詞及其一些連線詞。通過維護一個停用詞表,實際上是一個特徵提取的過程,本質 上是特徵選擇的一部分。
3,詞性標註: 在分詞後判斷詞性(動詞、名詞、形容詞、副詞…),在使用jieba分詞的時候設定引數就能獲取。
三、文字特徵工程:
文字分類的核心都是如何從文字中抽取出能夠體現文字特點的關鍵特徵,抓取特徵到類別之間的對映。 所以特徵工程很重要,可以由四部分組成:
1,基於詞袋模型的特徵表示:以詞為單位(Unigram)構建的詞袋可能就達到幾萬維,如果考慮二元片語(Bigram)、三元片語(Trigram)的話詞袋大小可能會有幾十萬之多,因此基於詞袋模型的特徵表示通常是極其稀疏的。
(1)詞袋特徵的方法有三種:
- Naive版本:不考慮詞出現的頻率,只要出現過就在相應的位置標1,否則為0;
- 考慮詞頻(即term frequency):,認為一段文字中出現越多的詞越重要,因此權重也越大;
- 考慮詞的重要性:以TF-IDF表徵一個詞的重要程度。TF-IDF反映了一種折中的思想:即在一篇文件中,TF認為一個詞出現的次數越大可能越重要,但也可能並不是(比如停用詞:“的”“是”之類的);IDF認為一個詞出現在的文件數越少越重要,但也可能不是(比如一些無意義的生僻詞)。
(2)優缺點:
- 優點: 詞袋模型比較簡單直觀,它通常能學習出一些關鍵詞和類別之間的對映關係
- 缺點: 丟失了文字中詞出現的先後順序資訊;僅將詞語符號化,沒有考慮詞之間的語義聯絡(比如,“麥克風”和“話筒”是不同的詞,但是語義是相同的);
2,基於embedding的特徵表示: 通過詞向量計算文字的特徵。(主要針對短文字)
- 取平均: 取短文字的各個詞向量之和(或者取平均)作為文字的向量表示;
- 網路特徵: 用一個pre-train好的NN model得到文字作為輸入的最後一層向量表示;
3,基於NN Model抽取的特徵: NN的好處在於能end2end實現模型的訓練和測試,利用模型的非線性和眾多引數來學習特徵,而不需要手工提取特徵。CNN善於捕捉文字中關鍵的區域性資訊,而RNN則善於捕捉文字的上下文資訊(考慮語序資訊),並且有一定的記憶能力。
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]。
模型結構:
原理: 句子中所有的詞向量進行平均(某種意義上可以理解為只有一個avg pooling特殊CNN),然後直接連線一個 softmax 層進行分類。
2,TextCNN: 利用CNN來提取句子中類似 n-gram 的關鍵資訊。
模型結構[4]:
改進: fastText 中的網路結果是完全沒有考慮詞序資訊的,而TextCNN提取句子中類似 n-gram 的關鍵資訊。
3,TextRNN:
模型: Bi-directional RNN(實際使用的是雙向LSTM)從某種意義上可以理解為可以捕獲變長且雙向的的 “n-gram” 資訊。
改進: CNN有個最大問題是固定 filter_size 的視野,一方面無法建模更長的序列資訊,另一方面 filter_size 的超參調節也很繁瑣。
4,TextRNN + Attention:
模型結構[5]:
改進:注意力(Attention)機制是自然語言處理領域一個常用的建模長時間記憶機制,能夠很直觀的給出每個詞對結果的貢獻,基本成了Seq2Seq模型的標配了。實際上文字分類從某種意義上也可以理解為一種特殊的Seq2Seq,所以考慮把Attention機制引入近來。
5,TextRCNN(TextRNN + CNN):
模型結構[6]:
過程:
利用前向和後向RNN得到每個詞的前向和後向上下文的表示:
詞的表示變成詞向量和前向後向上下文向量連線起來的形式:
再接跟TextCNN相同卷積層,pooling層即可,唯一不同的是卷積層 filter_size = 1就可以了,不再需要更大 filter_size 獲得更大視野。
6,深度學習經驗:
模型顯然並不是最重要的: 好的模型設計對拿到好結果的至關重要,也更是學術關注熱點。但實際使用中,模型的工作量佔的時間其實相對比較少。雖然再第二部分介紹了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知乎看山杯 從入門到第二
參考文獻
1.中文分詞原理及分詞工具介紹:https://blog.csdn.net/flysky1991/article/details/73948971/
2.用樸素貝葉斯進行文字分類:https://blog.csdn.net/longxinchen_ml/article/details/50597149
3.Joulin A, Grave E, Bojanowski P, et al. Bag of Tricks for Efficient Text Classification[J]. 2016:427-431.
4.Kim Y . Convolutional Neural Networks for Sentence Classification[J]. Eprint Arxiv, 2014.
5.Pappas N , Popescu-Belis A . Multilingual Hierarchical Attention Networks for Document Classification[J]. 2017.
6.Lai S, Xu L, Liu K, et al. Recurrent Convolutional Neural Networks for Text Classification[C]//AAAI. 2015, 333: 2267-2273.