基于Text-CNN模型的中文文本分類實(shí)戰(zhàn)

1 文本分類

文本分類是自然語(yǔ)言處理領(lǐng)域最活躍的研究方向之一,目前文本分類在工業(yè)界的應(yīng)用場(chǎng)景非常普遍,從新聞的分類、商品評(píng)論信息的情感分類到微博信息打標(biāo)簽輔助推薦系統(tǒng),了解文本分類技術(shù)是NLP初學(xué)者比較好的切入點(diǎn),較簡(jiǎn)單且應(yīng)用場(chǎng)景高頻。

文本分類

2 數(shù)據(jù)準(zhǔn)備

數(shù)據(jù)決定了模型最終的高度,不斷優(yōu)化的模型只不過是為了不斷逼近這個(gè)高度而已。

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

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

機(jī)器學(xué)習(xí) VS 傳統(tǒng)編程

傳統(tǒng)的編程方式輸入的是指令代碼,而機(jī)器學(xué)習(xí)輸入的是結(jié)構(gòu)化數(shù)據(jù)。

因此,在機(jī)器學(xué)習(xí)任務(wù)中,數(shù)據(jù)的質(zhì)量與數(shù)量對(duì)最終模型的預(yù)測(cè)結(jié)果好壞具有決定性的作用。

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

語(yǔ)料集的質(zhì)量:即數(shù)據(jù)集的特征X對(duì)應(yīng)的標(biāo)簽Y是否標(biāo)記的正確,一般在眾包平臺(tái)中會(huì)采用多人重復(fù)標(biāo)記,然后基于投票的機(jī)制來(lái)控制語(yǔ)料集的標(biāo)記質(zhì)量。

語(yǔ)料集的數(shù)量:有監(jiān)督語(yǔ)料集的標(biāo)注復(fù)雜度,想要獲得海量的高質(zhì)量語(yǔ)料集的成本是十分高昂的,這也限制的語(yǔ)料集的數(shù)量。

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

搜狗的新聞?wù)Z料集:http://www.sogou.com/labs/resource/cs.php

3 文本的預(yù)處理

文本的預(yù)處理,主要針對(duì)剔除無(wú)意義的符號(hào)信息,或其它的冗余信息。

例如,在使用爬蟲獲取的語(yǔ)料集上可能存在一些html標(biāo)簽,這些符號(hào)對(duì)于文本分類任務(wù)來(lái)說應(yīng)該是冗余的無(wú)意義信息,可以剔除掉。

針對(duì)中文、日語(yǔ)等無(wú)空格切分字詞的語(yǔ)言,還需要進(jìn)行分詞處理,將一段文本序列劃分為合理的詞(字)序列。

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

去除停用詞。

中文分詞的工具有非常多的方案,我一般習(xí)慣于使用Python版的JieBa分詞工具包來(lái)進(jìn)行分詞的操作,使用非常的簡(jiǎn)單,使用pip install jieba就可以很方便的安裝該工具包,jieba常用的API可以查看GitHub主頁(yè)的實(shí)例。

分詞工具:

中科院計(jì)算所NLPIRhttp://ictclas.nlpir.org/nlpir/

ansj分詞器https://github.com/NLPchina/ansj_seg

哈工大的LTPhttps://github.com/HIT-SCIR/ltp

清華大學(xué)THULAChttps://github.com/thunlp/THULAC

斯坦福分詞器,Java實(shí)現(xiàn)的CRF算法。https://nlp.stanford.edu/software/segmenter.shtml

Hanlp分詞器,求解的是最短路徑。https://github.com/hankcs/HanLP

結(jié)巴分詞,基于前綴詞典,生成句子中所有可能成詞所構(gòu)成的有向無(wú)環(huán)圖 (DAG),采用動(dòng)態(tài)規(guī)劃查找最大概率路徑, 找出基于詞頻的最大切分組合,對(duì)于未登錄詞,采用了 HMM 模型,使用 Viterbi 算法。https://github.com/yanyiwu/cppjieba

