吾愛NLP(4)—基于Text-CNN模型的中文文本分類實戰(zhàn)

深度學習在文本分類中的鼻祖-TextCNN

1.文本分類

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

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

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

文本分類

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

2.數(shù)據(jù)準備

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

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

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

機器學習VS傳統(tǒng)編程

換言之,傳統(tǒng)的編程方式輸入的是指令代碼,而機器學習輸入的是結構化數(shù)據(jù)

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

常言道:Garbage in, garbage out!

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

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

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


收藏數(shù)據(jù)集第一,比賽名次第二......

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

3.文本的預處理

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

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

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

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

文本預處理

推薦閱讀:
中文分詞原理【http://www.lxweimin.com/p/6c085bf1086f
JieBa的GitHub官網(wǎng):https://github.com/fxsjy/jieba

3.文本的數(shù)值化【詞向量技術】

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

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

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

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

兩種模型兩種優(yōu)化方式

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

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

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

Gensim官網(wǎng):https://radimrehurek.com/gensim/models/word2vec.html

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

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


詞向量

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


數(shù)據(jù)處理流程

4.文本分類模型

文本分類模型,可以大體上分為基于傳統(tǒng)機器學習的文本分類模型,基于深度學習的文本分類模型,目前基于深度學習模型的文本分類模型已經(jīng)成為了主流,下面基于CNN的文本分類模型。

深度學習的優(yōu)勢

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

文本分類模型

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

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

tensorflow全家桶

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

文本分類技術路線

目前深度學習在NLP的文本分類任務中已經(jīng)具有比較廣泛的探究,其中經(jīng)典的深度學習模型結構有以下三種:


三種經(jīng)典基于深度學習的文本分類模型

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

卷積神經(jīng)網(wǎng)絡(CNN)的特點:

CNN的三個優(yōu)點:

  1. sparse interaction(稀疏的交互)
  2. parameter sharing(參數(shù)共享)
  3. equivalent respresentation(等價表示)。

經(jīng)典的簡化卷積公式表示如下:


CNN中的卷積操作的計算公式

假設每個詞用三維向量表示,左邊是4個詞,右邊是卷積矩陣,那么得到輸出為:

卷積層的輸出

如果基于這個結果做1-MaxPool池化(最大值池化),那么就取卷積層結果 o 中的最大值,即提取最顯著的特征。

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

Text-CNN模型結構

Kim提出的經(jīng)典Text-CNN模型的整體網(wǎng)絡架構如圖所示,如果你學習過CNN或者CNN在圖像中的使用,應該很容易就理解,因為該模型就是一個最簡單、基礎的CNN網(wǎng)絡結構。

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

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

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

對于輸入層輸入的詞向量的表達方式,Text-CNN模型的作者Kim在論文中也分析了幾個變種的方式:
1.static(靜態(tài)詞向量)
使用預訓練的詞向量,即利用word2vec、fastText或者Glove等詞向量工具,在開放領域數(shù)據(jù)上進行無監(jiān)督的學習,獲得詞匯的具體詞向量表示方式,拿來直接作為輸入層的輸入,并且在TextCNN模型訓練過程中不再調整詞向量, 這屬于遷移學習在NLP領域的一種具體的應用。
2.non-static(非靜態(tài)詞向量)
預訓練的詞向量+ 動態(tài)調整 , 即拿word2vec訓練好的詞向量初始化, 訓練過程中再對詞向量進行微調。
3.multiple channel(多通道)
借鑒圖像中的RGB三通道的思想, 這里也可以用 static 與 non-static 兩種詞向量初始化方式來搭建兩個通道。
4.CNN-rand(隨機初始化)
指定詞向量的維度embedding_size后,文本分類模型對不同單詞的向量作隨機初始化, 后續(xù)有監(jiān)督學習過程中,通過BP的方向更新輸入層的各個詞匯對應的詞向量。

2.卷積層:

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

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

卷積層

3.池化層:

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

池化層

池化層除了最大值池化之外,也有論文討論過 Top K最大值池化,即選取每一個卷積層輸出的Top k個最大值作為池化層的輸出。

卷積層與池化層在分類模型的核心作用就是特征提取的功能,從輸入的定長文本序列中,利用局部詞序信息,提取初級的特征,并組合初級的特征為高級特征,通過卷積與池化操作,省去了傳統(tǒng)機器學習中的特征工程的步驟。
但TextCNN的一個明顯缺點就是,卷積、池化操作丟失了文本序列中的詞匯的順序、位置信息,比較難以捕獲文本序列中的否定、反義等語義信息。

4.全連接層:

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

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

5.模型的效果評估與調優(yōu)

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

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

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

文本分類中經(jīng)常遇到的問題:

1.數(shù)據(jù)集類別不均衡

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

數(shù)據(jù)增強

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

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

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

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

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


過擬合問題

如何防止過擬合?那就是老生常談的問題了:
(1)數(shù)據(jù)上:交叉驗證
(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框架:
請參考:http://www.lxweimin.com/p/c1cd2d127ae2
阿里的基于容器部署的方案:https://yq.aliyun.com/articles/60894?spm=a2c4e.11153959.blogcont60601.11.815eea72lw2ij

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

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

搜狗數(shù)據(jù)集的語料

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

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

補充資源:
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容