keras+IMDB情感分析

news2024/9/23 14:39:07

目录

  • 简介
    • IDMB数据集
  • 数据预处理
    • 数据加载
    • 数据清洗
    • 保存经过清洗后的数据
    • 训练测试数据集分割
    • 文字编码
    • 词嵌入
  • 模型构建
    • 模型训练
    • 训练效果
      • 模型评分
      • 模型预测及混淆矩阵
      • 查看F1 Score、召回率等信息
    • 预测新的影评
  • 总结

  • 本博客参考:
    【python自然语言处理 周元哲著】
    【keras中文文档—超好用的中文文档】

简介

IDMB数据集

IDMB数据集包含了50000条数据,每条数据包括影评文字及其对应的标签

在这里插入图片描述

数据集下载地址如下:【kaggle IDMB dataset】

接下来我们希望能建立一个模型,在对该模型进行大量训练之后,该模型可以用于预测某一段影评文字正面或负面评价

数据预处理

数据加载

import pandas as pd
file_path='data/imdb_from_kaggle.csv'
init_data=pd.read_csv(file_path)
init_data.head()

结果
在这里插入图片描述

import matplotlib.pyplot as plt
init_data['sentiment'].value_counts().plot(kind='bar')
plt.show()

在这里插入图片描述

from wordcloud import WordCloud
cloud_positive = WordCloud().generate(init_data['review'][2])
cloud_negative = WordCloud().generate(init_data['review'][3])

plt.figure(figsize = (20,15))
plt.subplot(1,2,1)
plt.imshow(cloud_positive)
plt.title('Positive review')

plt.subplot(1,2,2)
plt.imshow(cloud_negative)
plt.title('Negative review')
plt.show()

我们已知数据集中的第3项和第4项分别为正向和负向评价,我们通过词云的方式查看每个影评中都说了什么
在这里插入图片描述上面图片中竟然有<br/>标签,这说明每个影评中都可能存在有与影评内容无关的(或是我们无法解析的,比如emoji表情)元素,我们需要对其进行清除

数据清洗

import re
# 清除影评中所有的链接
def remove_url(text):
    url_tag = re.compile(r'https://\S+|www\.\S+')
    text = url_tag.sub(r'', text)
    return text
# 清除影评中所有的HTML标签
def remove_html(text):
    html_tag = re.compile(r'<.*?>')
    text = html_tag.sub(r'', text)
    return text
# 清除影评中所有的标点符号
def remove_punctuation(text): 
    punct_tag = re.compile(r'[^\w\s]')
    text = punct_tag.sub(r'', text) 
    return text
# 清除影评中所有的特殊符号    
def remove_special_character(text):
    special_tag = re.compile(r'[^a-zA-Z0-9\s]')
    text = special_tag.sub(r'', text)
    return text
# 清除影评中所有的emoji
def remove_emojis(text):
    emoji_pattern = re.compile("["
                               u"\U0001F600-\U0001F64F"  # 表情符号
                               u"\U0001F300-\U0001F5FF"  # 符号和象形文字
                               u"\U0001F680-\U0001F6FF"  # 交通和地图符号
                               u"\U0001F1E0-\U0001F1FF"  # 标志(iOS)
                               "]+", flags=re.UNICODE)
    text = emoji_pattern.sub(r'', text)
    return text 
# 执行所有函数,返回数据清洗后的结果
def clean_text(text):
    text = remove_url(text)
    text = remove_html(text)
    text = remove_punctuation(text)
    text = remove_special_character(text)
    text = remove_emojis(text)
    text = text.lower()# 影评文字转小写
    
    return text

上面代码片段参考kaggle原作者:Thi Khuyen LE

保存经过清洗后的数据

# 生成一个新的数据列用来存放清洗后的影评
init_data['processed'] = init_data['review'].apply(lambda x: clean_text(x))
init_data.head()

在这里插入图片描述

# 生成一个新的数据列用于将'positve'或'negative'转化为数字
init_data['label'] = init_data['sentiment'].apply(lambda x:1 if x=='positive' else 0 )
init_data.head()

在这里插入图片描述

训练测试数据集分割

# 使用sklearn的train_test_split()函数对数据集进行分割,训练集:测试集=4:1
from sklearn.model_selection import train_test_split
x=init_data['processed']
y=init_data['label']
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2)

文字编码

我们都知道机器学习模型几乎是不能够直接使用自然语言作为输入的,这就需要我们将自然语言进行编码(转化为数字),这一过程有点像两个语言之间的翻译过程:使用一个字典做映射,该字典的key对应着一种语言,而value对应着另一种语言,使用这个字典,就可以将一种语言的一段话转化为另一种语言的版本,比如

# 有这样一段话:我是汤姆
# dict :['我':'I','是':'am','汤姆':'Tom']
# 中文版本:我是汤姆
# English vision:I am Tom

看完上面的例子我们就要考虑了,将一段自然语言转化为一串数字,中间的这个桥梁:字典,该怎么构建?我们先看下面这个来自Keras的API

keras.preprocessing.text.Tokenizer(nb_words=None, filters=base_filter(), 
    lower=True, split=" ")

keras为我们提供了一个Tokenizer模块,它用于向量化文本,或将文本转换为序列(即单词在字典中的下标构成的列表,从1算起)的类。

from tensorflow.keras.preprocessing.text import Tokenizer
# 使用Tokenizer建立一个有5000个单词的字典
token=Tokenizer(num_words=5000)
# 读取所有的训练数据影评,按照每个英文单词在影评中出现的次数进行排序,
# 排序前5000名的单词将会被列入字典
token.fit_on_texts(x_train)
token.word_index

结果
在这里插入图片描述
ok,现在我们得到了期望的字典,下面就需要将每一条影评都转化为一串数字,Tokenizer类提供了一个方法

x_train_seq=token.texts_to_sequences(x_train)
x_test_seq=token.texts_to_sequences(x_test)

效果
在这里插入图片描述到现在似乎数据预处理就要接近尾声了,但是还存在着一个问题。我们再来梳理一遍我们接下来要做什么:构建多层感知机模型>>>将数据传给模型进行训练>>评价模型。

我们来思考一下,在以往对机器学习模型进行训练时,每一条训练数据是不是拥有相同的数据维度?但是现在我们得到的x_train_seq也即将作为训练数据,其中包含了40000条数据,每条数据的维度相同吗
在这里插入图片描述
我们使用keras中的sequence.pad_sequences()函数解决该问题,该函数将会在元素长度小于maxlen时,在数据后部填充0以达到该长度。长于maxlen的序列将会被截断,以使其匹配目标长度。
在这里插入图片描述于是,到现在为止训练集和测试集的维度分别为(40000,100),(10000,100)

词嵌入

数据预处理已经基本完成,但是我们得到的每一条训练数据都是一串串数字,在语义上没有任何关联,为了让每一个文字都有关联性,我们在接下来构建模型时将使用keras中的Embedding嵌入层将数字列表转换为向量列表

【什么是词嵌入】
【为什么要使用词嵌入】

模型构建

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, Dense,Dropout,Flatten
from tensorflow.keras.utils import plot_model # 绘制模型的结构图
model1=Sequential()
model1.add(Embedding(output_dim=32,input_dim=5000,input_length=100))
model1.add(Dropout(0.2))
model1.add(Flatten())
model1.add(Dense(units=256,activation='relu'))
model1.add(Dropout(0.35))
model1.add(Dense(units=1,activation='sigmoid'))

模型训练

model1.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
plot_model(model1, show_shapes = True)
train_history=model1.fit(x_train,y_train,batch_size=100,
                        epochs=10,verbose=2,
                        validation_split=0.2)

结果
在这里插入图片描述

训练效果

模型评分

在这里插入图片描述

模型预测及混淆矩阵

在这里插入图片描述

# 混淆矩阵可视化
from sklearn.metrics import confusion_matrix,ConfusionMatrixDisplay
cm = ConfusionMatrixDisplay(confusion_matrix(y_test,prediction1.reshape(10000,)), display_labels = ['Negative', 'Positive'])
plt.figure(figsize = (5,5))
cm.plot()
plt.title('Confusion matrix')
plt.show()

在这里插入图片描述

查看F1 Score、召回率等信息

from sklearn.metrics import classification_report
print(classification_report(y_test,prediction1.reshape(10000,)))

在这里插入图片描述

预测新的影评

接下来我们去豆瓣上复制两条关于电影《黑豹2》的评价并交给模型去预测

def text_prediction(text):
    text_seq=token.texts_to_sequences([text])
    seq_after_pad=sequence.pad_sequences(text_seq,maxlen=100)
    return seq_after_pad

