實訓項目:基於TextCNN汽車行業評論文本的情感分析
阿新 • • 發佈:2018-11-24
1.0 mode model 配置 drop 批處理 預測 3.2 評論
基於TextCNN汽車行業評論文本的情感分析
使用卷積神經網絡對汽車行業評論文本進行情感分析。
數據集
爬取汽車之家車主口碑評論文本,抽取口碑中最滿意以及最不滿意評論文本,分別作為正向情感語料庫和負向情感語料庫。
語料庫基本信息如下:
訓練集(data/ch_auto_train.txt): 40000 = 20000(pos) + 20000(neg) 驗證集(data/ch_auto_dev.txt): 10000 = 5000(pos) + 5000(neg) 測試集(data/ch_auto_test.txt): 20000 = 10000(pos) + 10000(neg)
預處理
utils.py
為數據的預處理代碼。
cat_to_id(): 分類類別以及id對應詞典{pos:0, neg:1}; build_word2id(): 構建詞匯表並存儲,形如{word: id}; load_word2id(): 加載上述構建的詞匯表; build_word2vec(): 基於預訓練好的word2vec構建訓練語料中所含詞語的word2vec; load_corpus_word2vec(): 加載上述構建的word2ve; load_corpus(): 加載語料庫:train/dev/test; batch_index(): 生成批處理id序列。
經過數據預處理,數據的格式如下:
x: [1434, 5454, 2323, ..., 0, 0, 0] y: [0, 1]
x為構成一條語句的單詞所對應的id。 y為onehot編碼: pos-[1, 0], neg-[0, 1]。
CNN卷積神經網絡
配置項
CNN可配置的參數如下所示,在cnn_model.py
中。
class CONFIG(): update_w2v = True # 是否在訓練中更新w2v vocab_size = 37814 # 詞匯量,與word2id中的詞匯量一致 n_class= 2 # 分類數:分別為pos和neg max_sen_len = 75 # 句子最大長度 embedding_dim = 50 # 詞向量維度 batch_size = 100 # 批處理尺寸 n_hidden = 256 # 隱藏層節點數 n_epoch = 10 # 訓練叠代周期,即遍歷整個訓練樣本的次數 opt = ‘adam‘ # 訓練優化器:adam或者adadelta learning_rate = 0.001 # 學習率;若opt=‘adadelta‘,則不需要定義學習率 drop_keep_prob = 0.5 # dropout層,參數keep的比例 num_filters = 256 # 卷積層filter的數量 kernel_size = 3 # 卷積核的尺寸;nlp任務中通常選擇2,3,4,5 print_per_batch = 100 # 訓練過程中,每100詞batch叠代,打印訓練信息 save_dir = ‘./checkpoints/‘ # 訓練模型保存的地址 ...
訓練與驗證
train_and_eva.py
中的train()進行訓練。
加載word2vec========================== 加載train語料庫======================== 總樣本數為:40000 各個類別樣本數如下: pos 20000 neg 20000 加載dev語料庫========================== 總樣本數為:10000 各個類別樣本數如下: pos 5000 neg 5000 加載test語料庫========================= 總樣本數為:20000 各個類別樣本數如下: pos 10000 neg 10000 Training and evaluating... Epoch: 1 Iter: 0, Train Loss: 0.71, Train Acc: 51.00%, Val Loss: 0.86, Val Acc: 49.96%, Time: 0:00:04 * Iter: 100, Train Loss: 0.29, Train Acc: 89.00%, Val Loss: 0.26, Val Acc: 89.16%, Time: 0:04:37 * Iter: 200, Train Loss: 0.22, Train Acc: 93.00%, Val Loss: 0.2, Val Acc: 91.85%, Time: 0:09:05 * Iter: 300, Train Loss: 0.082, Train Acc: 96.00%, Val Loss: 0.17, Val Acc: 93.26%, Time: 0:13:26 * Epoch: 2 Iter: 400, Train Loss: 0.16, Train Acc: 96.00%, Val Loss: 0.17, Val Acc: 93.19%, Time: 0:17:52 Iter: 500, Train Loss: 0.11, Train Acc: 97.00%, Val Loss: 0.17, Val Acc: 93.51%, Time: 0:22:11 * Iter: 600, Train Loss: 0.16, Train Acc: 97.00%, Val Loss: 0.15, Val Acc: 94.22%, Time: 0:26:36 * Iter: 700, Train Loss: 0.15, Train Acc: 91.00%, Val Loss: 0.15, Val Acc: 94.05%, Time: 0:30:54 Epoch: 3 Iter: 800, Train Loss: 0.11, Train Acc: 95.00%, Val Loss: 0.15, Val Acc: 94.13%, Time: 0:35:13 Iter: 900, Train Loss: 0.058, Train Acc: 97.00%, Val Loss: 0.16, Val Acc: 94.33%, Time: 0:39:37 * Iter: 1000, Train Loss: 0.048, Train Acc: 98.00%, Val Loss: 0.15, Val Acc: 94.33%, Time: 0:43:53 Iter: 1100, Train Loss: 0.054, Train Acc: 97.00%, Val Loss: 0.16, Val Acc: 94.10%, Time: 0:48:21 Epoch: 4 Iter: 1200, Train Loss: 0.065, Train Acc: 96.00%, Val Loss: 0.16, Val Acc: 94.52%, Time: 0:52:43 * Iter: 1300, Train Loss: 0.056, Train Acc: 97.00%, Val Loss: 0.17, Val Acc: 94.55%, Time: 0:57:09 * Iter: 1400, Train Loss: 0.016, Train Acc: 100.00%, Val Loss: 0.17, Val Acc: 94.40%, Time: 1:01:30 Iter: 1500, Train Loss: 0.1, Train Acc: 97.00%, Val Loss: 0.16, Val Acc: 94.90%, Time: 1:05:49 * Epoch: 5 Iter: 1600, Train Loss: 0.021, Train Acc: 99.00%, Val Loss: 0.16, Val Acc: 94.28%, Time: 1:10:00 Iter: 1700, Train Loss: 0.045, Train Acc: 99.00%, Val Loss: 0.18, Val Acc: 94.40%, Time: 1:14:16 Iter: 1800, Train Loss: 0.036, Train Acc: 98.00%, Val Loss: 0.21, Val Acc: 94.10%, Time: 1:18:36 Iter: 1900, Train Loss: 0.014, Train Acc: 100.00%, Val Loss: 0.2, Val Acc: 94.18%, Time: 1:22:59
在驗證集上的最佳效果為94.90%。
測試
train_and_eva.py
中的test()進行測試。
INFO:tensorflow:Restoring parameters from ./checkpoints/sa-model Precision, Recall and F1-Score... precision recall f1-score support pos 0.96 0.96 0.96 10000 neg 0.96 0.96 0.96 10000 avg / total 0.96 0.96 0.96 20000 Confusion Matrix... [[9597 403] [ 449 9551]]
在測試集上的準確率達到了95.74%,且各類的precision, recall和f1-score都超過了95%。
預測
predict.py
中的predict()進行預測
>> test = [‘噪音大、車漆很薄‘, ‘性價比很高,價位不高,又皮實耐用。‘] >> print(predict(test, label=True)) INFO:tensorflow:Restoring parameters from ./checkpoints/sa-model [‘neg‘, ‘pos‘]
實訓項目:基於TextCNN汽車行業評論文本的情感分析