廣告行業(yè)中那些趣事系列7:實(shí)戰(zhàn)騰訊開(kāi)源的文本分類(lèi)項(xiàng)目NeuralClassifier

摘要:本篇主要分享騰訊開(kāi)源的文本分類(lèi)項(xiàng)目NeuralClassifier。雖然實(shí)際項(xiàng)目中使用BERT進(jìn)行文本分類(lèi),但是在不同的場(chǎng)景下我們可能還需要使用其他的文本分類(lèi)算法,比如TextCNN、RCNN等等。通過(guò)NeuralClassifier開(kāi)源項(xiàng)目我們可以方便快捷的使用這些模型。本篇并不會(huì)重點(diǎn)剖析某個(gè)算法,而是從整體的角度使用NeuralClassifier開(kāi)源工程,更多的是以算法庫(kù)的方式根據(jù)不同的業(yè)務(wù)場(chǎng)景為我們靈活的提供文本分類(lèi)算法。
目錄
01 不僅僅是BERT
02 騰訊開(kāi)源文本分類(lèi)項(xiàng)目NeuralClassifier
03 第一步先跑通它
04 改造成我們的基于中文的多分類(lèi)任務(wù)
總結(jié)
01 不僅僅是BERT
之前說(shuō)過(guò)BERT是NLP領(lǐng)域中具有里程碑意義的成果,具有效果好和應(yīng)用范圍廣的優(yōu)點(diǎn)。雖然實(shí)際項(xiàng)目中我們主要使用BERT來(lái)做文本分類(lèi)任務(wù),但是在不同的場(chǎng)景下我們可能還需要使用其他的文本分類(lèi)算法。除此之外,我們不能僅僅只會(huì)用BERT,還需要掌握一些BERT出現(xiàn)之前的文本分類(lèi)算法,能更好的幫助我們了解文本分類(lèi)任務(wù)背景下模型的發(fā)展歷史。
BERT之前主要用于文本分類(lèi)的模型有TextCNN、RCNN、FastText等,這些模型也擁有各自的優(yōu)點(diǎn)。充分了解這些模型各自的優(yōu)缺點(diǎn),才能在不同的場(chǎng)景下更好的使用這些模型。
之前看到騰訊開(kāi)源了一個(gè)文本分類(lèi)開(kāi)源項(xiàng)目NeuralClassifier,里面集成了很多算法,其中就包括上面說(shuō)的TextCNN、RCNN、FastText等。所以想基于該開(kāi)源項(xiàng)目進(jìn)行二次開(kāi)發(fā)以便后續(xù)用于實(shí)際項(xiàng)目中。
02 騰訊開(kāi)源文本分類(lèi)項(xiàng)目NeuralClassifier
本篇的重點(diǎn)是講解NeuralClassifier開(kāi)源項(xiàng)目, 項(xiàng)目的github地址如下:
https://github.com/Tencent/NeuralNLP-NeuralClassifier
1. 項(xiàng)目整體架構(gòu)
項(xiàng)目整體架構(gòu)如下圖所示:

圖1 項(xiàng)目整體架構(gòu)圖
從下往上依次查看,最下面是輸入的語(yǔ)句,因?yàn)樵柬?xiàng)目中主要是針對(duì)英文分類(lèi),所以輸入的句子序列是一系列詞,這是主要識(shí)別的文本,所以是必須要有的。可選的輸入是文本是否有關(guān)鍵詞或者主題;
然后是Input Layer,這里可能是詞、詞的組合、字符和字符的組合等。如果有關(guān)鍵詞或者主題也會(huì)作為特征進(jìn)入模型;
接著是Embedding Layer,這里可以使用不同的Embedding方式,包括預(yù)訓(xùn)練編碼、隨機(jī)編碼、位置編碼等等;
然后是Encoder Layer,這里主要使用不同的算法,比如FastText、CNN、RCNN、Transformer等等;
最后就是Output Layer,根據(jù)不同的任務(wù)類(lèi)型輸出不同的結(jié)果。
2. 項(xiàng)目支持的任務(wù)類(lèi)型
項(xiàng)目支持的任務(wù)類(lèi)型主要有:
Binary-class text classifcation:二分類(lèi)任務(wù)
Multi-class text classification:多分類(lèi)任務(wù)
Multi-label text classification:多標(biāo)簽任務(wù)
Hiearchical (multi-label) text classification (HMC):多層多標(biāo)簽任務(wù)
前面三個(gè)比較好理解,咱們重點(diǎn)講下第四個(gè)多層多標(biāo)簽任務(wù)。
實(shí)際項(xiàng)目中我們已經(jīng)不再是單純的多分類(lèi)了,而是擁有一個(gè)比較復(fù)雜的類(lèi)目體系,這個(gè)類(lèi)目體系一般是以樹(shù)的形式展示。對(duì)應(yīng)本項(xiàng)目就是data/rcv1.taxonomy文件。詳細(xì)解讀下這個(gè)文件,第一行表示存在四個(gè)一級(jí)類(lèi)目,分別是CCAT、ECAT、GCAT、MCAT。第二行代表CCAT這個(gè)一級(jí)類(lèi)目下?lián)碛械亩?jí)類(lèi)目。依次類(lèi)推,第三行代表C15這個(gè)二級(jí)類(lèi)目下還有兩個(gè)三級(jí)類(lèi)目,第四行代表C151這個(gè)三級(jí)類(lèi)目下還有兩個(gè)四級(jí)類(lèi)目。下圖展示類(lèi)目體系文件并通過(guò)EXCEL的方式更好的展示下這個(gè)層級(jí)類(lèi)目:

