文本情感分类(二)---以微博评论为例

1,932 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

基于深度学习的文本情感分类

本部分采用了基于深度学习的文本情感分类,搭建LSTM(Long-Short Term Memory,长短期记忆人工神经网络)网络模型,使用weibo_senti_100k数据集作为训练集进行训练。模型准确度达到98.37%,测试集准确率达到98.23%。然后用模型预测“垃圾分类”微博评论的情感,将预测结果大于0.7的评论设定为积极情感,小于0.4的评论设定为消极情感,0.4 - 0.7之间的为中立情感。基于此,最终得出不同阶段网民对垃圾分类舆情事件的情感态度。

1、预训练词向量

使用了北京师范大学中文信息处理研究所与中国人民大学 DBIIR 实验室的研究者开源的"chinese-word-vectors" github链接为:
github.com/Embedding/C…

这里我们使用了"chinese-word-vectors"微博Word + Ngram的词向量

with open("E:/桌面/chinese_sentiment-master/embeddings/sgns.weibo.bigram", 'wb') as 
new_file,   
open("E:/桌面/chinese_sentiment-master/embeddings/sgns.weibo.bigram.bz2", 'rb') as 
file:
    decompressor = bz2.BZ2Decompressor()
    for data in iter(lambda : file.read(100 * 1024), b''):
        new_file.write(decompressor.decompress(data))

```
# 使用gensim加载预训练中文分词embedding
cn_model = KeyedVectors.load_word2vec_format(
'E:/桌面/chinese_sentiment-master/embeddings/sgns.weibo.bigram',
                                             binary=False, unicode_errors="ignore")
```

词向量模型
在这个词向量模型里,每一个词是一个索引,对应的是一个长度为300的向量,我们今天需要构建的LSTM神经网络模型并不能直接处理汉字文本,需要先进行分次并把词汇转换为词向量,步骤请参考下图。

Snipaste_2022-10-11_19-28-20.jpg

2.导入数据集

#读取训练集
weibo = pd.read_csv('E:/桌面/weibo_senti_100k.csv')
label = weibo['label']
mark = np.array(label)
comment = np.array(weibo['review'])

使用weibo_senti_100k数据集

3.数据预处理

图片1.png 对数据中评论部分进行去除标点符号、分词,然后将每一条评论分词结果转换为词向量,组成句向量。

num_words = 50000
# 初始化embedding_matrix,之后在keras上进行应用
embedding_matrix = np.zeros((num_words, embedding_dim))
# embedding_matrix为一个 [num_words,embedding_dim] 的矩阵
# 维度为 50000 * 300
for i in range(num_words):
    embedding_matrix[i,:] = cn_model[cn_model.index2word[i]]
embedding_matrix = embedding_matrix.astype('float32')

图片2.png 接着进行索引长度标准化,因为每段评语的长度是不一样的,我们如果单纯取最长的一个评语,并把其他评填充成同样的长度,这样十分浪费计算资源,所以我们取一个折衷的长度。这里我们取tokens平均值并加上两个tokens的标准差作为最后的索引长度,取tokens平均值并加上两个tokens的标准差。

图片3.png
假设tokens长度的分布为正态分布,则max_tokens这个值可以涵盖95%左右的样本.

4.使用LSTM模型进行训练

# 用LSTM对样本进行分类
model = Sequential()
# 模型第一层为embedding
model.add(Embedding(num_words,
                    embedding_dim,
                    weights=[embedding_matrix],
                    input_length=max_tokens,
                    trainable=False))

model.add(Bidirectional(LSTM(units=64, return_sequences=True)))
model.add(LSTM(units=16, return_sequences=False))
model.add(Dense(1, activation='sigmoid'))
# 我们使用adam以0.001的learning rate进行优化
optimizer = Adam(lr=1e-3)
model.compile(loss='binary_crossentropy',
              optimizer=optimizer,
              metrics=['accuracy'])
model.summary()

使用80%的样本训练,剩余20%测试。网络模型结构如下图。

Snipaste_2022-10-11_19-39-54.jpg

图片4.png

5.模型评估

使用测试集进行预测,准确率可以达到98.22%

图片5.png

图片6.png

6.使用模型预测微博垃圾分类评论文本

将预测结果大于0.7的评论设定为积极情感,小于0.4的评论设定为消极情感,0.4 - 0.7之间的为中立情感。

图片7.png 导入一个阶段的关于垃圾分类微博评论,使用模型预测情感,并统计各个情感微博评论数量,方差。

图片8.png

7.结果可视化

情感平均分研究图.png

情感分类对应的每个数量条数1.png