基於Text-CNN模型的中文文本分類實戰


Text-CNN

1.文本分類

轉眼學生生涯就結束了,在家待就業期間正好有一段空閑期,可以對曾經感興趣的一些知識點進行總結。

本文介紹NLP中文本分類任務中核心流程進行了系統的介紹,文末給出一個基於Text-CNN模型在搜狗新聞數據集上二分類的Demo。

文本分類是自然語言處理領域最活躍的研究方向之一,從樣本數據的分類標簽是否互斥上來說,可以分為文本多分類與文本多標簽分類。

文本分類

目前文本分類在工業界的應用場景非常普遍,從新聞的分類、商品評論信息的情感分類到微博信息打標簽輔助推薦系統,了解文本分類技術是NLP初學者比較好的切入點,較簡單且應用場景高頻。

2.數據准備

在機器學習領域有一句話:數據決定了模型最終的高度,不斷優化的模型只不過是為了不斷逼近這個高度而已。

文本分類作為一種有監督學習的任務,毫無疑問的需要一個可用於有監督學習的語料集(X,Y)。本文中使用以下標記,X為特征,文本分類中即為文本序列,Y是標簽,即文本的分類名稱。

機器學習與傳統編程技術的明顯區別就是:機器學習是以數據為驅動的,傳統的編程中,我們核心任務是人工設計分類規則(指令代碼),然后實現輸入特征X獲得分類標簽Y。而在機器學習的方式中,我們首要的是獲得一個高質量的、大數據量的有監督語料集(X,Y),然后機器學習的方式會自動的從已構建的數據集上歸納出(訓練出)一套分類規則(分類模型),最后我們利用獲得的分類規則來實現對未標記文本的分類。

機器學習VS傳統編程

換言之,傳統的編程方式輸入的是指令代碼,而機器學習輸入的是結構化數據

因此,在機器學習任務中,數據的質量與數量對最終模型的預測結果好壞具有決定性的作用。

常言道:Garbage in, garbage out!

在文本分類中,語料集(X,Y)的質量、數量決定了文本分類模型的分類效果。

語料集的質量:即數據集的特征X對應的標簽Y是否標記的正確,一般在眾包平台中會采用多人重復標記,然后基於投票的機制來控制語料集的標記質量。 語料集的數量:有監督語料集的標注復雜度,想要獲得海量的高質量語料集的成本是十分高昂的,這也限制的語料集的數量。

在實際的文本分類任務中,一般通過搜集開源的數據集,或者利用爬蟲獲取結構化的網頁信息來構建特定任務的語料集。不過,我還是更喜歡關注一些公開的競賽項目,能夠獲得企業准備的高質量、應對真實業務場景的數據集,例如:kaggle、知乎的看山杯、mrc2018-cipsc等,但大多數情況下企業只給脫敏之后的數據?.......

收藏數據集第一,比賽名次第二......

搜狗的新聞語料集:http://www.sogou.com/labs/resource/cs.php

3.文本的預處理

文本的預處理,主要針對剔除無意義的符號信息,或其它的冗余信息。例如,在使用爬蟲獲取的語料集上可能存在一些html的標簽,這些符號對於文本分類任務來說應該是冗余的無意義信息,可以剔除掉。

此外,針對中文、日語等無空格切分字詞的語言,還需要進行分詞處理,將一段文本序列划分為合理的詞(字)序列。

英文中天生的就有空格把每個詞匯分割開來,所以不需要分詞操作,但由於英文存在時態、縮寫等問題,在預處理階段會有詞干提取、詞性還原、大小寫轉換等。

中文分詞的工具有非常多的方案,我一般習慣於使用Python版的JieBa分詞工具包來進行分詞的操作,使用非常的簡單,使用pip install jieba就可以很方便的安裝該工具包,jieba常用的API可以查看GitHub主頁的實例。

文本預處理

推薦閱讀: 中文分詞原理【https://www.jianshu.com/p/6c085bf1086f】 JieBa的GitHub官網:https://github.com/fxsjy/jieba

3.文本的數值化【詞向量技術】

文本的數值化,即使用數字代表特定的詞匯,因為計算機無法直接處理人類創造的詞匯。為了讓計算機能夠理解詞匯,我們需要將詞匯信息映射到一個數值化的語義空間中,這個語義空間我們可以稱之為詞向量空間(詞向量模型)。