text_list=["""The worst movie of Marvel Stage 4, not even as good looking as Thor 4, using top notch ingredients to make a bad dish,worse than Black Panther 1, which I didn't expect, just as bad looking as Black Widow. The first half of the film was made into documentaries,\
           In Memory of T 'Chara and The Quest for Water, which made you fall asleep, If you can believe that the most advanced country in the world sends two small fighter jets to fight the Namor, \
           and uses a ship to fight the people under the sea without even building a plane, the final factor of the war is very funny. I suggest you keep your eyes on it. When you get to the rear, \
           just like you did when you watched the Surprise team, you expect to see an Easter egg. It's really disappointing. I was expecting Black Panther 2 to be a success. I think this is even dragging down the stage 4 average""",
          """It's good to watch, and there are plenty of female characters. The story is very patient in shaping Su Rui's growth, but I really like her stubbornness. The conflict in the movies is more realistic than the super-English storyline, \
          which threatens to destroy the universe at every turn. People fight and turn against each other, and it's not even because they have any real conflict of interest"""]
for text in text_list:
    new_text=text_prediction(text)
    predict_new_text=model1.predict_classes(new_text)
    print(predict_new_text)

结果
在这里插入图片描述

很明显,我们输入的影评是一条坏评一条好评,而模型得到了相同的结果!大功告成!

总结

本篇博客我们使用多层感知机实现了简单的自然处理过程,数据集采用了经典的IDMB数据集,通过数据清洗等一系列操作将影评等自然语言处理为一个个向量数据并作为训练数据喂给了机器学习模型,后者通过训练能完成简单的影评情感分析功能,从最终的模型得分来看,达到了较好的效果,但是仍然存在需要改进的地方:比如数据预处理部分的Tokenizer字典建立、机器学习模型结构及训练轮次等等,今天的学习过程暂且告一段落

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/341151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库索引篇(二叉树/B-Tree)对比结构讲解

我们可以先看一下 二叉树的一个结构 简单将数据分成左右两侧 左侧小于36 右侧大于36 在下面再以这种方式继续划分 但二叉树的结构就有一个非常大的弊端 如果我们后续插入的数据全部小于 或 大于36 他就会 变成这样 一个链表 查询效率大大降低 因为 比如 你想找什么数据 都会…

岁月闲思——时间给我地思考

岁月闲思——时间给我地思考 2022年6月10日&#xff0c;明天又一个周末&#xff0c;成人地时间总是让人感觉一天很慢&#xff0c;一周以及一年反而很快。 下班到家&#xff0c;吃过长辈做的手工凉皮&#xff0c;得空坐在电脑面前敲击点文字&#xff0c;记录下时间留给自己地印…

Docker--consul

目录 前言 一、Consul 简介 1.1、 consul 概述 1.2 、consul 的两种模式 1.3、consul 提供的一些关键特性 二、Consul 容器服务更新与发现 三、consul 部署 3.2、查看集群信息 四、registrator服务器 consul-template 五、consul 多节点 前言 服务注册与发现是微服…

软件测试面试十大必考题目(通用)

目录 &#xff08;1&#xff09; 为什么想进本公司&#xff1f; &#xff08;2&#xff09; 喜欢这份工作的哪一点&#xff1f; &#xff08;3&#xff09; 自己的优缺点为何&#xff1f; &#xff08;4&#xff09; 对公司的了解有多少&#xff1f; &#xff08;5&#xf…

C++创建多线程的方法总结

下个迭代有个任务很有趣&#xff0c;用大量的线程去访问一个接口&#xff0c;直至其崩溃为止&#xff0c;这就需要多线程的知识&#xff0c;这也不是什么难事&#xff0c;总结一下C中的多线程方法&#xff1a;std、boost、pthread、windows api。 目录 一、多线程预备知识 二…

图解浏览器渲染页面详细过程

渲染详细过程 产生渲染任务&#xff0c;开启渲染流程 当浏览器的网络线程收到 HTML 文档后&#xff0c;会产生一个渲染任务&#xff0c;并将其传递给渲染主线程的消息队列。 在事件循环机制的作用下&#xff0c;渲染主线程取出消息队列中的渲染任务&#xff0c;开启渲染流程。…

IDEA 常用快捷键回顾

一 Alt 数字键 1. Alt 1: 打开项目 2. Alt 2: 打开Favorites 3. Alt 3: 打开Find 4. Alt 4: 打开Run 5. Alt 5: 打开Debug 6. Alt 6: 打开当前所在文件 7. Alt 7: 打开Structure 8. Alt 8: 打开Services 9. Alt 9: 打开Git日志 二 Ctrl 其他键 1. Ctrl…

【Flink】详解JobGraph

概述 JobGraph 是 StreamGraph 优化后的产物&#xff0c;客户端会将优化后的 JobGraph 发送给 JM。接下来的文章涉及到一些前置知识点&#xff0c;没有看前几期的小伙伴最好看一下前几期&#xff1a; 【Flink】详解StreamGraph【Flink】浅谈Flink架构和调度【Flink】详解Flin…

