基于Keras搭建LSTM网络实现文本情感分类


版本

在jupyter notbook中执行

import keras as ks
import tensorflow as tf

print(ks.__version__)
print(tf.__version__)

2.3.1
2.0.0

一、语料概况

本次项目主要以电商网站下的用户评论数据作为实验数据集,数据集已经做好了标注。其中该数据集一共有4310条评论数据,文本的情感分为两类:“正面”和“反面”

其中evaluation为评论内容,label为情感倾向。

在这里插入图片描述

1.1 数据统计

先整体查看不同类别下的样本均衡情况,样本的不均衡会影响模型的分类效果

导入相应的库

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager
from itertools import accumulate

plt.rcParams['font.sans-serif']=['SimHei'] #图中文字体设置为黑体

1.1.1 查看样本均衡情况,对label进行统计

df = pd.read_csv('./data_single.csv')
print(df.groupby('label')['label'].count())
label
正面    1908
负面    2375
Name: label, dtype: int64

整体来看样本还算均衡,正面1908条,负面2375条。可以达到需求了

深度学习中需要定义文本的最长长度,大于该长度就需要将文本切割,不够就填充0处理,所以还是需要整体统计出样本大致的文本长度分布。、

1.1.2 计句子长度及长度出现的频数

先计算句子的长度,在对句子的长度进行分组统计分析,看下不同长度下一共有几个样本

df[:30]
df[:30].groupby('length').count()

在这里插入图片描述
在这里插入图片描述

可以看出长度15的有两个,length是句子长度,evaluation代表该长度下有几个样本,根据这两个值就可以画图了

df['length'] = df['evaluation'].apply(lambda x: len(x))

len_df = df.groupby('length').count()
sent_length = len_df.index.tolist()
sent_freq = len_df['evaluation'].tolist()

获取数据中样本的所有长度sent_length,和该长度下sent_freq的样本数量绘图

# 绘制句子长度及出现频数统计图
plt.figure(figsize=(10,12))
plt.bar(sent_length, sent_freq,2)
plt.title("句子长度及出现频数统计图", )
plt.xlabel("句子长度")
plt.ylabel("句子长度出现的频数")
plt.savefig("./句子长度及出现频数统计图.png")
plt.show

在这里插入图片描述

大部分长度在20左右。

1.1.3 绘制句子长度累积分布函数(CDF)

到句子累加到90%的时候,返回其对应长度值

### 绘制句子长度累积分布函数(CDF)
sent_pentage_list = [(count/sum(sent_freq)) for count in accumulate(sent_freq)]
plt.figure(figsize=(10,12))

# 绘制CDF
plt.plot(sent_length, sent_pentage_list)

# 寻找分位点为quantile的句子长度
quantile = 0.90

for length, per in zip(sent_length, sent_pentage_list):
    if round(per, 2) == quantile:
        index = length
        break
print("\n分位点为%s的句子长度:%d." % (quantile, index))


# 绘制句子长度累积分布函数图

plt.plot(sent_length, sent_pentage_list,linewidth=4)
plt.hlines(quantile, 0, index, colors="c", linestyles="dashed",linewidth=4)
plt.vlines(index, 0, quantile, colors="c", linestyles="dashed",linewidth=4)
plt.text(0, quantile, str(quantile),fontsize=10)
plt.text(index, 0, str(index))
plt.title("句子长度累积分布函数图",fontsize=20)
plt.xlabel("句子长度",fontsize=15)
plt.ylabel("句子长度累积频率",fontsize=15)
plt.savefig("./句子长度累积分布函数图.png")
plt.show

分位点为0.9的句子长度:172.在这里插入图片描述

大多数样本的句子长度集中在1-200之间,句子长度累计频率取0.90分位点,则长度为172左右。

二、LSTM模型构建与评估

LSTM模型架构
在这里插入图片描述
导库

import pickle
import numpy as np
import pandas as pd
from keras.utils import np_utils, plot_model
from keras.models import Sequential
from keras.preprocessing.sequence import pad_sequences
from keras.layers import LSTM, Dense, Embedding, Dropout

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

2.1 数据导入预处理

filepath = 'data_single.csv' #数据
input_shape = 180            #设置长度
model_save_path = 'corpus_model.h5' #模型保存位置

df = pd.read_csv(filepath)
df.head()

在这里插入图片描述

2.1.1 获取标签和字符字典列表

取出标签,和数据;再去重。

# 标签及词汇表
labels, vocabulary = list(df['label'].unique()), list(df['evaluation'].unique())
labels

[‘正面’, ‘负面’]

vocabulary

