Chinese-Text-Classification
Github項目地址: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破停,點這里下載
模型 | 介紹 |
---|---|
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ù)以字為單位輸入模型揭芍。
類別:財經(jīng)胳搞、房產(chǎn)、股票称杨、教育肌毅、科技、社會姑原、時政悬而、體育、游戲页衙、娛樂摊滔。
數(shù)據(jù)集劃分:
數(shù)據(jù)集 | 數(shù)據(jù)量 |
---|---|
訓(xùn)練集 | 18萬 |
驗證集 | 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)練詞向量左电。
實驗效果
機器:一塊2080Ti , 訓(xùn)練時間: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層是隨機初始化的
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
倉庫
本項目基于以下倉庫繼續(xù)開發(fā)優(yōu)化: