基于LSTM的IMDB电影评论情感分析


步骤

  1. 加载数据 (50K IMDB Movie Review)
  2. 数据清洗
  3. 编码“情感”
  4. 数据集划分(训练集和测试集)
  5. 对评论进行分词和截断/补零操作
  6. 构建神经网络模型
  7. 训练模型并测试

导入相关工具箱

import pandas as pd    # to load dataset
import numpy as np     # for mathematic equation
import nltk
from nltk.corpus import stopwords   # to get collection of stopwords
from sklearn.model_selection import train_test_split       # for splitting dataset
from tensorflow.keras.preprocessing.text import Tokenizer  # to encode text to int
from tensorflow.keras.preprocessing.sequence import pad_sequences   # to do padding or truncating
from tensorflow.keras.models import Sequential     # the model
from tensorflow.keras.layers import Embedding, LSTM, Dense,Dropout # layers of the architecture
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import ModelCheckpoint   # save model
from tensorflow.keras.models import load_model   # load saved model
import re

预览数据集

data = pd.read_csv('IMDB Dataset.csv')print(data)


Stop Word is a commonly used words in a sentence, usually a search engine is programmed to ignore this words (i.e. "the", "a", "an", "of", etc.)

设置停用词,英文中常见的停用词
此处需要下载nltk的stopwords,我选择了百度网盘,直接下载然后放到一个文件夹中D:\nltk_data\corpora

#nltk.download('stopwords')
english_stops = set(stopwords.words('english'))

数据清洗

原始评论数据并不“干净”,存在很多html标签、数字、大写字母、标点符号等等。预处理中需要对评论做预处理,包括去掉html标签,过滤掉停用词,删除标点和数字,将大写字母转成小写

编码正负情感

将正面和负面情感编码成整数,这里0代表负面情感negative,1代表正面情感(positive)

def load_dataset():df = pd.read_csv('IMDB Dataset.csv')x_data = df['review']       # Reviews/Inputy_data = df['sentiment']    # Sentiment/Output# PRE-PROCESS REVIEWx_data = x_data.replace({'<.*?>': ''}, regex = True)          # remove html tagx_data = x_data.replace({'[^A-Za-z]': ' '}, regex = True)     # remove non alphabetx_data = x_data.apply(lambda review: [w for w in review.split() if w not in english_stops])  # remove stop wordsx_data = x_data.apply(lambda review: [w.lower() for w in review])   # lower case# ENCODE SENTIMENT -> 0 & 1y_data = y_data.replace('positive', 1)y_data = y_data.replace('negative', 0)return x_data, y_datax_data, y_data = load_dataset()print('Reviews')
print(x_data, '\n')
print('Sentiment')
print(y_data)


划分数据集

80% 作为训练集
20% 作为测试集
,使用Scikit-Learn中的 train_test_split 方法。

x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size = 0.2)print('Train Set')
print(x_train, '\n')
print(x_test, '\n')
print('Test Set')
print(y_train, '\n')
print(y_test)


该函数能够输出训练集中单条评论最多的词语个数

def get_max_length():review_length = []for review in x_train:review_length.append(len(review))return int(np.ceil(np.mean(review_length)))

分词以及截断和补零

# ENCODE REVIEW
token = Tokenizer(lower=False)    # no need lower, because already lowered the data in load_data()
token.fit_on_texts(x_train)
x_train = token.texts_to_sequences(x_train)
x_test = token.texts_to_sequences(x_test)max_length = get_max_length()
print(max_length)x_train = pad_sequences(x_train, maxlen=max_length, padding='post', truncating='post')
x_test = pad_sequences(x_test, maxlen=max_length, padding='post', truncating='post')total_words = len(token.word_index) + 1   # add 1 because of 0 paddingprint('Encoded X Train\n', x_train, '\n')
print('Encoded X Test\n', x_test, '\n')
print('Maximum review length: ', max_length)


构建深度神经网络模型

Embedding Layer

LSTM Layer

Dense Layer

怎么调参:
EMBED_DIM
LSTM_OUT:LSTM输出维度,可以修改
深度可以改变:增减LSTM层,但是数据较少,过于多的层数会出现过拟合的现象,对于该小实验,不用过多的层数
input_length:输入单词的长度,原本为130,可以设的更小一点
epochs可以改为10,到10次迭代的时候可能收敛。
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(128, return_sequences=True)):可以修改为双向的LSTM

# ARCHITECTURE
EMBED_DIM =16
LSTM_OUT = 8model = Sequential()
model.add(Embedding(total_words, EMBED_DIM, input_length = max_length))
model.add(LSTM(LSTM_OUT, return_sequences=True))
model.add(LSTM(LSTM_OUT, return_sequences=True))
model.add(LSTM(LSTM_OUT, return_sequences=True))
model.add(LSTM(LSTM_OUT, return_sequences=True))
model.add(LSTM(LSTM_OUT))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer = Adam(1e-3), loss = 'binary_crossentropy', metrics = ['accuracy'])#metrics分类精度print(model.summary())


训练模型

batch_size 设置为128 ,epochs设置为5

添加 checkpoint当每个epoch训练完成精度有提升时,就更新保存的模型

epoches5轮训练
batch_size每次送入128个进入模型训练,cpu好就可以设置大一些
checkpoint每轮跑完训练好的模型进行保存,save_best_only=true最后只保存精度最高的模型
文件下有一个目录,模型自动存储在models/LSTM.h5,下次可以不用训练了,每次直接调用模型就可以了。

checkpoint = ModelCheckpoint('models/LSTM.h6',monitor='accuracy',save_best_only=True,verbose=1
)model.fit(x_train, y_train, batch_size = 128, epochs = 5, callbacks=[checkpoint])
y_pred = model.predict(x_test, batch_size = 64)
true = 0
for i, y in enumerate(y_test):if y_pred[i]>=0.7:y_pred[i]=1else:y_pred[i]=0if y == y_pred[i]:true += 1print('Correct Prediction: {}'.format(true))
print('Wrong Prediction: {}'.format(len(y_pred) - true))
print('Accuracy: {}'.format(true/len(y_pred)*100))


测试模型

测试样本测试,输出精度

y_pred = model.predict(x_test, batch_size = 64)
y_pred
y_pred = model.predict(x_test, batch_size = 128)
y_pred=np.argmax(y_pred,axis=-1)
true = 0
for i, y in enumerate(y_test):if y == y_pred[i]:true += 1print('Correct Prediction: {}'.format(true))
print('Wrong Prediction: {}'.format(len(y_pred) - true))
print('Accuracy: {}'.format(true/len(y_pred)*100))

加载已训练好的模型

用已经训练好的深度模型去预测一条新的电影评论的情感

loaded_model = load_model('models/LSTM.h5')

自行输入一条评论(用英文)

review = str(input('Movie Review: '))

预测之前这条新的评论也需要进行预处理

# Pre-process input
regex = re.compile(r'[^a-zA-Z\s]')
review = regex.sub('', review)
print('Cleaned: ', review)words = review.split(' ')
filtered = [w for w in words if w not in english_stops]
filtered = ' '.join(filtered)
filtered = [filtered.lower()]print('Filtered: ', filtered)

对这条新评论进行分词和编码

tokenize_words = token.texts_to_sequences(filtered)
tokenize_words = pad_sequences(tokenize_words, maxlen=max_length, padding='post', truncating='post')
print(tokenize_words)

结果显示了预测的置信度分数 confidence score

result = loaded_model.predict(tokenize_words)
print(result)

若置信度分数接近0则评论为负面 negative. 若置信度分数接近1则评论为正面 positive. 这里选择 0.7 作为置信度阈值,如果分数大于0.7判定为正面,如果分数小于0.7则判定为负面

if result >= 0.7:print('positive')
else:print('negative')

基于LSTM的IMDB电影评论情感分析相关推荐

  1. 【自然语言处理(NLP)】基于FNN网络的电影评论情感分析

    [自然语言处理(NLP)]基于FNN网络的电影评论情感分析 作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建 ...

  2. 基于Ernie-3.0的电影评论情感分析

    ★★★ 本文源自AlStudio社区精品项目,[点击此处]查看更多精品内容 >>> 本文使用了Ernie-3.0-medium-zh模型,对中文电影评论数据进行小样本的预训练学习. ...

  3. 基于LSTM的电商评论情感分析-TensorFlow2实现(内附源码)【自然语言处理NLP-100例】

  4. 从爬取豆瓣影评到基于朴素贝叶斯的电影评论情感分析(下)

    基于朴素贝叶斯的电影评论情感分析 用到的包:pandas.jieba(分词工具) file=open(r"review.txt",'r',encoding='utf-8') rev ...

  5. python电影评论情感分析_20行Tensorflow代码实现电影评论情感分析

    原标题:20行Tensorflow代码实现电影评论情感分析 背景 情感分析有很多的应用场景,比如做一个电商网站,卖家需要时刻关心用户对于商品的评论是否是正面的.再比如做一个电影的宣传和策划,电影在键盘 ...

  6. MOOC网深度学习应用开发3——Deep Dream、电影评论情感分析

    Deep Dream:随机噪点图向目标图转换的过程 经典卷积神经网络 电影评论情感分析 自然语言处理基础知识1 自然语言处理基础知识2--分词 自然语言处理基础知识3--词的数字化表示方法和词嵌入 电 ...

  7. 【Python自然语言处理】使用逻辑回归(logistic)对电影评论情感分析实战(超详细 附源码)

    需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一.舆情分析 舆情分析很多情况下涉及到用户的情感分析,或者亦称为观点挖掘,是指用自然语言处理技术.文本挖掘以及计算机语言学等方法来正确识别和提取文 ...

  8. Pytorch+Text-CNN+Word2vec+电影评论情感分析实战

    文章目录 0.前言 1.电影评论数据集 2.数据读取 3.数据预处理 4.准备训练和测试集 5.加载词向量模型Word2vec 6.定义网络 7.训练网络 8.测试网络和可视化 9.总结 0.前言 很 ...

  9. 基于 Transformer 模型的电影评论情感分类

    # -*- coding: utf-8 -*- """论文代码 基于Transformer模型的电影评论感情分析 - 环境 tensorflow==2.7.0 GPUnu ...

  10. 基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种

    基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种 ,含数据集可直接运行 完整代码下载地址:基于LSTM三分类的文本情感分 ...

最新文章

  1. Flask-Migrate拓展数据库表结构
  2. Java中的Serialization
  3. step1.day12 Linux下使用C语言编程基础总结
  4. 邮件服务器之POP3协议分析
  5. vue实现一个带搜索功能的列表_(Vue起步)2.模板指令:v-for / v-on / v-model
  6. @value 数组_为什么不推荐用for...in遍历数组
  7. Polygon Mesh Processing读书笔记——1三角网格Triangle Meshes
  8. 和baby的区别_姜涛状告白衣山猫?小伊伊有剧本?惟Baby整容?阿彩照骗?De劈腿?...
  9. c语言游戏计算器代码,C语言计算器代码.doc
  10. 2021 年产品沉思录精选集 PDF 下载及卷首语合集:像农夫一样耕耘和等待
  11. 2014-10-18 多玩初面
  12. IP子网划分的原理及应用
  13. 注册页面获取手机验证码
  14. casio计算机按键,有木有卡西欧991plus上面每个按键的功能
  15. .class .class 和 .class.class 和 .class>.class 比较
  16. 计算机网络常见名词及其解释
  17. 最简单的视频网站(JavaEE+FFmpeg) 转载自: Mr.Rico
  18. Flutter 2(1),还在等机会
  19. java字符串加密解密工具类
  20. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

热门文章

  1. Elasticsearch中keyword和numeric对性能的影响分析
  2. 第十三周项目2(1)
  3. R统计绘图-VPA(方差分解分析)
  4. 真正的数字化,是CEO决策的底层逻辑要变了
  5. word 计算机内存不足,word文档保存提示内存不足怎么办
  6. 数据结构-指针和结构体
  7. 迅盘技术(Robson)、Ready Boost和Ready Drive的区别
  8. Could not create the Java Virtual Machine
  9. 各向异性元件中的偏振效应
  10. 美通企业日报 | 今年中国私家车行驶里程同比大降18%;缤客发布2020年八大旅行趋势...