廣告行業中那些趣事系列7:實戰騰訊開源的文本分類項目NeuralClassifier

微信公衆號:數據拾光者。願結交更多的小夥伴,一同走人生路。

摘要:本篇主要分享騰訊開源的文本分類項目NeuralClassifier。雖然實際項目中使用BERT進行文本分類,但是在不同的場景下我們可能還需要使用其他的文本分類算法,比如TextCNN、RCNN等等。通過NeuralClassifier開源項目我們可以方便快捷的使用這些模型。本篇並不會重點剖析某個算法,而是從整體的角度使用NeuralClassifier開源工程,更多的是以算法庫的方式根據不同的業務場景爲我們靈活的提供文本分類算法。

目錄

01 不僅僅是BERT

02 騰訊開源文本分類項目NeuralClassifier

03 第一步先跑通它

04 改造成我們的基於中文的多分類任務

總結

01 不僅僅是BERT

之前說過BERT是NLP領域中具有里程碑意義的成果,具有效果好和應用範圍廣的優點。雖然實際項目中我們主要使用BERT來做文本分類任務,但是在不同的場景下我們可能還需要使用其他的文本分類算法。除此之外,我們不能僅僅只會用BERT,還需要掌握一些BERT出現之前的文本分類算法,能更好的幫助我們瞭解文本分類任務背景下模型的發展歷史。

BERT之前主要用於文本分類的模型有TextCNN、RCNN、FastText等,這些模型也擁有各自的優點。充分了解這些模型各自的優缺點,才能在不同的場景下更好的使用這些模型。

之前看到騰訊開源了一個文本分類開源項目NeuralClassifier,裏面集成了很多算法,其中就包括上面說的TextCNN、RCNN、FastText等。所以想基於該開源項目進行二次開發以便後續用於實際項目中。

02 騰訊開源文本分類項目NeuralClassifier

本篇的重點是講解NeuralClassifier開源項目, 項目的github地址如下:

https://github.com/Tencent/NeuralNLP-NeuralClassifier


1. 項目整體架構

項目整體架構如下圖所示:

圖1 項目整體架構圖

 

從下往上依次查看,最下面是輸入的語句,因爲原始項目中主要是針對英文分類,所以輸入的句子序列是一系列詞,這是主要識別的文本,所以是必須要有的。可選的輸入是文本是否有關鍵詞或者主題;

然後是Input Layer,這裏可能是詞、詞的組合、字符和字符的組合等。如果有關鍵詞或者主題也會作爲特徵進入模型;

接着是Embedding Layer,這裏可以使用不同的Embedding方式,包括預訓練編碼、隨機編碼、位置編碼等等;

然後是Encoder Layer,這裏主要使用不同的算法,比如FastText、CNN、RCNN、Transformer等等;

最後就是Output Layer,根據不同的任務類型輸出不同的結果。

2. 項目支持的任務類型

項目支持的任務類型主要有:

  • Binary-class text classifcation:二分類任務
  • Multi-class text classification:多分類任務
  • Multi-label text classification:多標籤任務
  • Hiearchical (multi-label) text classification (HMC):多層多標籤任務

前面三個比較好理解,咱們重點講下第四個多層多標籤任務。

實際項目中我們已經不再是單純的多分類了,而是擁有一個比較複雜的類目體系,這個類目體系一般是以樹的形式展示。對應本項目就是data/rcv1.taxonomy文件。詳細解讀下這個文件,第一行表示存在四個一級類目,分別是CCAT、ECAT、GCAT、MCAT。第二行代表CCAT這個一級類目下擁有的二級類目。依次類推,第三行代表C15這個二級類目下還有兩個三級類目,第四行代表C151這個三級類目下還有兩個四級類目。下圖展示類目體系文件並通過EXCEL的方式更好的展示下這個層級類目:

圖2 類目體系文件和EXCEL展示類目體系

 

爲了方便顯示,上圖EXCEL中只展示了rcv1.taxonomy文件前9行的類目結構。這樣小夥伴們應該對這個類目體系有一定的瞭解。實際項目中一般是三到四級的類目體系,這個主要根據業務複雜程度來定。

這裏咱們舉一反三,如果現在需要做一個多分類任務的話,那麼我們這個類目體系的配置文件只需要一行就夠了:Root label1 label2 label3…labelx


瞭解了類目體系,我們回過來說這個多層多標籤任務。拿data目錄下的訓練集rcv1_train.json第一條數據對應到類目體系中,這條數據既屬於CCAT一級類目,還屬於C31二級類目,並且還屬於C312三級類目。具體如下圖所示:

圖2 類目體系文件和EXCEL展示類目體系

 