圖2 類(lèi)目體系文件和EXCEL展示類(lèi)目體系
為了方便顯示,上圖EXCEL中只展示了rcv1.taxonomy文件前9行的類(lèi)目結(jié)構(gòu)。這樣小伙伴們應(yīng)該對(duì)這個(gè)類(lèi)目體系有一定的了解。實(shí)際項(xiàng)目中一般是三到四級(jí)的類(lèi)目體系,這個(gè)主要根據(jù)業(yè)務(wù)復(fù)雜程度來(lái)定。
這里咱們舉一反三,如果現(xiàn)在需要做一個(gè)多分類(lèi)任務(wù)的話(huà),那么我們這個(gè)類(lèi)目體系的配置文件只需要一行就夠了:
Root label1 label2 label3…labelx
了解了類(lèi)目體系,我們回過(guò)來(lái)說(shuō)這個(gè)多層多標(biāo)簽任務(wù)。拿data目錄下的訓(xùn)練集rcv1_train.json第一條數(shù)據(jù)對(duì)應(yīng)到類(lèi)目體系中,這條數(shù)據(jù)既屬于CCAT一級(jí)類(lèi)目,還屬于C31二級(jí)類(lèi)目,并且還屬于C312三級(jí)類(lèi)目。具體如下圖所示:

圖3 訓(xùn)練集數(shù)據(jù)抽樣和類(lèi)目對(duì)應(yīng)展示
通俗的說(shuō),就是多層多標(biāo)簽任務(wù)會(huì)將這條文本數(shù)據(jù)的標(biāo)簽以及該標(biāo)簽的父級(jí)類(lèi)目都加上。這點(diǎn)其實(shí)和我們?cè)趯?shí)際工作中的理解稍微有點(diǎn)不同。個(gè)人認(rèn)為類(lèi)目體系的層級(jí)結(jié)構(gòu)一般是存在包含關(guān)系,比如C312是屬于CCAT這個(gè)一級(jí)大類(lèi)的,那么如果一條item打上了C312這個(gè)標(biāo)簽,那么應(yīng)同時(shí)屬于它的二級(jí)目錄C31和一級(jí)目錄CCAT。item打標(biāo)一般是標(biāo)注在最低的層級(jí)。這里的一個(gè)猜測(cè)是將標(biāo)簽的層級(jí)結(jié)構(gòu)也添加到模型訓(xùn)練中可能有利于模型訓(xùn)練。
2. 項(xiàng)目支持的算法

圖4 項(xiàng)目支持的算法
3. 項(xiàng)目需要的開(kāi)發(fā)環(huán)境
Python 3
PyTorch 0.4+
Numpy 1.14.3+
03 第一步先跑通它
復(fù)用一張前面講ALBERT時(shí)用到的圖片,以實(shí)用性為主的我一般都是先跑通項(xiàng)目。好處之前也說(shuō)過(guò),一方面可以增加自信心,另一方面也能快速應(yīng)用到實(shí)際項(xiàng)目中。

通過(guò)github將項(xiàng)目下載到服務(wù)器下。模型訓(xùn)練通過(guò)以下命令:
python train.py conf/train.json
這里需要著重講下train.json文件,這個(gè)文件是相關(guān)的任務(wù)配置信息,包括任務(wù)類(lèi)型、使用算法、訓(xùn)練集目錄、類(lèi)目體系目錄以及模型訓(xùn)練中的相關(guān)參數(shù)等。如果只是跑通樣例代碼,那么不用任何改動(dòng)。原始配置中任務(wù)類(lèi)型是多標(biāo)簽任務(wù)("label_type": "multi_label"),具有層級(jí)結(jié)構(gòu)("hierarchical": true),使用TextCNN算法("model_name": "TextCNN"),并且在data目錄下配置了訓(xùn)練集、驗(yàn)證集和測(cè)試集。這是模型訓(xùn)練流程最主要的幾個(gè)參數(shù),其他更多的是模型內(nèi)部的參數(shù),這里默認(rèn)就好。
模型驗(yàn)證和預(yù)測(cè)流程通過(guò)以下命令:
python eval.py conf/train.json
python predict.py conf/train.json data/predict.json
小結(jié)下,這節(jié)咱們主要是跑通項(xiàng)目提供的例子,例子中是多層多標(biāo)簽任務(wù),使用TextCNN算法,包括模型訓(xùn)練、驗(yàn)證和預(yù)測(cè)流程。
04 改造成我們的基于中文的多分類(lèi)任務(wù)
這里咱們通過(guò)一個(gè)實(shí)際項(xiàng)目改造,假如我們現(xiàn)在需要構(gòu)建一個(gè)多分類(lèi)模型。項(xiàng)目改造的github地址如下:https://github.com/wilsonlsm006/NeuralNLP-NeuralClassifier
原始項(xiàng)目中是英文的文本分類(lèi)任務(wù),對(duì)應(yīng)到實(shí)際項(xiàng)目中主要是中文的文本分類(lèi),所以數(shù)據(jù)預(yù)處理方面要做兩個(gè)改造:
改造1:我們之前的模型輸入數(shù)據(jù)都是讀取csv文件,字段為item,label。而本項(xiàng)目中的數(shù)據(jù)是從json文件讀取,數(shù)據(jù)格式是:

圖6 數(shù)據(jù)標(biāo)準(zhǔn)輸入格式
其中doc_label和doc_token分別對(duì)應(yīng)上面的label和item,都是必選項(xiàng)。doc_keyword和doc_topic可選,分別代表關(guān)鍵詞和主題。
改造2:原始項(xiàng)目中使用英文,而實(shí)際項(xiàng)目中使用的中文,所以涉及到中文分詞的問(wèn)題。這里主要使用目前比較火的jieba分詞和北大開(kāi)源的pkuseg分詞。
上面的兩個(gè)改造代碼都放在data_process.py文件中,其中包括使用jieba和pkuseg分詞,還包括csv文件轉(zhuǎn)換成模型標(biāo)準(zhǔn)輸入json文件的的代碼。代碼有詳細(xì)的注釋?zhuān)瑧?yīng)該比較通俗易懂。如果小伙伴們遇到什么問(wèn)題可以隨時(shí)在公眾號(hào)里滴滴我。
數(shù)據(jù)預(yù)處理改造完成后需要根據(jù)實(shí)際項(xiàng)目修改模型配置文件。這里因?yàn)槲覀兪嵌喾诸?lèi)任務(wù),所以我們需要設(shè)置"label_type": "single_label"。因?yàn)椴恍枰謱?,所以設(shè)置"hierarchical": false。這里還構(gòu)造了一個(gè)我們自己的類(lèi)目體系,因?yàn)椴淮嬖诜謱?,所以?biāo)簽都在同一層級(jí),類(lèi)目體系只有一行,設(shè)置為Root 0 1。模型使用TextCNN算法,所以"model_name":"TextCNN"。相關(guān)的訓(xùn)練集、驗(yàn)證集和測(cè)試集都存放在data2目錄下,這三個(gè)文件是我們通過(guò)上面的數(shù)據(jù)處理器將csv文件加工成json數(shù)據(jù)格式。
激動(dòng)人心的時(shí)候到了,只需要通過(guò)以下命令就可以進(jìn)行模型訓(xùn)練:
python train.py conf/train2.json
小結(jié)下:本節(jié)主要通過(guò)一個(gè)多分類(lèi)模型入手對(duì)原項(xiàng)目進(jìn)行二次開(kāi)發(fā),第一步是將csv文件抽取數(shù)據(jù)加工成模型標(biāo)準(zhǔn)的輸入格式json文件。因?yàn)閷?shí)際項(xiàng)目是對(duì)中文進(jìn)行文本分類(lèi),而原項(xiàng)目主要是對(duì)英文,所以涉及到中文的分詞,主要使用目前比較火的jieba分詞和北大開(kāi)源的pkuseg分詞。這樣咱們就完成了一個(gè)實(shí)際項(xiàng)目的改造。
總結(jié)
本篇主要分享騰訊開(kāi)源的文本分類(lèi)項(xiàng)目NeuralClassifier。雖然實(shí)際項(xiàng)目中使用BERT進(jìn)行文本分類(lèi),但是在不同的場(chǎng)景下我們可能還需要使用其他的文本分類(lèi)算法,比如TextCNN、RCNN等等。通過(guò)NeuralClassifier開(kāi)源項(xiàng)目我們可以方便快捷的使用這些模型。然后從項(xiàng)目架構(gòu)、支持的任務(wù)類(lèi)型、支持的文本分類(lèi)算法等方面重點(diǎn)講解開(kāi)源項(xiàng)目NeuralClassifier。接著,根據(jù)項(xiàng)目說(shuō)明跑通了項(xiàng)目實(shí)例。最后,從實(shí)際需求出發(fā),添加數(shù)據(jù)預(yù)處理功能,將項(xiàng)目改造成多分類(lèi)模型。本篇并不會(huì)重點(diǎn)剖析某個(gè)算法,而是從整體的角度使用NeuralClassifier開(kāi)源工程,更多的是以算法庫(kù)的方式根據(jù)不同的業(yè)務(wù)場(chǎng)景為我們靈活的提供文本分類(lèi)算法。