KCWS分詞器(字嵌入+Bi-LSTM+CRF),本質(zhì)上是序列標(biāo)注。https://github.com/koth/kcws

ZParhttps://github.com/frcchang/zpar/releases

IKAnalyzerhttps://github.com/wks/ik-analyzer

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

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

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

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

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

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

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

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

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

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

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

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

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

5 文本分類模型

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

深度學(xué)習(xí)的優(yōu)劣

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

文本分類模型

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

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

tensorflow 框架
文本分類技術(shù)路線

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

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

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

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

CNN的三個(gè)優(yōu)點(diǎn):

sparse interaction(稀疏的交互)

parameter sharing(參數(shù)共享)

equivalent respresentation(等價(jià)表示)。

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

CNN中的卷積操作的計(jì)算公式

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

卷積層的輸出

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

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

Kim提出的經(jīng)典Text-CNN模型的整體網(wǎng)絡(luò)架構(gòu)如圖所示,如果你學(xué)習(xí)過CNN或者CNN在圖像中的使用,應(yīng)該很容易就理解,因?yàn)樵撃P途褪且粋€(gè)最簡(jiǎn)單、基礎(chǔ)的CNN網(wǎng)絡(luò)結(jié)構(gòu)。

整個(gè)模型由四部分構(gòu)成:輸入層、卷積層、池化層、全連接層。

Text-CNN

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

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

對(duì)于輸入層輸入的詞向量的表達(dá)方式,Text-CNN模型的作者Kim在論文中也分析了幾個(gè)變種的方式:

1.static(靜態(tài)詞向量)

使用預(yù)訓(xùn)練的詞向量,即利用word2vec、fastText或者Glove等詞向量工具,在開放領(lǐng)域數(shù)據(jù)上進(jìn)行無(wú)監(jiān)督的學(xué)習(xí),獲得詞匯的具體詞向量表示方式,拿來(lái)直接作為輸入層的輸入,并且在TextCNN模型訓(xùn)練過程中不再調(diào)整詞向量, 這屬于遷移學(xué)習(xí)在NLP領(lǐng)域的一種具體的應(yīng)用。

2.non-static(非靜態(tài)詞向量)

預(yù)訓(xùn)練的詞向量+ 動(dòng)態(tài)調(diào)整 , 即拿word2vec訓(xùn)練好的詞向量初始化, 訓(xùn)練過程中再對(duì)詞向量進(jìn)行微調(diào)。

3.multiple channel(多通道)

借鑒圖像中的RGB三通道的思想, 這里也可以用 static 與 non-static 兩種詞向量初始化方式來(lái)搭建兩個(gè)通道。

4.CNN-rand(隨機(jī)初始化)

指定詞向量的維度embedding_size后,文本分類模型對(duì)不同單詞的向量作隨機(jī)初始化, 后續(xù)有監(jiān)督學(xué)習(xí)過程中,通過BP的方向更新輸入層的各個(gè)詞匯對(duì)應(yīng)的詞向量。

2.卷積層:

在NLP領(lǐng)域一般卷積核只進(jìn)行一維的滑動(dòng),即卷積核的寬度與詞向量的維度等寬,卷積核只進(jìn)行一維的滑動(dòng)。

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

卷積層

3.池化層:

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

池化層

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

卷積層與池化層在分類模型的核心作用就是提取特征,從輸入的定長(zhǎng)文本序列中,利用局部詞序信息,提取初級(jí)的特征,并組合初級(jí)的特征為高級(jí)特征,通過卷積與池化操作,省去了傳統(tǒng)機(jī)器學(xué)習(xí)中的特征工程的步驟。

但TextCNN的一個(gè)明顯缺點(diǎn)就是,卷積、池化操作丟失了文本序列中的詞匯的順序、位置信息,比較難以捕獲文本序列中的否定、反義等語(yǔ)義信息。

4.全連接層:

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

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

6 模型的效果評(píng)估與調(diào)優(yōu)

