中文文本分類大概的步驟


文本分類問題:給定文檔p(可能含有標題t),將文檔分類為n個類別中的一個或多個
文本分類應用:常見的有垃圾郵件識別,情感分析
文本分類方向:主要有二分類,多分類,多標簽分類
文本分類方法:傳統機器學習方法(貝葉斯,svm等),深度學習方法(fastText,TextCNN等)
文本分類的處理大致分為文本預處理、文本特征提取、分類模型構建等。和英文文本處理分類相比,中文文本的預處理是關鍵技術。

 

一、中文分詞:針對中文文本分類時,很關鍵的一個技術就是中文分詞。特征粒度為詞粒度遠遠好於字粒度,其大部分分類算法不考慮詞序信息,基於字粒度的損失了過多的n-gram信息。下面簡單總結一下中文分詞技術:基於字符串匹配的分詞方法、基於理解的分詞方法和基於統計的分詞方法。具體可參考:中文分詞原理及分詞工具介紹https://blog.csdn.net/flysky1991/article/details/73948971/

 

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)詞袋特征的方法有三種:

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分類模型,神經網絡分類模型。
這里重點提一下貝葉斯模型,因為工業用這個模型用來識別垃圾郵件,具體參考:用朴素貝葉斯進行文本分類https://blog.csdn.net/longxinchen_ml/article/details/50597149

 

五、深度學習文本分類模型
1,fastText模型:fastText 是word2vec 作者 Mikolov 轉戰 Facebook 后16年7月剛發表的一篇論文: Bag of Tricks for Efficient Text Classification。
模型:
原理:句子中所有的詞向量進行平均(某種意義上可以理解為只有一個avg pooling特殊CNN),然后直接接 softmax 層。

 

2,TextCNN:利用CNN來提取句子中類似 n-gram 的關鍵信息。
模型:
改進: fastText 中的網絡結果是完全沒有考慮詞序信息的,而TextCNN提取句子中類似 n-gram 的關鍵信息。

 

3,TextRNN
模型: Bi-directional RNN(實際使用的是雙向LSTM)從某種意義上可以理解為可以捕獲變長且雙向的的 “n-gram” 信息。
改進: CNN有個最大問題是固定 filter_size 的視野,一方面無法建模更長的序列信息,另一方面 filter_size 的超參調節也很繁瑣。

 

4,TextRNN + Attention
模型:
改進:注意力(Attention)機制是自然語言處理領域一個常用的建模長時間記憶機制,能夠很直觀的給出每個詞對結果的貢獻,基本成了Seq2Seq模型的標配了。實際上文本分類從某種意義上也可以理解為一種特殊的Seq2Seq,所以考慮把Attention機制引入近來。

 

5,TextRCNN(TextRNN + CNN)
模型:

論文: Recurrent Convolutional Neural Networks for Text Classification

 

6,深度學習經驗:
模型顯然並不是最重要的:好的模型設計對拿到好結果的至關重要,也更是學術關注熱點。但實際使用中,模型的工作量占的時間其實相對比較少。雖然再第二部分介紹了5種CNN/RNN及其變體的模型,實際中文本分類任務單純用CNN已經足以取得很不錯的結果了,我們的實驗測試RCNN對准確率提升大約1%,並不是十分的顯著。最佳實踐是先用TextCNN模型把整體任務效果調試到最好,再嘗試改進模型。

 

理解你的數據:雖然應用深度學習有一個很大的優勢是不再需要繁瑣低效的人工特征工程,然而如果你只是把他當做一個黑盒,難免會經常懷疑人生。一定要理解你的數據,記住無論傳統方法還是深度學習方法,數據 sense 始終非常重要。要重視 badcase 分析,明白你的數據是否適合,為什么對為什么錯。

 

超參調節:可以參考深度學習網絡調參技巧 - 知乎專欄https://zhuanlan.zhihu.com/p/24720954?utm_source=zhihu&utm_medium=social

 

一定要用 dropout:有兩種情況可以不用:數據量特別小,或者你用了更好的正則方法,比如bn。實際中我們嘗試了不同參數的dropout,最好的還是0.5,所以如果你的計算資源很有限,默認0.5是一個很好的選擇。

 

未必一定要 softmax loss: 這取決與你的數據,如果你的任務是多個類別間非互斥,可以試試着訓練多個二分類器,也就是把問題定義為multi lable 而非 multi class,我們調整后准確率還是增加了>1%。

 

類目不均衡問題:基本是一個在很多場景都驗證過的結論:如果你的loss被一部分類別dominate,對總體而言大多是負向的。建議可以嘗試類似 booststrap 方法調整 loss 中樣本權重方式解決。

 

避免訓練震盪:默認一定要增加隨機采樣因素盡可能使得數據分布iid,默認shuffle機制能使得訓練結果更穩定。如果訓練模型仍然很震盪,可以考慮調整學習率或 mini_batch_size。


---------------------
原文:https://blog.csdn.net/u014248127/article/details/80774668?utm_source=copy

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM