Keras多层感知器模型对IMDB进行情感分析

news/2024/12/2 16:35:56/

面向:对keras、多层感知器模型、IMDb数据有一定认识
参考教材《TensorFLow+Keras深度学习人工智能应用》
实现工具:jupyter notebook

基本流程

  • (1)数据预处理
  • (2)建立多层感知器模型
  • (3)训练模型
  • (4)评估及预测模型
  • (5)任意测试一条影评数据
  • (6)扩展
    • ①使用较大字典提取更多文字
    • ②keras使用RNN模型进行Imdb分析
    • ③keras使用LSTM模型进行Imdb分析

(1)数据预处理

imdb数据集下载地址
下载之后保存到本地文件夹即可

# 导入相关库
from keras.preprocessing import sequence # 后期对数字长度控制的向量
from keras.preprocessing.text import Tokenizer # 字典库 将文字列表转为数字列表
import re
# 定义正则去除文本中的html标签
def re_tags(text):re_tag = re.compile(r'<(^>)+>')return re_tag.sub('',text)

在这里插入图片描述

import os
# 读取imdb文件
def readfile(filetype):path = '../data/aclImdb/'# filetype train or testpositive_path = path + filetype + '/pos/'# 定义文件列表filelist =[]# 遍历filetype类型下postive的文件for f in os.listdir(positive_path):filelist += [positive_path + f]negative_path = path + filetype + '/neg/'for f in os.listdir(negative_path):filelist += [negative_path + f]print('read:',filetype,'files',len(filelist))# 前面12500条积极数据 后面12500消极数据all_labels = ([1] * 12500 + [0] * 12500)all_texts = []for fi in filelist:# 读取所有file文件with open(fi,encoding='utf-8') as fileinput:all_texts += [re_tags(' '.join(fileinput.readlines()))]return all_labels,all_texts
# 读取训练数据
y_train,train_text = readfile('train') 

在这里插入图片描述

# 读取测试数据
y_test,test_text = readfile('test')

在这里插入图片描述

token = Tokenizer(num_words =2000) # 指定字典存储的最大个数 只存储出现次数最多的2000个词
token.fit_on_texts(train_text) # 提取train_text中排名前2000的词
x_train_seq = token.texts_to_sequences(train_text) # 将影评文字转换为数字列表
x_test_seq = token.texts_to_sequences(test_text)
# 数字列表序列化 统一长度为100 不足往前补零 多了切割前面多余的部分
x_train = sequence.pad_sequences(x_train_seq,maxlen=100)
x_test = sequence.pad_sequences(x_test_seq,maxlen=100)

(2)建立多层感知器模型

需要先加入嵌入层将“数字列表“转为”向量列表”

# 导入相关库
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Flatten
from keras.layers.embeddings import Embedding
# 初始化
model = Sequential()
# 嵌入层
# 2000个维度的字典 每个数字列表长度为100 输出维度32维
model.add(Embedding(input_dim=2000,input_length=100,output_dim=32))
model.add(Dropout(0.2))
# 平坦层
model.add(Flatten())
# 隐层
model.add(Dense(units=256,activation='relu'))
model.add(Dropout(0.35))
# 输出层
model.add(Dense(units=1,activation='sigmoid'))
model.summary()

在这里插入图片描述

(3)训练模型

import numpy as np
# 将y_train转为numpy类型 
y_train = np.array(y_train)# 定义训练方式
# 二分的 交叉熵损失函数 adam优化器 accuracy作为评判标准
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
# 开始训练
train_history = model.fit(x_train,y_train,validation_split=0.2,epochs=10,batch_size=100,verbose=2)

在这里插入图片描述

(4)评估及预测模型

# 模型评估
# 转为numpy类型
y_test = np.array(y_test)
scores = model.evaluate(x_test,y_test)
scores[1]

在这里插入图片描述

# 模型预测 tensorflow2.6以下 可以用 model.predict_classes()一个方法
predict_x = model.predict(x_test)
# 取最大值下标的索引  实际测试predict_x 中只有一个值 返回都是0(最大值下标都是0)
# predict = np.argmax(predict_x,axis=1)
# 转为0 1  在reshape成一维矩阵 转为整数类型
predict = np.round(predict_x).reshape(-1).astype('int32')
# 建立可视化显示预测函数
SentimentDict = {1:'正面的',0:'负面的'}
def display_test_sentiment(i):# 显示原文print(test_text[i])# 显示预测结果print('labels:',SentimentDict[y_test[i]],'predict:',SentimentDict[predict[i]])
display_test_sentiment(1)

在这里插入图片描述

display_test_sentiment(12501)

在这里插入图片描述

(5)任意测试一条影评数据

# 首先定义文本测试函数
def predict_review(input_text):# 先转数字格式input_seq = token.texts_to_sequences([input_text])# 限定长度pad_input_seq = sequence.pad_sequences(input_seq,maxlen=100)# 进行测试predict_result = np.round(model.predict(pad_input_seq)).reshape(-1).astype('int32')print(SentimentDict[predict_result[0]])

这里找的是《美女与野兽》的一星影评做测试

predict_review('''Where do I start. This adaptation of Disney's 1991 Beauty and the Beast was an utter disappointment. Emma Watson as Belle was extremely unconvincing from the start to the end. She had the same expressions as the actress from Twilight. The animators did a terrible job with the Beast. He looked fake and lifeless. They could have used special makeup to create the beast similar to the Grinch where we get to see Jim Carrey's expressions. The side character animations were poorly executed. Overall I felt the film was rushed as there was lack of compassion and chemistry between the characters. There was a lot of CGI and green screen which could have been replaced by normal acting, because then why make an animated version of an animated film? This is by far the worst remake of an animated classic.''')

在这里插入图片描述

九星测试

predict_review('''Very much like the cartoon! The singing was really good ... Emma Watson ... what a star! The acting was great. I was in two minds about seeing this as it's my favorite fairy story and my favorite Disney cartoon. I was in tears at the end, even though I knew the story backwards. Why didn't I give it 10 ... The thing that let it down a little for me was the make up of The Beast, I thought it was a little too scary for the film and the wolves were quite a bit nastier than the cartoon version. Young children may be scared by these things.''')

在这里插入图片描述

(6)扩展

①使用较大字典提取更多文字

仅展示需要修改的地方

token = Tokenizer(num_words =3800) # 指定字典存储的最大个数 只存储出现次数最多的3800个词
token.fit_on_texts(train_text) # 提取train_text中排名前3800的词
# 数字列表序列化 统一长度为380 不足往前补零 多了切割前面多余的部分
x_train = sequence.pad_sequences(x_train_seq,maxlen=380)
x_test = sequence.pad_sequences(x_test_seq,maxlen=380)
# 初始化
model = Sequential()
# 嵌入层
# 3800个维度的字典 每个数字列表长度为380 输出维度32维
model.add(Embedding(input_dim=3800,input_length=380,output_dim=32))
model.add(Dropout(0.2))
# 平坦层
model.add(Flatten())
# 隐层
model.add(Dense(units=256,activation='relu'))
model.add(Dropout(0.35))
# 输出层
model.add(Dense(units=1,activation='sigmoid'))
# 首先定义文本测试函数
def predict_review(input_text):# 先转数字格式input_seq = token.texts_to_sequences([input_text])# 限定长度pad_input_seq = sequence.pad_sequences(input_seq,maxlen=380)# 进行测试predict_result = np.round(model.predict(pad_input_seq)).reshape(-1).astype('int32')print(SentimentDict[predict_result[0]])

在这里插入图片描述
准确率从80%提升到85%

②keras使用RNN模型进行Imdb分析

from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Flatten
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import SimpleRNN
# 初始化
model = Sequential()
# 嵌入层
# 3800个维度的字典 每个数字列表长度为380 输出维度32维
model.add(Embedding(input_dim=3800,input_length=380,output_dim=32))
model.add(Dropout(0.2))
# 平坦层
# model.add(Flatten())
# RNN
model.add(SimpleRNN(units=16)) # 16个神经元
# 隐层
model.add(Dense(units=256,activation='relu'))
model.add(Dropout(0.35))
# 输出层
model.add(Dense(units=1,activation='sigmoid'))
model.summary()

在这里插入图片描述
在这里插入图片描述
准确率大概在82%左右

