卷積神經(jīng)網(wǎng)絡CNN的文本分類原理和實戰(zhàn)

基于卷積神經(jīng)網(wǎng)絡CNN的文本分類原理和實戰(zhàn)

前言

本文介紹了CNN在NLP中的應用:文本分類鸟缕。

文本分類:是自然語言處理領域最活躍的研究方向之一,目前文本分類在工業(yè)界的應用場景非常普遍蜕径,從新聞的分類、商品評論信息的情感分類到微博信息打標簽輔助推薦系統(tǒng)败京,
卷積神經(jīng)網(wǎng)絡:主要用來做圖片分類兜喻、目標檢測等圖像相關的任務,

文本的預處理

文本的預處理赡麦,主要針對剔除無意義的符號信息朴皆,或其它的冗余信息。

  • 在使用爬蟲獲取的語料集上可能存在一些html標簽泛粹,這些符號對于文本分類任務來說應該是冗余的無意義信息遂铡,可以剔除掉。

  • 分詞:針對中文戚扳、日語等無空格切分字詞的語言忧便,還需要進行分詞處理,將一段文本序列劃分為合理的詞(字)序列帽借。
    英文中天生的就有空格把每個詞匯分割開來珠增,所以不需要分詞操作,但由于英文存在時態(tài)砍艾、縮寫等問題蒂教,在預處理階段會有詞干提取、詞性還原脆荷、大小寫轉換等凝垛。

  • 去除停用詞。

  • shuffle打亂數(shù)據(jù)集

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

分詞工具

中文分詞性能對比可以參考

文本的數(shù)值化

文本的數(shù)值化,即使用數(shù)字代表特定的詞匯虽界,因為計算機無法直接處理人類創(chuàng)造的詞匯汽烦。為了讓計算機能夠理解詞匯,我們需要將詞匯信息映射到一個數(shù)值化的語義空間中莉御,這個語義空間我們可以稱之為詞向量空間(詞向量模型)撇吞。
文本的數(shù)值化方式有很多種,例如:TF-IDF礁叔、BOW牍颈、One-Hot、分布式的表示方式(word2vec琅关、Glove)等煮岁。

一般常用的就是最經(jīng)典的word2vec工具,word2vec工具涣易,它是一種無監(jiān)督的學習模型画机,主要思想是“具有相似鄰近詞分布的中心詞之之間具有一定的語義相似度”),實現(xiàn)詞匯信息到語義空間的映射新症,最終獲得一個詞向量模型(每個詞匯對應一個指定維度的數(shù)組)步氏。

python 中使用word2vec工具很多,建議使用Gensim徒爹,通過pip install gensim安裝gensim工具包荚醒。
Gensim官網(wǎng):https://radimrehurek.com/gensim/models/word2vec.html

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


243af7b3-e079-4da8-83c4-1dbe3e039b38.png

文本分類模型

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


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

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

卷積神經(jīng)網(wǎng)絡(CNN)的特點:
sparse interaction(稀疏的交互)
parameter sharing(參數(shù)共享)
equivalent respresentation(等價表示)。
針對海量的文本多分類數(shù)據(jù)导街,也可以嘗試一下淺層的深度學習模型FastText模型披泪,該模型的分類效率更高。

Kim提出的經(jīng)典Text-CNN模型的整體網(wǎng)絡架構如圖所示搬瑰,
整個模型由四部分構成:輸入層款票、卷積層、池化層泽论、全連接層艾少。

輸入層(詞嵌入層):

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的方向更新輸入層的各個詞匯對應的詞向量荆秦。

注意事項
1,CNN輸入層是大小固定的力图,所以對于不同文本步绸,找出最大的文本序列,其他的進行填補吃媒;
2瓤介,詞向量要經(jīng)過大規(guī)模數(shù)據(jù)進行訓練吕喘;

卷積層:

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

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

注意事項
1钮热,CNN在文本分類中,卷積核的寬度和詞向量的寬度一樣烛芬,只做一緯滑隧期;
2,CNN的卷積就是對應相乘求和赘娄,不需要翻轉仆潮,和信號處理卷積不同;
3遣臼,卷積層包括卷積操作和非線性激活函數(shù)性置,圖中f()函數(shù)就是非線性激活函數(shù);
4揍堰,卷積核有多個鹏浅,卷積核的參數(shù)是通過訓練得到的;

池化層:

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

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

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

全連接層:

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

CNN的結構:(卷積+非線性激活函數(shù)(Relu或tanh)+池化層)× n + 幾個全連接層曲掰;
深度CNN網(wǎng)絡:幾個卷積層+幾個全連接層

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

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

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

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

TensorFlow實現(xiàn)CNN文本分類

github代碼载绿,預訓練詞向量下載地址:https://nlp.stanford.edu/projects/glove/, 我用的是400,000個詞匯的300維Glove詞向量油航。

