李 悅,湯 鯤
(1.武漢郵電科學(xué)研究院,湖北武漢 430070;2.南京烽火天地通信科技有限公司,江蘇 南京 210019)
在當(dāng)今的大數(shù)據(jù)時(shí)代,政府進(jìn)行宏觀決策時(shí),常常需要參考各地市出臺(tái)的政策文件,然而現(xiàn)在各地市的政策文件分布雜亂,且類別不統(tǒng)一,目前市面上也并沒(méi)有把各地市的政策全部綜合起來(lái)的政策文本類數(shù)據(jù)集,而此類數(shù)據(jù)集為政府在宏觀決策時(shí)提供參考,基于此,文中構(gòu)建了一個(gè)大型綜合的全國(guó)各地市政策文本類數(shù)據(jù)集。其次,針對(duì)政策文本分類,目前市面上大都只進(jìn)行了單標(biāo)簽分類,而單標(biāo)簽分類顯然并不適用于政策文本的分類,用一個(gè)標(biāo)簽來(lái)概括整篇文本太籠統(tǒng),因此,文中對(duì)政策文本數(shù)據(jù)集進(jìn)行多標(biāo)簽分類。此外,在政策文本分類中,當(dāng)前普遍的思路是采用TF-IDF+SVM 分類算法[1]來(lái)構(gòu)建分類模型,或者使用BERT 進(jìn)行分類[2],效果都不佳。文中經(jīng)過(guò)實(shí)驗(yàn)驗(yàn)證了采用神經(jīng)網(wǎng)絡(luò)TextCNN 更適合進(jìn)行政策類長(zhǎng)文本的多標(biāo)簽分類。
TextCNN 模型可以并行處理,且自帶n-gram 屬性,訓(xùn)練速度和預(yù)測(cè)精度都比較理想,是一種非常優(yōu)秀的文本分類模型[3]。對(duì)于500 字以上長(zhǎng)度的長(zhǎng)文本,即使是LSTM 在這么長(zhǎng)的序列長(zhǎng)度上也難免梯度消失,而CNN 就不存在該問(wèn)題,TextCNN 不僅適合處理短文本,同樣也適合處理長(zhǎng)文本,該文待處理的政策文本即為長(zhǎng)文本。下面介紹了TextCNN 模型的原理。
1)Word Embedding
如圖1 所示,在TextCNN 中,首先將“這個(gè)青團(tuán)不錯(cuò),你嘗嘗”分詞成“這個(gè)/青團(tuán)/不錯(cuò)/,/你/嘗嘗”,通過(guò)Embedding 將每個(gè)詞映射成一個(gè)5 維詞向量(維度可任意)[4-5]。
圖1 Word Embedding
這步主要是為了將自然語(yǔ)言數(shù)值化,從而方便后續(xù)的處理??梢钥闯?,映射方式不同,最后結(jié)果不同。構(gòu)建完詞向量后,將所有的詞向量拼接成一個(gè)6×5 的二維矩陣,將其作為最初的輸入。
2)Convolution 卷積
這一步驟是將輸入詞向量矩陣與卷積核進(jìn)行卷積運(yùn)算操作,將“這個(gè)”/“青團(tuán)”/“不錯(cuò)”/“,”4 個(gè)詞語(yǔ)構(gòu)成的矩陣與卷積核分別對(duì)應(yīng)相乘再相加,可得到最終的Feature Map,這個(gè)步驟即為卷積[6],具體操作如圖2 所示。卷積操作后,輸入的6×5 的詞向量矩陣就被映射成了一個(gè)3×1 的矩陣,即Feature Map。
圖2 卷積
3)Pooling 池化
在得到Feature Map=[1,1,2]后,從中選取最大值‘2’作為輸出,便是max-pooling[7]。如果選擇平均池化(mean-pooling)[8],就是求平均值作為輸出。由此,最大池化在保持主要特征的情況下,極大地減少了參數(shù)的數(shù)目,加速了運(yùn)算,并降低了Feature Map的維度,同時(shí),也降低了過(guò)擬合的風(fēng)險(xiǎn)。
圖3 max-pooling
4)使用Softmax k 分類
接下來(lái)是將max-pooling的結(jié)果合并到一起,再送入Softmax 中,可以得到各個(gè)類別[9],如label 為1 和-1的概率,如圖4 所示。
圖4 Softmax
在做模型預(yù)測(cè)時(shí),使用TextCNN,此時(shí)要根據(jù)預(yù)測(cè)標(biāo)簽以及實(shí)際標(biāo)簽來(lái)計(jì)算損失函數(shù),分別計(jì)算出卷積核、max-pooling、Softmax 函數(shù)、激活函數(shù),這4 個(gè)函數(shù)中的各個(gè)參數(shù)需要更新的梯度,再依次更新這些參數(shù),即可完成一輪訓(xùn)練。
由于該文研究任務(wù)的特殊性,沒(méi)有現(xiàn)成的語(yǔ)料可以使用,所以需要構(gòu)建相應(yīng)的語(yǔ)料庫(kù)。其數(shù)據(jù)集來(lái)源于全國(guó)各個(gè)地市的政府政策公告文本信息的爬蟲(chóng)爬取,然后再對(duì)爬取的結(jié)果利用正則以及結(jié)合人工清洗的方式進(jìn)行數(shù)據(jù)的清洗,構(gòu)建數(shù)據(jù)庫(kù),將爬取并清洗后的數(shù)據(jù)入庫(kù),構(gòu)建政府政策文本語(yǔ)料庫(kù)。
文中所采用的數(shù)據(jù)均為網(wǎng)絡(luò)爬蟲(chóng)所得,先挑選出幾個(gè)所需字段,再對(duì)各個(gè)地市政府官網(wǎng)公開(kāi)的政策文本數(shù)據(jù)分別進(jìn)行采集,經(jīng)過(guò)簡(jiǎn)單清洗后整理入庫(kù)。
為了豐富數(shù)據(jù)庫(kù)的數(shù)據(jù)內(nèi)容,文中挑選的字段涵蓋了標(biāo)題、文本、適用對(duì)象、原文鏈接等。全部字段有:title 標(biāo)題、themeList 主題、styleName文體、levelName 層級(jí)、dispatchList_commonName 發(fā)文單位、targetList 適用對(duì)象、original_url 原文鏈接、publishTime 發(fā)文時(shí)間、industryList 適用行業(yè)、scaleList 適用規(guī)模、qx_content 內(nèi)容、classify_tag_list分類標(biāo)簽。
共爬取數(shù)據(jù)100 000 條,經(jīng)去重、去空,以及刪除過(guò)短文本后數(shù)據(jù)量為96 640 條。對(duì)數(shù)據(jù)進(jìn)行如下操作:
1)增加標(biāo)簽、篩掉無(wú)關(guān)類別的數(shù)據(jù)(和分類沒(méi)關(guān)系的字段)。
2)繁簡(jiǎn)轉(zhuǎn)換、清洗無(wú)意義字符。
3)人工打標(biāo),主要是對(duì)“其他”這個(gè)類別的數(shù)據(jù)進(jìn)行打標(biāo)。
4)構(gòu)建訓(xùn)練集和測(cè)試集,按照6∶2∶2 進(jìn)行劃分。
2.2.1 類別的構(gòu)建
由于爬取的數(shù)據(jù)集中,內(nèi)容的類別雜亂不統(tǒng)一,不利于后續(xù)進(jìn)一步利用該數(shù)據(jù)集,因此,對(duì)自建數(shù)據(jù)集中的“qx_content 內(nèi)容”字段進(jìn)行文本分類操作。
在類別的設(shè)定上,首先參考了國(guó)務(wù)院政策信息網(wǎng)的類別設(shè)定;另外,文中對(duì)數(shù)據(jù)集進(jìn)行TF-IDF+LDA 聚類[10],通過(guò)聚類得到了一些政策重點(diǎn)詞,針對(duì)這些政策重點(diǎn)詞,進(jìn)行類別的設(shè)定。最終,共擬定了47 種類別。全部類別為:產(chǎn)業(yè)發(fā)展、營(yíng)商環(huán)境、政務(wù)公開(kāi)、學(xué)校教育、人才引進(jìn)和能力培育、創(chuàng)新研發(fā)、復(fù)工復(fù)產(chǎn)、資質(zhì)認(rèn)定、稅收優(yōu)惠、節(jié)能環(huán)保、信息化建設(shè)、轉(zhuǎn)型升級(jí)、互聯(lián)網(wǎng)+、市場(chǎng)拓展、工程報(bào)建、企業(yè)創(chuàng)辦、穩(wěn)企穩(wěn)崗、醫(yī)療健康、金融財(cái)稅、平臺(tái)基地建設(shè)、知識(shí)產(chǎn)權(quán)、電子政務(wù)、成果轉(zhuǎn)化、數(shù)字政府、不動(dòng)產(chǎn)登記、科研課題、融資幫扶、三農(nóng)發(fā)展、租金減免、孵化器及基地建設(shè)、市場(chǎng)監(jiān)管、疫情扶持、緩繳社保、大數(shù)據(jù)、水電氣減免、招商引資、法律法規(guī)、數(shù)字經(jīng)濟(jì)、電子商務(wù)、品牌建設(shè)、數(shù)據(jù)治理、智慧城市、改制上市、并購(gòu)重組、一帶一路、區(qū)塊鏈、其他。
2.2.2 數(shù)據(jù)集示例
針對(duì)上文中的自建數(shù)據(jù)集,想要實(shí)現(xiàn)對(duì)每條數(shù)據(jù)進(jìn)行清洗、分詞后,對(duì)該條數(shù)據(jù)打上相應(yīng)分類標(biāo)簽的目的。樣本和標(biāo)簽的情況如下:
樣本是政策的文本內(nèi)容,標(biāo)簽是政策文本涉及到的類別,而每條政策涉及到的類別可能為多個(gè),所以需要進(jìn)行政策文本的多標(biāo)簽分類。所以訓(xùn)練模型的目的,是希望輸入政策文本數(shù)據(jù),輸出該政策涉及到的類別。數(shù)據(jù)集示例如圖5 所示。
圖5 數(shù)據(jù)集示例圖
1)定義Embedding 層
加載預(yù)訓(xùn)練詞向量,在自定義Embedding 層時(shí),將把詞向量矩陣加入其中。采用這種方法,可使詞向量矩陣在模型初始化時(shí)就加載好了??梢赃x擇詞向量在訓(xùn)練過(guò)程中凍結(jié)還是微調(diào)。如果選擇微調(diào),即freeze=False,能夠一定程度上提升效果,盡管訓(xùn)練速度會(huì)變慢[11]。
2)定義卷積層和池化層
如果卷積層的層數(shù)太淺,會(huì)無(wú)法捕捉長(zhǎng)距離的語(yǔ)義信息,從而不足以提取文本的特征,但是如果卷積層數(shù)太深,就會(huì)陷入梯度消失的境地[12]。為了便于提取長(zhǎng)文本中的句子特征,文中增加了卷積層數(shù)、更改了池化方式。
采用的池化為1/2 池化,在卷積之后,每經(jīng)過(guò)一個(gè)大小為3,步長(zhǎng)為2 的池化層,序列的長(zhǎng)度就被壓縮成了原來(lái)的一半。即同樣是size=3 的卷積核,每經(jīng)過(guò)一個(gè)1/2 池化層后,其能感知到的文本片段就比之前長(zhǎng)了一倍,解決了原TextCNN 模型中無(wú)法捕獲長(zhǎng)距離語(yǔ)義信息的問(wèn)題。
3)全連接層
該文對(duì)模型在全連接層處也進(jìn)行了修改,TextCNN 的原論文中,網(wǎng)絡(luò)結(jié)構(gòu)只有一個(gè)全連接層作為輸出層,且無(wú)激活函數(shù)。它是把卷積池化的結(jié)果拼接,然后進(jìn)行dropout 操作,再接輸出層。而該文在輸出層之前,又加了一個(gè)全連接層(激活函數(shù)為ReLU),將卷積池化的結(jié)果拼接,進(jìn)行dropout,加全連接層,再接上輸出層。這樣做的原因主要是網(wǎng)絡(luò)加深后,便于提取更豐富的特征。而且如果輸出的類別較少,那么輸出的維度劇烈降維的情況下,如直接從幾百維降到幾維,可能對(duì)分類的效果產(chǎn)生不好的影響。因此需要加一個(gè)全連接層來(lái)過(guò)渡。
4)輸出層
輸出層是線性層,不需要使用激活函數(shù)。后面的loss 函數(shù),將sigmoid 和計(jì)算binary loss 兩步同時(shí)進(jìn)行,這樣計(jì)算更有效率,也更穩(wěn)定,故不必加sigmoid函數(shù)得到概率。
文中經(jīng)改進(jìn)后的TextCNN 模型與原TextCNN 模型相比,有如下優(yōu)勢(shì):
基于傳統(tǒng)的TextCNN 模型,為了解決模型中無(wú)法捕捉長(zhǎng)距離語(yǔ)義信息的缺點(diǎn),該文加深了卷積深度,同時(shí)提出了等長(zhǎng)卷積和1/2 池化方式,使得卷積范圍增加。
另外,增加一個(gè)全連接層作為過(guò)渡,防止在輸出維度劇烈降維情況下,對(duì)分類效果產(chǎn)生的不利影響。
該文選擇采用海明損失[13](Hamming loss)和F1值[14](宏平均和微平均)作為主要指標(biāo)來(lái)評(píng)估模型的性能。關(guān)于宏平均和微平均:如果每個(gè)class 的樣本數(shù)量相差不大,那么宏平均和微平均差異也不大。如果每個(gè)class 的樣本數(shù)量相差較大并且想更注重樣本量多的class,就使用微平均;更注重樣本量少的class,就使用宏平均。如果微平均遠(yuǎn)低于宏平均,則應(yīng)該去檢查樣本量多的class。如果宏平均遠(yuǎn)低于微平均,則應(yīng)該去檢查樣本量少的class[15]。這里可直接用sklearn 函數(shù)來(lái)計(jì)算。對(duì)于每一個(gè)預(yù)測(cè)樣本,需要47 個(gè)類別的每一個(gè)類別都預(yù)測(cè)正確,才能算該樣本預(yù)測(cè)正確,其難度太大,并不適合用于評(píng)價(jià)模型的效果,該文需要分類的共有47 個(gè)類別,如果部分類別可以預(yù)測(cè)正確的話,模型也是可以用的。在模型的訓(xùn)練過(guò)程中,如果監(jiān)控到驗(yàn)證集上的F1 值有提升,那么會(huì)在測(cè)試集上做一次評(píng)估,同時(shí)保存模型。
多標(biāo)簽分類的損失函數(shù)不再是多分類的crossentropy loss,而是binary cross-entropy loss。具體實(shí)現(xiàn)的函數(shù)為:criterion=nn.BCEWithLogitsLoss (pos_weight=config.class_weights)[16]
該函數(shù)將模型的輸出做sigmoid,然后計(jì)算損失。pos_weights 這個(gè)關(guān)鍵字參數(shù),用于傳入類別的權(quán)重,引入該參數(shù)緩解類別不平衡的問(wèn)題,這里只在訓(xùn)練時(shí)傳入,驗(yàn)證和測(cè)試時(shí)不用。
1)實(shí)驗(yàn)環(huán)境
該實(shí)驗(yàn)的運(yùn)行環(huán)境為:tensorflow-gpu=1.12.0、keras=2.2.4、python3.6、Scikit-learn=0.21.3、Torch=1.1.0。
2)實(shí)驗(yàn)參數(shù)
在config 類中,配置好相關(guān)的參數(shù),如文件路徑、模型的各個(gè)參數(shù)等。其他一些需要通過(guò)計(jì)算得到的模型參數(shù),在數(shù)據(jù)處理過(guò)程中添加,如輸入的最大長(zhǎng)度、類別數(shù)、詞表的尺寸等。該文設(shè)置的部分參數(shù)如下:
①batch size=128;
②學(xué)習(xí)率=1e-3;
③百度百科詞向量維度=300;
④卷積核尺寸=[2,3,4,5];
⑤卷積核數(shù)量=128;
首先數(shù)值化樣本及標(biāo)簽,在配置參數(shù)初始化后,依次完成文本的清洗和分詞,確定輸入的最大長(zhǎng)度,對(duì)樣本進(jìn)行zero pad,轉(zhuǎn)化為id,對(duì)標(biāo)簽進(jìn)行數(shù)值化,以及構(gòu)建詞表等操作。數(shù)值化后的標(biāo)簽每一位是0或1,類別數(shù)是列數(shù),標(biāo)簽的類別數(shù)為47,也就是TextCNN 的輸出維度為47。在數(shù)值化樣本及標(biāo)簽后,加載百度百科詞向量。針對(duì)類別不平衡問(wèn)題,該文的數(shù)據(jù)集多標(biāo)簽類別有47 個(gè),經(jīng)過(guò)統(tǒng)計(jì)分析,每個(gè)類別之間數(shù)量差別巨大,存在比較嚴(yán)重的類別不平衡問(wèn)題。通過(guò)計(jì)算各個(gè)類別的權(quán)重,來(lái)計(jì)算加權(quán)的loss。對(duì)于數(shù)量較多的類別,給予較小的權(quán)重,數(shù)量較少的類別,權(quán)重較大,以期能緩解多標(biāo)簽的類別不平衡問(wèn)題。
該節(jié)測(cè)試基本的多標(biāo)簽貝葉斯分類算法MLNB、多標(biāo)簽分類KNN 算法ML-KNN,以及RoBERTa算法與文中改進(jìn)過(guò)的TextCNN 模型之間的性能對(duì)比。該選擇將以上各個(gè)算法在該文的自建數(shù)據(jù)集上進(jìn)行測(cè)試運(yùn)行對(duì)比,結(jié)果如表1 所示。
表1 實(shí)驗(yàn)結(jié)果對(duì)比
在該文的自建數(shù)據(jù)集上,TextCNN 模型在主要的性能指標(biāo)上超過(guò)了所有其他模型,達(dá)到了較好的效果。F1-micro 的值分別比RoBERTa、ML-KNN、ML-NB 高出了3.19,8.68,5.84 個(gè)百分點(diǎn)。
該文首先介紹并構(gòu)建了一個(gè)全新的全國(guó)政策文本類的數(shù)據(jù)集,通過(guò)爬蟲(chóng)來(lái)獲取全國(guó)各個(gè)地市的政策文本數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行預(yù)處理后,構(gòu)建訓(xùn)練集、驗(yàn)證集和測(cè)試集。后在自建數(shù)據(jù)集上進(jìn)行基于TextCNN 的多標(biāo)簽分類任務(wù)。最后通過(guò)改進(jìn)過(guò)的TextCNN 神經(jīng)網(wǎng)絡(luò)來(lái)訓(xùn)練模型對(duì)數(shù)據(jù)進(jìn)行多標(biāo)簽分類,經(jīng)過(guò)實(shí)驗(yàn)對(duì)比測(cè)試,經(jīng)過(guò)改進(jìn)后的TextCNN 結(jié)合百度百科詞向量在自建數(shù)據(jù)集上達(dá)到了較好的分類效果。
當(dāng)然,該文在研究過(guò)程中仍然有不足之處,比如文中自建數(shù)據(jù)集里的政策數(shù)據(jù)是多標(biāo)簽文本,存在一定程度上的標(biāo)簽類別不平衡的問(wèn)題,雖然使用權(quán)重在一定程度上緩解了類別不平衡的問(wèn)題,但權(quán)重應(yīng)用的效果并不是很好,這部分內(nèi)容待優(yōu)化。未來(lái)將在該方面繼續(xù)進(jìn)行研究。