使用卷積神經網絡以及循環神經網絡進行中文文本分類
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的批次的資料。
經過資料預處理,資料的格式如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLwMDMwADN0IGNzImM5IDNmFTO4cjZ3EjNjVGMlNjZwEDN5EGO0MTZk9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
CNN模型
具體參看
cnn_model.py
的實作。
大緻結構如下:
訓練與驗證
運作
python run_cnn.py train
,可以開始訓練。
在驗證集上的最佳效果為94.12%,且隻經過了3輪疊代就已經停止。
準确率和誤差如圖所示:
測試
python run_cnn.py test
在測試集上進行測試。
在測試集上的準确率達到了96.04%,且各類的precision, recall和f1-score都超過了0.9。
從混淆矩陣也可以看出分類效果非常優秀。
RNN循環神經網絡
配置項
RNN可配置的參數如下所示,在
rnn_model.py
中。
RNN模型
rnn_model.py
這部分的代碼與 run_cnn.py極為相似,隻需要将模型和部分目錄稍微修改。
python run_rnn.py train
若之前進行過訓練,請把tensorboard/textrnn删除,避免TensorBoard多次訓練結果重疊。
在驗證集上的最佳效果為91.42%,經過了8輪疊代停止,速度相比CNN慢很多。
python run_rnn.py test
在測試集上的準确率達到了94.22%,且各類的precision, recall和f1-score,除了家居這一類别,都超過了0.9。
從混淆矩陣可以看出分類效果非常優秀。
對比兩個模型,可見RNN除了在家居分類的表現不是很理想,其他幾個類别較CNN差别不大。
還可以通過進一步的調節參數,來達到更好的效果。
為友善預測,repo 中
predict.py
提供了 CNN 模型的預測方法。
原文釋出時間為:2018-10-18
本文來自雲栖社群合作夥伴“
大資料挖掘DT機器學習”,了解相關資訊可以關注“
”。