美文网首页
基于 CNN 的中文对话情感分析

基于 CNN 的中文对话情感分析

作者: 捡个七 | 来源:发表于2018-12-02 20:54 被阅读0次

这是 Data Mining 这门课的期末项目,主要记录一下中文文本的处理方式与 CNN 作用于文本特征的原理,网络训练调参和与其他模型的对比就不详细记录了。

数据集准备

使用的是中文对话情感分析的一个数据集。下载地址:z17176
这个是数据集是来自这篇 paper :Sentiment Classification with Convolutional Neural Networks: an Experimental Study on a Large-scale Chinese Conversation Corpus

  • sentiment_XS_30k.txt:作为训练集
  • sentiment_XS_test.txt:作为测试集

中文文本的预处理

分词处理

中文文本与英文文本不同,不像英文文本一样,单词与单词之间是有空隙的,所以拿到中文文本(已经去除掉标点符号及其他符号的纯文本)之后,需要进行分词处理。常用的分词工具有 jieba 分词。该数据集已经用 jieba 工具处理过分词了,所以就不需要额外处理了。

停用词处理

中文的停用词资源有挺多的,停用词处理主要依据不同的文本或者不同的目的来处理。我的项目中,没有进行停用词处理。

Tokenization

将输入文本拆分为有意义的块 (chunks) 的过程称为 Tokenization,并且这个被拆分出来的块实际上被称为令牌 (Token)。

  • 可以认为在语义处理过程中一个 Token 就是一个有用的单元
  • 可以划分为一个单词 (word),一个句子 (sentence),一个段落 (paragraph) 等等。

Tokenization 的过程就是建立一个词典或者词汇表的过程。将一个个单词转换成由整数组成的序列,每个整数都对应于词汇表中的一个索引值。Tokenization 之后,将序列处理成等长,这样后续就容易处理。

from keras.preprocessing.text import Tokenizer
from keras.preprocessing import sequence

# 建立一个 4000 个单词的词典
tokenizer = Tokenizer(num_words=4000) 
tokenizer.fit_on_texts(X)

# 将每个文本转换成序列列表, 使用每个词的编号进行编码
x_train_seq = tokenizer.texts_to_sequences(X)
x_test_seq = tokenizer.texts_to_sequences(X_test)

# 将每个序列变成相同的长度,多的截断,不足补 0
seq = x_train_seq + x_test_seq 
maxlen= np.max([len(i) for i in seq])
X_train = sequence.pad_sequences(x_train_seq, maxlen=maxlen)
X_test = sequence.pad_sequences(x_test_seq, maxlen=mexlen)
Word Embedding

后面将输入的 Token 序列转换成词嵌入矩阵,通常这个可以在搭建模型的时候处理,作为模型隐藏层的第一层,这时候就相当于自己训练一个词嵌入矩阵,也可以直接使用 Word2Vec 或者 GloVe 提供的词嵌入矩阵,相当于迁移学习了。但现在做的是中文文本的分类问题,所以迁移学习这个不合适。

# num_words 为前面设置的字典的长度,embed_size为词向量的长度
embed = Embedding(num_words, embed_size) 

CNN 处理文本的过程

这时候就要贡献出经典的一张图了。如下图所示,CNN 处理文本的时候,输入就是一个为矩阵的句子,就像原先图像像素的输入一样,不过是单通道的。矩阵的每一行对应一个单词的 Token,通常是一个单词,但它可以是一个字符。也就是说,每行是表示单词的向量表示。通常,这些向量是词嵌入向量(低维表示),如 word2vec 或 GloVe,但它们也可以是将单词索引为词汇表的 one-hot 向量。

在计算机视觉中,滤波器会滑过图像的局部色块,但在 NLP 中,我们通常使用在矩阵的整行上滑动的滤波器。因此,滤波器的 “宽度” 通常与输入矩阵的宽度相同。高度或区域大小可以变化,通常可以一次滑动超过 2-5 个单词。

CNN 处理文本过程

在这幅图中,使用了 3 种尺寸的滤波器([2, 3, 4]),每种尺寸包含两个滤波器,所以一共有 6 个滤波器,然后在输入矩阵上进行卷积操作,再使用非线性的激活函数,得到 6 个feature maps ,再进行最大池化操作,最后送入 softmax 层进行分类。

搭建 CNN 模型

def text_cnn(maxlen, max_features=4000, embed_size=100):
    
    # Inputs
    comment_seq = Input(shape=[maxlen])
    
    # Embedding layer
    emb_comment = Embedding(max_features, embed_size)(comment_seq)
    
    # SpatialDropout1D layer for reduce overfitting 
    emb_comment = SpatialDropout1D(0.4)(emb_comment)
    
    # Conv layers
    convs = []
    filter_sizes = [2, 3, 4, 5]
    for fsz in filter_sizes:
        l_conv = Conv1D(filters=100, kernel_size=fsz, activation='relu')(emb_comment)
        l_pool = MaxPooling1D(maxlen - fsz + 1)(l_conv)
        l_pool = Flatten()(l_pool)
        convs.append(l_pool)
    merge = concatenate(convs, axis=1)

    out = Dropout(0.5)(merge)
    output = Dense(32, activation='relu')(out)
    output = Dense(units=1, activation='sigmoid')(output)

    model = Model([comment_seq], output)
    #adam = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
    model.compile(loss="binary_crossentropy", optimizer="adam", metrics=['accuracy'])
    
    return model

测试模型

t = time.time() 

model = text_cnn(maxlen=23)
batch_size = 64
epochs = 30


history = model.fit(X_train, y_train,
             validation_split=0.1,
             batch_size=batch_size,
             epochs=epochs,
             shuffle=True,
             callbacks=[PlotLossesKeras()],verbose=1)

# Testing  for test set
scores = model.evaluate(X_test, y_test)
print('Test set accuracy: ', str(round(scores[1],3)* 100) + '%')

print("It took", time.time() - t, "seconds to run the model.")

这里只给出了简单的初始模型,最后的训练的结果没有完全收敛。可以试试把学习率调小,这篇文章主要是学习中文文本的处理方法及 CNN 是如何作用于文本特征的。

参考

[1]. 使用Keras进行深度学习:(三)使用text-CNN处理自然语言(上)
[2]. How to Use Word Embedding Layers for Deep Learning with Keras
[3]. DNN/LSTM/Text-CNN情感分类实战与分析
[4]. Understanding how Convolutional Neural Network (CNN) perform text classification with word embeddings

相关文章

网友评论

      本文标题:基于 CNN 的中文对话情感分析

      本文链接:https://www.haomeiwen.com/subject/rgjqcqtx.html