③keras使用LSTM模型进行Imdb分析

from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Flatten
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import SimpleRNN,LSTM
# 初始化
model = Sequential()
# 嵌入层
# 3800个维度的字典 每个数字列表长度为380 输出维度32维
model.add(Embedding(input_dim=3800,input_length=380,output_dim=32))
model.add(Dropout(0.2))
# 平坦层
# model.add(Flatten())
# RNN
# model.add(SimpleRNN(units=16)) # 16个神经元
# LSTM
model.add(LSTM(32))
# 隐层
model.add(Dense(units=256,activation='relu'))
model.add(Dropout(0.2))
# 输出层
model.add(Dense(units=1,activation='sigmoid'))
model.summary()

在这里插入图片描述
在这里插入图片描述
模型评估准确率在85%


http://www.ppmy.cn/news/521596.html

相关文章

VMware SD-WAN Edge 3X00操作指南

交流、咨询需求&#xff1a;V&#xff1a;carrmi 型号&#xff1a;Edge 3X00 部件号&#xff1a; Edge 3400&#xff0c; Edge 3800&#xff0c; Edge 3810 SD-WAN Edge 3X00 系列包括以下内容&#xff1a; • 6 个千兆以太网连接 • 局域网/广域网可配置&#xff0c;…

年薪90万程序员,被月入3800公务员狂怼!到底什么工作更香?

01 程序员与公务员都是属于令人艳羡的工作&#xff0c;程序员收入高&#xff0c;公务员胜在稳定。两个不同的工种各有优势。但最近一位网友发言&#xff0c;掀起了工作应该追求收入&#xff0c;还是追求稳定的讨论。 有位网友在职业论坛上分享自己的工作经历&#xff1a;自己…

3800亿交易额背后的超级秘密,是谁在操盘京东618的大数据运维?

在京东整个电商体系中&#xff0c;交易系统占据着其中的半壁江山&#xff0c;购物车、结算、库存、价格等相关的环节都包含在其中&#xff0c;可以说交易系统的高可用能力基本上决定了整个京东商城的高可用能力。 但在京东这样的大规模分布式系统面前&#xff0c;每时每刻服务…

月薪3800的毕业生到上市公司产品经理在到CEO的一份历程

简述下自己成为产品经理的一个简短的历程吧&#xff0c;为了给读者一些帮助以及躲过一些不必要的坑快速上手这一条路&#xff0c;期间也自学过seo…从产品目前走到了悲剧创业的ceo&#xff08;岌岌可危&#xff09; 大学期间的经历比自己想象过的要差很多 当高中毕业来到大学时…

网工自述:在誉天学习的一年里,我的工资从3800涨到15k,而且收获了爱情。

省流&#xff1a; 在誉天学习的一年里&#xff0c;我的工资从3800涨到15k&#xff0c;而且收获了爱情。 起因&#xff1a; 2020年&#xff0c;拿着专科学历毕业的我在北京的街头举足无措&#xff0c;本来就是就业寒冬&#xff0c;而且还没有任何优势&#xff0c;每天醒来第一…

学生个人网页模板 简单个人主页--贝聿铭人物介绍 6页带表单 带报告3800字

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | ‍个人博客网站 | ‍个人主页介绍 | 个人简介 | 个人博客设计制作 | 等网站的设计与制作 | 大学生个人HTML网页设计作品 | HTML期末大学生网页设计作业…

3800 万条敏感记录在“裸奔”!微软这个默认配置把自己都“坑”了

你有这种习惯吗&#xff1a;不论使用新设备还是新软件&#xff0c;都会仔细查看使用说明&#xff0c;再根据需求将默认配置针对性地改一遍&#xff1f; 按理说这是应该的&#xff0c;但冗长的说明事项每多一行似乎都在将我们逼退一步&#xff0c;加之一般情况下保持默认配置也…

poj 3800

其实这道题我也不想说什么了&#xff0c;真的水....... 他其实已经超出了水题的范围了&#xff0c;我是打了4s的程序然后直接交了&#xff0c;在线交的......真的无压力........ 其实他是道好题&#xff0c;不断鼓励着骗分的全体茁壮发展...... 题目&#xff1a;http://poj.org…