【Flutter入门到进阶】Dart进阶篇---进阶用法

1 Dart对象扩展 1.1 extension 1.1.1 介绍 可以在不更改类或创建子类的情况下&#xff0c;向类添加扩展功能的一种方式。灵活使用 extension 对基础类进行扩展&#xff0c;对开发效率有显著提升。 1.1.2 需求 在开发项目中碰到需求&#xff1a;将单位为分的数值转换成单位为…

RabbitMQ(黑马spring cloud笔记)

MQ 目录MQ一、同步通讯和异步通讯1. 同步通讯2. 异步通讯二、RabbitMQ1. 部署2. 架构3. 常见消息模型3.1 基本消息队列&#xff08;Basic Queue&#xff09;3.2 工作消息队列&#xff08;Work Queue&#xff09;3.3 发布订阅&#xff08;Publish、Subscribe&#xff09;4. 消息…

TPAMI 2022 | RC-Explainer:图神经网络的强化因果解释器

文章目录 一、论文关键信息二、基础概念三、主要内容1. Motivations2. Insights3. 解决方案的关键四、总结与讨论CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题:Reinforced Causal Explainer for Graph Neural Networks 期刊信息:IEEE Transact…

【C++】内存管理

&#x1f345;不同的数据放在不同的地方&#xff0c;需要内存管理 目录 ☃️1.C/C中的内存分布 ☃️2.C语言中动态内存管理方式 ☃️3.C内存管理方式 &#x1f41d;3.1 new/delete操作内置类型 &#x1f41d;3.2 new和delete操作自定义类型 &#x1f41d;3.3 operator n…

FISCO BCOS节点扩容和使用console进行群组扩容

一、安装并启动FISCO BCOS 搭建单机单群组4节点的教程查看&#xff1a;https://blog.csdn.net/yueyue763184/article/details/128924144?spm1001.2014.3001.5501 二、下载扩容脚本 在fisco目录下输入以下命令&#xff1a; curl -#LO https://raw.githubusercontent.com/FI…

155、【动态规划】leetcode ——474. 一和零:三维数组+二维滚动数组(C++版本)

题目描述 原题链接&#xff1a;474. 一和零 解题思路 &#xff08;1&#xff09;三维数组 本题是要在已有的字符串中&#xff0c;找到给定的m个0和n个1&#xff0c;组出最大的子集。将字符串集合中的各个字符串看作物品&#xff0c;m个0和n个1看作背包的重量&#xff0c;则该…

jenkins +docker+python接口自动化之jenkins容器安装python3(二)

jenkins dockerpython接口自动化之jenkins容器安装python3&#xff08;二&#xff09; 目录&#xff1a;导读 前提是在docker下已经配置好jenkins容器了&#xff0c;是将python安装在jenkins容器下的 1、先看你的jenkins是否安装好 2、以root权限进入jenkins容器&#xff1…

NLP方向的论文可投的核心期刊

目录1、《计算机仿真》北大核心、科技核心2、《通信学报》北大核心、科技核心、CSCD核心3、《计算机科学》北大核心、EI来源期刊、CSCD核心4、《计算机工程》北大核心、科技核心5、《计算机应用》北大核心、科技核心、CSCD核心6、《计算机工程与应用》北大核心、科技核心、CSCD…

Python - 数据容器dict(字典)

目录 字典的定义 字典数据的获取 字典的嵌套 字典的各种操作 新增与更新元素 [Key] Value 删除元素 pop和del 清空字典 clear 获取全部的键 keys 遍历字典 容器通用功能总览 字典的定义 使用{}&#xff0c;不过存储的元素是一个个的&#xff1a;键值对&#…

golang的web框架Gin(一)---Gin的Resutful风格

Restful风格是什么&#xff1f; REST与技术无关&#xff0c;代表的是一种软件架构风格&#xff0c;REST是Representational State Transfer的简称&#xff0c;中文翻译为“表征状态转移”或“表现层状态转化”。 RESTFUL特点包括&#xff1a; 每一个URI代表1种资源&#xff…

STM32F103C8T6—库函数应用I2C/SPI驱动OLED显示中文、字符串

文章目录1. I2C与SPI通信协议对比2. 四脚OLED与六脚OLED3. I2C驱动OLED显示oled.h & oled.c&#xff1a;汉字取模 & oledfont.h&#xff1a;main.c 显示示例&#xff1a;连线方法&#xff1a;4. SPI驱动OLED显示1. I2C与SPI通信协议对比 I2C&#xff08;Inter-Integra…

基于springboot的毕业设计管理系统

摘要随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…