Pytorch實(shí)現(xiàn)中文文本分類任務(wù)(Bert,ERNIE,TextCNN,TextRNN,F(xiàn)astText,TextRCNN,BiLSTM_Attention, DPCNN, Transformer)

Chinese-Text-Classification

Github項(xiàng)目地址:https://github.com/JackHCC/Chinese-Text-Classification-PyTorch

中文文本分類,基于pytorch,開箱即用。

  • 神經(jīng)網(wǎng)絡(luò)模型:TextCNN,TextRNN,F(xiàn)astText,TextRCNN,BiLSTM_Attention, DPCNN, Transformer

  • 預(yù)訓(xùn)練模型:Bert,ERNIE

介紹

神經(jīng)網(wǎng)絡(luò)模型

模型介紹、數(shù)據(jù)流動過程:參考

數(shù)據(jù)以字為單位輸入模型,預(yù)訓(xùn)練詞向量使用 搜狗新聞 Word+Character 300d點(diǎn)這里下載

模型 介紹
TextCNN Kim 2014 經(jīng)典的CNN文本分類
TextRNN BiLSTM
TextRNN_Att BiLSTM+Attention
TextRCNN BiLSTM+池化
FastText bow+bigram+trigram, 效果出奇的好
DPCNN 深層金字塔CNN
Transformer 效果較差

預(yù)訓(xùn)練模型

模型 介紹 備注
bert 原始的bert
ERNIE ERNIE
bert_CNN bert作為Embedding層,接入三種卷積核的CNN bert + CNN
bert_RNN bert作為Embedding層,接入LSTM bert + RNN
bert_RCNN bert作為Embedding層,通過LSTM與bert輸出拼接,經(jīng)過一層最大池化層 bert + RCNN
bert_DPCNN bert作為Embedding層,經(jīng)過一個包含三個不同卷積特征提取器的region embedding層,可以看作輸出的是embedding,然后經(jīng)過兩層的等長卷積來為接下來的特征抽取提供更寬的感受眼,(提高embdding的豐富性),然后會重復(fù)通過一個1/2池化的殘差塊,1/2池化不斷提高詞位的語義,其中固定了feature_maps,殘差網(wǎng)絡(luò)的引入是為了解決在訓(xùn)練的過程中梯度消失和梯度爆炸的問題。 bert + DPCNN

參考:

環(huán)境

python 3.7
pytorch 1.1
tqdm
sklearn
tensorboardX
pytorch_pretrained_bert(預(yù)訓(xùn)練代碼也上傳了, 不需要這個庫了)

中文數(shù)據(jù)集

我從THUCNews中抽取了20萬條新聞標(biāo)題,已上傳至github,文本長度在20到30之間。一共10個類別,每類2萬條。數(shù)據(jù)以字為單位輸入模型。

類別:財(cái)經(jīng)、房產(chǎn)、股票、教育、科技、社會、時(shí)政、體育、游戲、娛樂。

數(shù)據(jù)集劃分:

數(shù)據(jù)集 數(shù)據(jù)量
訓(xùn)練集 18萬
驗(yàn)證集 1萬
測試集 1萬

更換數(shù)據(jù)集

  • 按照THUCNews數(shù)據(jù)集的格式來格式化自己的中文數(shù)據(jù)集。
  • 對于神經(jīng)網(wǎng)絡(luò)模型:
    • 如果用字,按照數(shù)據(jù)集的格式來格式化你的數(shù)據(jù)。
    • 如果用詞,提前分好詞,詞之間用空格隔開,python run.py --model TextCNN --word True
    • 使用預(yù)訓(xùn)練詞向量:utils.py的main函數(shù)可以提取詞表對應(yīng)的預(yù)訓(xùn)練詞向量。

實(shí)驗(yàn)效果

機(jī)器:一塊2080Ti , 訓(xùn)練時(shí)間:30分鐘。

模型 acc 備注
TextCNN 91.22% Kim 2014 經(jīng)典的CNN文本分類
TextRNN 91.12% BiLSTM
TextRNN_Att 90.90% BiLSTM+Attention
TextRCNN 91.54% BiLSTM+池化
FastText 92.23% bow+bigram+trigram, 效果出奇的好
DPCNN 91.25% 深層金字塔CNN
Transformer 89.91% 效果較差
bert 94.83% 單純的bert
ERNIE 94.61% 說好的中文碾壓bert呢
bert_CNN 94.44% bert + CNN
bert_RNN 94.57% bert + RNN
bert_RCNN 94.51% bert + RCNN
bert_DPCNN 94.47% bert + DPCNN

原始的bert效果就很好了,把bert當(dāng)作embedding層送入其它模型,效果反而降了,之后會嘗試長文本的效果對比。

預(yù)訓(xùn)練語言模型

bert模型放在 bert_pretain目錄下,ERNIE模型放在ERNIE_pretrain目錄下,每個目錄下都是三個文件:

  • pytorch_model.bin
  • bert_config.json
  • vocab.txt

預(yù)訓(xùn)練模型下載地址:

bert_Chinese: 模型 https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese.tar.gz
詞表 https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-vocab.txt

來自這里

備用:模型的網(wǎng)盤地址:https://pan.baidu.com/s/1qSAD5gwClq7xlgzl_4W3Pw

ERNIE_Chinese: https://pan.baidu.com/s/1lEPdDN1-YQJmKEd_g9rLgw

來自這里

解壓后,按照上面說的放在對應(yīng)目錄下,文件名稱確認(rèn)無誤即可。

使用說明

神經(jīng)網(wǎng)絡(luò)方法

# 訓(xùn)練并測試:
# TextCNN
python run.py --model TextCNN

# TextRNN
python run.py --model TextRNN

# TextRNN_Att
python run.py --model TextRNN_Att

# TextRCNN
python run.py --model TextRCNN

# FastText, embedding層是隨機(jī)初始化的
python run.py --model FastText --embedding random 

# DPCNN
python run.py --model DPCNN

# Transformer
python run.py --model Transformer

預(yù)訓(xùn)練方法

下載好預(yù)訓(xùn)練模型就可以跑了:

# 預(yù)訓(xùn)練模型訓(xùn)練并測試:
# bert
python pretrain_run.py --model bert

# bert + 其它
python pretrain_run.py --model bert_CNN

# ERNIE
python pretrain_run.py --model ERNIE

預(yù)測

預(yù)訓(xùn)練模型:

python pretrain_predict.py

神經(jīng)網(wǎng)絡(luò)模型:

python predict.py

參數(shù)

模型都在models目錄下,超參定義和模型定義在同一文件中。

參考

論文

[1] Convolutional Neural Networks for Sentence Classification

[2] Recurrent Neural Network for Text Classification with Multi-Task Learning

[3] Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification

[4] Recurrent Convolutional Neural Networks for Text Classification

[5] Bag of Tricks for Efficient Text Classification

[6] Deep Pyramid Convolutional Neural Networks for Text Categorization

[7] Attention Is All You Need

[8] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

[9] ERNIE: Enhanced Representation through Knowledge Integration

倉庫

本項(xiàng)目基于以下倉庫繼續(xù)開發(fā)優(yōu)化:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容