文本的數值化方式有很多種,例如:TF-IDF、BOW、One-Hot、分布式的表示方式(word2vec、Glove)等。

我一般常用的就是最經典的word2vec工具,該工具在NLP領域具有非常重要的意義!

word2ve工具,它是一種無監督的學習模型,可以在一個語料集上(不需要標記,主要思想是“具有相似鄰近詞分布的中心詞之之間具有一定的語義相似度”),實現詞匯信息到語義空間的映射,最終獲得一個詞向量模型(每個詞匯對應一個指定維度的數組)。

兩種模型兩種優化方式

它的核心優勢就是實現了兩個詞匯信息之間的語義相似度的可計算性,也可以理解為是一種遷移學習的思想,word2vec獲取的意義空間信息作為后續文本分類模型的輸入。

python 中使用word2vec工具也是非常的便利,通過pip install gensim安裝gensim工具包,此包匯總包含了word2vec工具。

【注:Ubuntu與Mac系統安裝的gensim包中word2vec的API存在一些差異!】

Gensim官網:https://radimrehurek.com/gensim/models/word2vec.html

深度學習中將單詞表示成向量是很普遍的情況,深度學習模型以詞向量序列的形式讀取序列化的單詞,而不是以文本的形式。

今天大多數用於自然語言處理的深度學習模型都依賴詞向量來代表單個單詞的含義。對於不太熟悉這領域的人而言,可以這樣簡單的理解:我們把每一種語言中的每一個單詞都與一串被叫做向量的數字聯系起來了。

詞向量

以上就是深度學習模型需要的數據格式的核心處理流程,在整個處理過程中樣本數據的處理流程如下圖所示:

數據處理流程


4.文本分類模型

文本分類模型,可以大體上分為基於傳統機器學習的文本分類模型,基於深度學習的文本分類模型,目前基於深度學習模型的文本分類模型已經成為了主流,下面基於CNN的文本分類模型。

深度學習的優勢

文本分類模型,從最經典的2013年Kim提出Text-CNN模型開始,深度學習模型在文本分類任務上具有廣泛的應用。2016年Kim跳槽FaceBook后提出了工業界的文本分類模型的“新寵”—FastText。

文本分類模型

為了實現文本分類模型,需要借助開源的深度學習框架,這樣在開發中就不需要自己從零實現整個深度學習模型的各個功能模塊。如果你之前做過Java Web開發的話,肯定也使用過SSH或SSM等框架來簡化你的開發工作。

深度學習框架有很多優秀的框架,我一般使用比較流行的tensorflow計算框架,該框架的使用者比較多,可以查閱的學習資料非常多,Github上的開源代碼也比較多,非常有利於我們學習。

tensorflow全家桶

文本分類的技術路線【研二時實驗室內部的技術分享PPT】:

文本分類技術路線

本文選擇使用2013年Kim提出的Text-CNN模型作為文本分類模型,通過驗證實驗以及業界的共識,在文本分類任務中,CNN模型已經能夠取到比較好的結果,雖然在某些數據集上效果可能會比RNN稍差一點,但是CNN模型訓練的效率更高。所以,一般認為CNN模型在文本分類任務中是兼具效率與質量的理想模型。

針對海量的文本多分類數據,也可以嘗試一下淺層的深度學習模型FastText模型,該模型的分類效率更高。

Text-CNN模型結構

Text-CNN模型的整體網絡架構如圖所示,如果你學習過CNN或者CNN在圖像中的使用,應該很容易就理解,因為該模型就是一個最簡單的CNN網絡模型。

整個模型由四部分構成:輸入層、卷積層、池化層、全連接層。

1.輸入層(詞嵌入層):

Text-CNN模型的輸入層需要輸入一個定長的文本序列,我們需要通過分析語料集樣本的長度指定一個輸入序列的長度L,比L短的樣本序列需要填充,比L長的序列需要截取。最終輸入層輸入的是文本序列中各個詞匯對應的詞向量。

2.卷積層:

在NLP領域一般卷積核只進行一維的滑動,即卷積核的寬度與詞向量的維度等寬,卷積核只進行一維的滑動。

在Text-CNN模型中一般使用多個不同尺寸的卷積核。卷積核的高度,即窗口值,可以理解為N-gram模型中的N,即利用的局部詞序的長度,窗口值也是一個超參數,需要在任務中嘗試,一般選取2-8之間的值。

卷積層

3.池化層:

在Text-CNN模型的池化層中使用了Max-pool(最大值池化),即減少了模型 的參數,又保證了在不定長的卷基層的輸出上獲得一個定長的全連接層的輸入。

池化層

卷積層與池化層在分類模型的核心作用就是特征提取的功能,從輸入的定長文本序列中,利用局部詞序信息,提取初級的特征,並組合初級的特征為高級特征,通過卷積與池化操作,省去了傳統機器學習中的特征工程的步驟。

4.全連接層:

全連接層的作用就是分類器,原始的Text-CNN模型使用了只有一層隱藏層的全連接網絡,相當於把卷積與池化層提取的特征輸入到一個LR分類器中進行分類。

至此,Text-CNN的模型結構就算大體了解了,有人把深度學習模型看作一個黑盒子,知道格式化的輸入,我們就可以利用別人搭建好的模型框架訓練在自己的數據集上實現一定的功能。但是在不同的數據集上,模型的最佳狀態也不唯一,這就需需要我們在新的數據集上需要進行調優(調參)。

5.模型的效果評估與調優

針對分類問題,一般可以使用准確率、召回率、F1值、混淆矩陣等指標,在文本多標簽分類中一般還會考慮標簽的位置加權等問題。

分類模型中的主要參數:詞向量的維度、卷積核的個數、卷積核的窗口值、L2的參數、DropOut的參數、學習率等。

這是在模型優化的過程中需要重點關注的參數。此外,一般數據集的類別不均衡問題對模型的影響也是比較顯著的,可以嘗試使用不同的方法,評估不同方案的模型效果。

文本分類中經常遇到的問題:

1.數據集類別不均衡

即語料集中,各個類別下的樣本數量差異較大,會影響最終文本分類模型的效果。 主要存在兩類解決方案: (1)調整數據:數據增強處理,NLP中一般隨分詞后的詞序列進行隨機的打亂順序、丟棄某些詞匯然后分層的采樣的方式來構造新的樣本數據。

數據增強

(2)使用代價敏感函數:例如圖像識別中的Focal Loss等。

2.文本分類模型的泛化能力

首先,對於一個未知的樣本數據,分類模型只能給出分類標簽中的一個,無法解決不屬於分類標簽體系的樣本。

我們無法預知未來的數據會是什么樣的,也不能保證未來的所有分類情況在訓練集中都已經出現過!

剩下影響分類模型泛化能力的就是模型過擬合的問題了。

過擬合問題

如何防止過擬合?那就是老生常談的問題了: (1)數據上:交叉驗證 (2)模型上:使用DropOut、BatchNorm、正則項、Early Stop。

3.關於模型的上線方案:

1、基於Java的: 請參考: https://www.ioiogoo.cn/2018/04/03/java%E8%B0%83%E7%94%A8keras%E3%80%81tensorflow%E6%A8%A1%E5%9E%8B/ 2、基於Flask等python的web框架: 請參考:https://guillaumegenthial.github.io/serving.html

序列標注模型的上線

3、基於google官方的tensorflow Serving框架: 請參考:https://www.jianshu.com/p/c1cd2d127ae2 阿里的基於容器部署的方案:https://yq.aliyun.com/articles/60894?spm=a2c4e.11153959.blogcont60601.11.815eea72lw2ij

6.基於Text-CNN模型的中文文本分類Demo:

我從搜狗的開源的的新聞數據集(small版)中,選擇了兩個類別的數據:計算機與交通兩個類別,構建了一個中文文本二分類的數據集。

搜狗數據集的語料

實現文本二分類的Demo代碼以及腳本運行的說明放在GitHub中: https://github.com/x-hacker/CNN_ChineseTextBinaryClassify

以上就是簡單的介紹了NLP中文本分類所涉及的主要流程,並給出了一個中文文本二分類的Demo代碼。下面推薦一些拓展的資料,感興趣的童鞋可以繼續深入研究。

補充資源:


免責聲明!

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



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