針對(duì)分類問題,一般可以使用準(zhǔn)確率、召回率、F1值、混淆矩陣等指標(biāo),在文本多標(biāo)簽分類中一般還會(huì)考慮標(biāo)簽的位置加權(quán)等問題。

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

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

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

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

即語(yǔ)料集中,各個(gè)類別下的樣本數(shù)量差異較大,會(huì)影響最終文本分類模型的效果。

主要存在兩類解決方案:

(1)調(diào)整數(shù)據(jù):數(shù)據(jù)增強(qiáng)處理,NLP中一般隨分詞后的詞序列進(jìn)行隨機(jī)的打亂順序、丟棄某些詞匯然后分層的采樣的方式來(lái)構(gòu)造新的樣本數(shù)據(jù)。

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

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

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

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

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

如何防止過擬合?那就是老生常談的問題了:

(1)數(shù)據(jù)上:交叉驗(yàn)證

(2)模型上:使用DropOut、BatchNorm、正則項(xiàng)、Early Stop。

3.關(guān)于模型的上線方案:

1、基于Java的:

請(qǐng)參考: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框架:

請(qǐng)參考:https://guillaumegenthial.github.io/serving.html

3、基于google官方的tensorflow Serving框架:

請(qǐng)參考:http://www.itdecent.cn/p/c1cd2d127ae2

阿里的基于容器部署的方案:https://yq.aliyun.com/articles/60894?spm=a2c4e.11153959.blogcont60601.11.815eea72lw2ij

8 基于Text-CNN模型的中文文本分類Demo

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

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

實(shí)現(xiàn)文本二分類的Demo代碼以及腳本運(yùn)行的說明放在GitHub中:https://github.com/yongfengxuemei/NLP/tree/master/CNN_ChineseTextBinaryClassify

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

補(bǔ)充資源:

各種文本分類模型的實(shí)例代碼:https://github.com/brightmart/text_classification

中文文本分類對(duì)比:https://github.com/Edward1Chou/Textclassification

CNN-RNN中文文本分類,基于TensorFlow :https://github.com/gaussic/text-classification-cnn-rnn

9 Window上跑的效果

訓(xùn)練
訓(xùn)練
測(cè)試
測(cè)試
prediction.csv

10 參考

中文分詞常用方法簡(jiǎn)述:http://www.itdecent.cn/p/6c085bf1086f

吾愛NLP(4)—基于Text-CNN模型的中文文本分類實(shí)戰(zhàn):http://www.itdecent.cn/p/f69e8a306862

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.文本分類 轉(zhuǎn)眼學(xué)生生涯就結(jié)束了,在家待就業(yè)期間正好有一段空閑期,可以對(duì)曾經(jīng)感興趣的一些知識(shí)點(diǎn)進(jìn)行總結(jié)。 本文介...
    流川楓AI閱讀 35,907評(píng)論 23 76
  • 前面的文章主要從理論的角度介紹了自然語(yǔ)言人機(jī)對(duì)話系統(tǒng)所可能涉及到的多個(gè)領(lǐng)域的經(jīng)典模型和基礎(chǔ)知識(shí)。這篇文章,甚至之后...
    我偏笑_NSNirvana閱讀 14,424評(píng)論 2 64
  • 第一次在紹興坐brt哈哈
    PWong閱讀 278評(píng)論 0 0
  • 1.走動(dòng)速度和跑動(dòng)速度 目標(biāo):1.跑動(dòng)動(dòng)畫和走動(dòng)動(dòng)畫速度倍率匹配2.動(dòng)畫和真實(shí)速度匹配3.通過一個(gè)值,可以同時(shí)修改...
    持刀的要遲到了閱讀 273評(píng)論 0 0
  • 93年小學(xué)畢業(yè)時(shí),我幸運(yùn)地考入了地區(qū)最好的重點(diǎn)中學(xué)。開學(xué)第一天,一個(gè)唇紅齒白、眉清目秀的戴眼鏡的女孩子便引起了我的...
    橡柳閱讀 1,381評(píng)論 25 29

友情鏈接更多精彩內(nèi)容