[‘用了一段时间,感觉还不错,可以’,
‘电视非常好,已经是家里的第二台了。第一天下单,第二天就到本地了,可是物流的人说车坏了,一直催,客服也帮着催,到第三天下午5点才送过来。父母年纪大了,买个大电视画面清晰,趁着耳朵还好使,享受几年。’,
‘电视比想象中的大好多,画面也很清晰,系统很智能,更多功能还在摸索中’,
‘不错’,
‘用了这么多天了,感觉还不错。夏普的牌子还是比较可靠。希望以后比较耐用,现在是考量质量的时候。’,
‘物流速度很快,非常棒,今天就看了电视,非常清晰,非常流畅,一次非常完美的购物体验’,
‘非常好,客服还特意打电话做回访’,
‘物流小哥不错,辛苦了,东西还没用’,
‘送货速度快,质量有保障,活动价格挺好的。希望用的久,不出问题。’,
‘非常漂亮,也非常清晰,反应速度也快。’,
‘很不错家里都喜欢。。。一次买了三台’,
‘送货非常快!质量非常好,这次购物非常愉快!!’,
‘58好大……都不错。看质量咯’,
‘物流很快,物有所值,值得信赖。依旧会关顾!谢谢商家!’,
‘这价钱超值,收到货马上装上看了一下。很清晰式样也蛮好!赞赞……’,

构建每个字符,去重后的集合。

# 构造字符级别的特征
string = ''
for word in vocabulary:
#     print(word)
    string += word

vocabulary = set(string)
print(vocabulary)
print(len(vocabulary))

在这里插入图片描述
2154

一共有2154个词,2个类别

对每个字符都进行编码

word_dictionary = {
   word: i+1 for i, word in enumerate(vocabulary)}
word_dictionary

在这里插入图片描述
获取反转的字符编码

inverse_word_dictionary = {
   i+1: word for i, word in enumerate(vocabulary)}
inverse_word_dictionary

在这里插入图片描述

设置词汇表大小,标签类别数量

vocab_size = len(word_dictionary.keys()) # 词汇表大小
label_size = len(label_dictionary.keys()) # 标签类别数量

2.1.2 将文本和类别编码

将文本按照字典进行编码

x = [[word_dictionary[word] for word in sent] for sent in df['evaluation']]
x

在这里插入图片描述

编码后,还需要切割填充,网络对于每一个样本数据的特征长度要求都是一致的

x = pad_sequences(maxlen=input_shape, sequences=x, padding='post', value=0)
x
  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
首先,我们需要准备好数据集。假设我们有一组交通流量的时间序列数据,每个时间点的数据包括一段时间内通过某个路段的车辆数。我们可以按照时间顺序将数据集划分为训练集和测试集,然后对数据进行归一化处理,使其在0~1之间。 接下来,我们可以开始搭建LSTM模型。在Keras中,LSTM模型的搭建可以分为四个步骤: 1.导入所需的库和模块,包括Keras、numpy等。 2.准备训练数据和测试数据,对数据进行归一化处理。 3.定义LSTM模型的结构。在这里,我们可以设置LSTM层的神经元数量、输入数据的形状、输出层的激活函数等。 4.编译和训练模型。在编译模型时,我们可以设置损失函数、优化器和评估指标。在训练模型时,我们可以设置批量大小、迭代次数等参数。 下面是一个简单的Keras代码示例,用于构建LSTM模型并预测短时交通流量: ```python from keras.models import Sequential from keras.layers import LSTM, Dense import numpy as np # 准备训练数据和测试数据 # ... # 定义模型结构 model = Sequential() model.add(LSTM(64, input_shape=(input_shape, 1))) model.add(Dense(1, activation='linear')) # 编译模型 model.compile(loss='mse', optimizer='adam', metrics=['mse']) # 训练模型 model.fit(train_X, train_y, epochs=100, batch_size=32) # 预测测试数据 y_pred = model.predict(test_X) ``` 在这个代码示例中,我们首先导入所需的库和模块。接着,我们准备训练数据和测试数据,并对数据进行归一化处理。然后,我们定义LSTM模型的结构,包括一个LSTM层和一个全连接层。在模型的编译和训练过程中,我们设置了损失函数、优化器和评估指标。最后,我们用训练好的模型预测测试数据。 需要注意的是,LSTM模型是非常灵活的,可以根据具体的问题进行调整。例如,我们可以添加多个LSTM层、调整LSTM层的神经元数量、调整全连接层的激活函数等。此外,我们还可以尝试使用其他类型的循环神经网络,例如GRU。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驭风少年君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值