下面是tensorflow中卷積和池化的函數(shù)崭庸,拿出來講解一下。

tf.nn.conv2d
tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu=None,name=None)

參數(shù):
>>>>input:
一個Tensor谊囚,每個元素的數(shù)據(jù)類型必須為float32或float64怕享。
input的形狀:[batch, in_height, in_width, in_channels],
batch為訓練過程中每迭代一次迭代數(shù)據(jù)條數(shù)。
in_height, in_width分別為矩陣(圖片)的高和寬
in_channels為矩陣(圖片)的通道语盈,比如圖片可以有RGB三通道贝润。
即輸入:(句子個數(shù), 句子長度, embedding尺寸, 通道數(shù))

>>>>filter:
卷積核,也是一個Tensor跌帐,元素類型和input類型一致首懈。
filter的形狀:[filter_height, filter_width, in_channels, out_channels]
(其中out_channels也是該卷積核的個數(shù))。
參數(shù)分別為卷積核的高谨敛,寬究履,輸入的channels和輸出的channels
卷積核:(卷積核尺寸, embedding尺寸, 通道數(shù), 卷積核個數(shù))

>>>>stride:
步長,長度為4的list脸狸,元素類型為int最仑。表示每一維度滑動的步長。其中strides[0] = strides[3] = 1炊甲。strides[1]和strides[2]分別表示在hight和width方向的步長泥彤。

>>>>padding:
可選參數(shù)為"SAME", “VALID”。
SAME表示填充卿啡,VALID不填充吟吝。

>>>>use_cudnn_on_gpu:
bool類型,有True和False兩種選擇牵囤。

>>>>name:
此操作的名字

tf.nn.max_pool
池化

tf.nn.max_pool(value, ksize, strides, padding, name=None)
參數(shù)和卷積很類似:
value:需要池化的輸入爸黄,池化層通常跟在卷積層后面,所以輸入的shape依然是[batch, hei ght, width, channels]揭鳞。

ksize:池化窗口的大小炕贵,四維向量,一般是[1, height, width, 1]野崇,前后兩個1對應的是batch和channels称开,都不池化所以為1

strides:步長,和卷積一樣乓梨,前后都為1鳖轰,中間兩個分表表示窗口在每一個維度上滑動的步長,shape:[1, stride,stride, 1]

padding:‘VALID’ 或’SAME’

返回:一個Tensor扶镀,類型不變蕴侣,shape仍然是[batch, height, width, channels]這種形式

結論

CNN-static和CNN-non-static效果差不多,也就是說詞向量經(jīng)過預訓練的效果不錯臭觉。

關于模型的上線方案:

基于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.reibang.com/p/c1cd2d127ae2
阿里的基于容器部署的方案:https://yq.aliyun.com/articles/60894?spm=a2c4e.11153959.blogcont60601.11.815eea72lw2ij

補充資料

下面推薦一些拓展的資料蝠筑,感興趣的童鞋可以繼續(xù)深入研究狞膘。
各種文本分類模型的實例代碼:https://github.com/brightmart/text_classification
中文文本分類對比:https://github.com/Edward1Chou/Textclassification
CNN-RNN中文文本分類,基于TensorFlow :https://github.com/gaussic/text-classification-cnn-rnn

參考

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末什乙,一起剝皮案震驚了整個濱河市挽封,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌臣镣,老刑警劉巖辅愿,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件智亮,死亡現(xiàn)場離奇詭異,居然都是意外死亡点待,警方通過查閱死者的電腦和手機鸽素,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亦鳞,“玉大人,你說我怎么就攤上這事棒坏⊙嗖睿” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵坝冕,是天一觀的道長徒探。 經(jīng)常有香客問我,道長喂窟,這世上最難降的妖魔是什么测暗? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮磨澡,結果婚禮上碗啄,老公的妹妹穿的比我還像新娘。我一直安慰自己稳摄,他們只是感情好稚字,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厦酬,像睡著了一般胆描。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仗阅,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天昌讲,我揣著相機與錄音,去河邊找鬼减噪。 笑死短绸,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的旋廷。 我是一名探鬼主播鸠按,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饶碘!你這毒婦竟也來了目尖?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扎运,失蹤者是張志新(化名)和其女友劉穎瑟曲,沒想到半個月后饮戳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡洞拨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年扯罐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烦衣。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡歹河,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出花吟,到底是詐尸還是另有隱情秸歧,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布衅澈,位于F島的核電站键菱,受9級特大地震影響,放射性物質發(fā)生泄漏今布。R本人自食惡果不足惜经备,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望部默。 院中可真熱鬧侵蒙,春花似錦、人聲如沸傅蹂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贬派。三九已至急但,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搞乏,已是汗流浹背波桩。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留请敦,地道東北人镐躲。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像侍筛,于是被迫代替她去往敵國和親萤皂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容