通俗的說,就是多層多標籤任務會將這條文本數據的標籤以及該標籤的父級類目都加上。這點其實和我們在實際工作中的理解稍微有點不同。個人認爲類目體系的層級結構一般是存在包含關係,比如C312是屬於CCAT這個一級大類的,那麼如果一條item打上了C312這個標籤,那麼應同時屬於它的二級目錄C31和一級目錄CCAT。item打標一般是標註在最低的層級。這裏的一個猜測是將標籤的層級結構也添加到模型訓練中可能有利於模型訓練。

2. 項目支持的算法

圖4 項目支持的算法

 

3. 項目需要的開發環境

  • Python 3
  • PyTorch 0.4+
  • Numpy 1.14.3+

 

03 第一步先跑通它

 

複用一張前面講ALBERT時用到的圖片,以實用性爲主的我一般都是先跑通項目。好處之前也說過,一方面可以增加自信心,另一方面也能快速應用到實際項目中。

通過github將項目下載到服務器下。模型訓練通過以下命令:

python train.py conf/train.json

這裏需要着重講下train.json文件,這個文件是相關的任務配置信息,包括任務類型、使用算法、訓練集目錄、類目體系目錄以及模型訓練中的相關參數等。如果只是跑通樣例代碼,那麼不用任何改動。原始配置中任務類型是多標籤任務("label_type": "multi_label"),具有層級結構("hierarchical": true),使用TextCNN算法("model_name": "TextCNN"),並且在data目錄下配置了訓練集、驗證集和測試集。這是模型訓練流程最主要的幾個參數,其他更多的是模型內部的參數,這裏默認就好。

模型驗證和預測流程通過以下命令:

python eval.py conf/train.json

python predict.py conf/train.json data/predict.json

小結下,這節咱們主要是跑通項目提供的例子,例子中是多層多標籤任務,使用TextCNN算法,包括模型訓練、驗證和預測流程。

 

04 改造成我們的基於中文的多分類任務

這裏咱們通過一個實際項目改造,假如我們現在需要構建一個多分類模型。項目改造的github地址如下:https://github.com/wilsonlsm006/NeuralNLP-NeuralClassifier

原始項目中是英文的文本分類任務,對應到實際項目中主要是中文的文本分類,所以數據預處理方面要做兩個改造:

改造1:我們之前的模型輸入數據都是讀取csv文件,字段爲item,label。而本項目中的數據是從json文件讀取,數據格式是:

圖6 數據標準輸入格式

 

其中doc_label和doc_token分別對應上面的label和item,都是必選項。doc_keyword和doc_topic可選,分別代表關鍵詞和主題。

改造2:原始項目中使用英文,而實際項目中使用的中文,所以涉及到中文分詞的問題。這裏主要使用目前比較火的jieba分詞和北大開源的pkuseg分詞。

上面的兩個改造代碼都放在data_process.py文件中,其中包括使用jieba和pkuseg分詞,還包括csv文件轉換成模型標準輸入json文件的的代碼。代碼有詳細的註釋,應該比較通俗易懂。如果小夥伴們遇到什麼問題可以隨時在公衆號裏滴滴我。

數據預處理改造完成後需要根據實際項目修改模型配置文件。這裏因爲我們是多分類任務,所以我們需要設置"label_type": "single_label"。因爲不需要分層,所以設置"hierarchical": false。這裏還構造了一個我們自己的類目體系,因爲不存在分層,所以標籤都在同一層級,類目體系只有一行,設置爲Root 0 1。模型使用TextCNN算法,所以"model_name":"TextCNN"。相關的訓練集、驗證集和測試集都存放在data2目錄下,這三個文件是我們通過上面的數據處理器將csv文件加工成json數據格式。

激動人心的時候到了,只需要通過以下命令就可以進行模型訓練:

python train.py conf/train2.json

小結下:本節主要通過一個多分類模型入手對原項目進行二次開發,第一步是將csv文件抽取數據加工成模型標準的輸入格式json文件。因爲實際項目是對中文進行文本分類,而原項目主要是對英文,所以涉及到中文的分詞,主要使用目前比較火的jieba分詞和北大開源的pkuseg分詞。這樣咱們就完成了一個實際項目的改造。

總結

本篇主要分享騰訊開源的文本分類項目NeuralClassifier。雖然實際項目中使用BERT進行文本分類,但是在不同的場景下我們可能還需要使用其他的文本分類算法,比如TextCNN、RCNN等等。通過NeuralClassifier開源項目我們可以方便快捷的使用這些模型。然後從項目架構、支持的任務類型、支持的文本分類算法等方面重點講解開源項目NeuralClassifier。接着,根據項目說明跑通了項目實例。最後,從實際需求出發,添加數據預處理功能,將項目改造成多分類模型。本篇並不會重點剖析某個算法,而是從整體的角度使用NeuralClassifier開源工程,更多的是以算法庫的方式根據不同的業務場景爲我們靈活的提供文本分類算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章