天天看點

CNN-RNN中文文本分類,基于TensorFlow 實作

使用卷積神經網絡以及循環神經網絡進行中文文本分類

CNN做句子分類的論文可以參看:

https://arxiv.org/abs/1408.5882

還可以去讀dennybritz大牛的部落格:

http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/

以及字元級CNN的論文:

https://arxiv.org/abs/1509.01626

本文是基于TensorFlow在中文資料集上的簡化實作,使用了字元級CNN和RNN對中文文本進行分類,達到了較好的效果。

使用THUCNews的一個子集進行訓練與測試,資料集請自行到THUCTC:一個高效的中文文本分類工具包

下載下傳,請遵循資料提供方的開源協定。

本次訓練使用了其中的10個分類,每個分類6500條資料。

類别如下:

體育, 财經, 房産, 家居, 教育, 科技, 時尚, 時政, 遊戲, 娛樂      

資料集劃分如下:

 ●  訓練集: 5000*10

 ●  驗證集: 500*10

 ●  測試集: 1000*10

從原資料集生成子集的過程請參看

helper

下的兩個腳本。其中,

copy_data.sh

用于從每個分類拷貝6500個檔案,

cnews_group.py

用于将多個檔案整合到一個檔案中。執行該檔案後,得到三個資料檔案:

 ●  cnews.train.txt: 訓練集(50000條)

 ●  cnews.val.txt: 驗證集(5000條)

 ●  cnews.test.txt: 測試集(10000條)

預處理

data/cnews_loader.py

為資料的預處理檔案。

 ●  read_file()

: 讀取檔案資料;

 ●  build_vocab()

: 建構詞彙表,使用字元級的表示,這一函數會将詞彙表存儲下來,避免每一次重複處理;

 ●  read_vocab()

: 讀取上一步存儲的詞彙表,轉換為

{詞:id}

表示;

 ●  read_category()

: 将分類目錄固定,轉換為

{類别: id}

 ●  to_words()

: 将一條由id表示的資料重新轉換為文字;

 ●  process_file()

: 将資料集從文字轉換為固定長度的id序清單示;

 ●  batch_iter()

: 為神經網絡的訓練準備經過shuffle的批次的資料。

經過資料預處理,資料的格式如下:

CNN-RNN中文文本分類,基于TensorFlow 實作

CNN模型

具體參看

cnn_model.py

的實作。

大緻結構如下:

CNN-RNN中文文本分類,基于TensorFlow 實作

訓練與驗證

運作

python run_cnn.py train

,可以開始訓練。

CNN-RNN中文文本分類,基于TensorFlow 實作

在驗證集上的最佳效果為94.12%,且隻經過了3輪疊代就已經停止。

準确率和誤差如圖所示:

CNN-RNN中文文本分類,基于TensorFlow 實作

測試

python run_cnn.py test

在測試集上進行測試。

CNN-RNN中文文本分類,基于TensorFlow 實作

在測試集上的準确率達到了96.04%,且各類的precision, recall和f1-score都超過了0.9。

從混淆矩陣也可以看出分類效果非常優秀。

RNN循環神經網絡

配置項

RNN可配置的參數如下所示,在

rnn_model.py

中。

CNN-RNN中文文本分類,基于TensorFlow 實作

RNN模型

rnn_model.py

CNN-RNN中文文本分類,基于TensorFlow 實作

這部分的代碼與 run_cnn.py極為相似,隻需要将模型和部分目錄稍微修改。

python run_rnn.py train

若之前進行過訓練,請把tensorboard/textrnn删除,避免TensorBoard多次訓練結果重疊。

CNN-RNN中文文本分類,基于TensorFlow 實作

在驗證集上的最佳效果為91.42%,經過了8輪疊代停止,速度相比CNN慢很多。

CNN-RNN中文文本分類,基于TensorFlow 實作

python run_rnn.py test

CNN-RNN中文文本分類,基于TensorFlow 實作

在測試集上的準确率達到了94.22%,且各類的precision, recall和f1-score,除了家居這一類别,都超過了0.9。

從混淆矩陣可以看出分類效果非常優秀。

對比兩個模型,可見RNN除了在家居分類的表現不是很理想,其他幾個類别較CNN差别不大。

還可以通過進一步的調節參數,來達到更好的效果。

為友善預測,repo 中

predict.py

提供了 CNN 模型的預測方法。

原文釋出時間為:2018-10-18

本文來自雲栖社群合作夥伴“

大資料挖掘DT機器學習

”,了解相關資訊可以關注“

”。