1. 程式人生 > >實訓項目:基於TextCNN汽車行業評論文本的情感分析

實訓項目:基於TextCNN汽車行業評論文本的情感分析

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汽車行業評論文本的情感分析