基于多项贝叶斯的三分类的情感分析实现

2023-11-13

写在前面

本实验报告是一篇很水的水课的期末大作业,代码、数据集均为原创,意在用最少的代码和最简单的数据集完成老师留下的题目,仅供交流学习使用,禁止直接洗稿嗷!!!

目录

写在前面

一、实验目的

二、实验手段和方法

三、实验内容

四、实验总结


 

一、实验目的

情感分析是自然语言处理领域中的一项重要任务,其目的是通过分析文本中的语义与情感信息,判断出其中表达的情绪情感倾向。三分类的情感分析在实际应用中具有广泛的应用价值。

三分类的情感分析可以用于企业对自己的产品、服务等品牌形象进行监测和评估。通过对消费者的评论和反馈进行情感分析,企业可以了解到消费者对于自己的品牌形象的整体评价以及不同方面的优劣势,从而为企业的营销策略提供宝贵的参考。三分类的情感分析可以用于舆情监测与管理。政府部门、媒体等单位可以通过对社会大众的言论、评论等进行情感分析,了解群众的情感倾向和态度,为公共政策的制定和应对突发事件等提供有效的参考。三分类的情感分析也可以用于客户服务管理。通过对消费者的投诉、反馈等请求进行情感分析,企业可以快速了解到消费者的需求和问题,并采取相应的措施进行问题解决,提升客户满意度。

三分类的情感分析在商业、政治、社会等领域都具有重要的应用价值。本项目的实验目的就是通过构建并优化情感分析模型,实现快速准确地对文本情感进行分类,为各行业提供更加精细化、智能化的处理和解决方案,从而带来更高效、更便捷的服务与体验。

二、实验手段和方法

本次实验实现的是在网购场景下对用户评价进行情感分析的模拟

在训练阶段我们主要使用了Python中的一些常用的机器学习库和技术,包括pandas、sklearn、joblib等。其中,pandas是一种处理数据的工具,可以读取CSV等格式的数据文件,并进行数据预处理和清洗;sklearn则提供了丰富的机器学习模型和算法,如朴素贝叶斯、支持向量机、随机森林等,以及数据预处理和模型评估等功能;joblib则是一个可用于在内存中缓存Python函数调用结果的工具。

数据集sentiment_data.csv方面为了防止和其他同学撞车,我直接在网络上找了240多条包括积极、消极、中性情感的英文商品评价,用"0" 表示正面情感,"1" 表示负面情感,"2" 表示中性情感

保存好训练出的模型后就可以进行使用,对需要判断情绪的语料进行分析判断了。

三、实验内容

1.训练模型

import pandas as pd

from sklearn.pipeline import Pipeline

from sklearn.feature_extraction.text import TfidfVectorizer

from sklearn.model_selection import GridSearchCV

from sklearn.metrics import accuracy_score

from sklearn.naive_bayes import MultinomialNB

from joblib import dump, load



# 读入数据

data = pd.read_csv('sentiment_data.csv')



# 划分数据集

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(data['text'], data['label'], test_size=0.2, random_state=42)



# 定义管道

pipeline = Pipeline([

    ('tfidf', TfidfVectorizer(stop_words='english')),

    ('clf', MultinomialNB())

])



# 定义参数空间

params = {

    'tfidf__max_df': [0.8, 0.9],

    'tfidf__ngram_range': [(1, 1), (1, 2)],

    'clf__alpha': [0.1, 0.5, 1.0],

}



# 使用GridSearchCV进行参数选择

grid_search = GridSearchCV(pipeline, params, cv=5, n_jobs=-1, verbose=1)

grid_search.fit(X_train, y_train)



# 测试模型

y_pred = grid_search.predict(X_test)



# 计算准确率

accuracy = accuracy_score(y_test, y_pred)

print('Accuracy:', accuracy)

# 输出最佳参数

print('Best params:', grid_search.best_params_)

# 将训练好的模型保存为model.pkl文件

dump(grid_search.best_estimator_, 'model.pkl', compress=1)

这段代码使用了pandas、sklearn和joblib等Python库,首先读取了一个CSV格式的情感数据集,然后将其分为训练集和测试集。接着,使用sklearn中的Pipeline创建了一个文本分类管道,其中包括TfidfVectorizer(基于TF-IDF的文本向量化工具)和MultinomialNB(多项式朴素贝叶斯分类器)等模块。通过定义参数空间,并使用GridSearchCV(网格搜索交叉验证)寻找最优的模型参数组合,进一步优化了模型性能。最后,使用joblib库中的dump方法将训练好的模型保存至磁盘中,以备后续使用。

运行结果如下:

 

这输出中的"Fitting 5 folds for each of 12 candidates, totalling 60 fits"表示使用了网格搜索和交叉验证的方式,对12组超参数进行了训练和评估,并将数据集划分成了5份,每次使用其中4份训练模型,1份评估模型的性能,重复5次。这样就得到了60个模型,以便寻找在给定参数空间中性能最佳的模型。

"Accuracy: 0.88"表示通过测试集对训练好的模型进行验证并计算了准确率。具体来说,这里的准确率为88%,即用训练好的模型对测试集进行预测时,有88%的样本被正确分类。因此,可以认为这个模型的性能比较好。

"Best params: {'clf__alpha': 0.5, 'tfidf__max_df': 0.8, 'tfidf__ngram_range': (1, 1)}"则表示找到了在给定参数空间内性能最佳的模型所使用的超参数组合。具体来说,这里的最佳超参数为:'clf__alpha'为0.5(多项式朴素贝叶斯分类器的平滑指数),'tfidf__max_df'为0.8(TF-IDF向量化时忽略文档频率大于0.8的特征),'tfidf__ngram_range'为(1, 1)(向量化时只考虑单个词语的出现频率)。这些超参数可以在构建模型时使用,以获得更好的分类性能。

运行结束后,会将效果最好的模型保存下来,文件名为model.pkl.

2.数据集

为防止和其他同学撞车,本次实验的数据集并不是来源于各大下载网站的主流数据集,而是我找的240多条真实网购评价,并且这些评价均用"0" 表示正面情感,"1" 表示负面情感,"2" 表示中性情感。这样的数据集可以满足本次学习目的的实验需要,也让我理解了数据集内部的奥秘,相同的方法我们可以自己构建实现其他场景下分析的数据集了。

 

3.模型的实际应用

在搞好数据集,写好训练代码,完成了训练后,我们终于得到了新鲜出炉的数据集,接下来就是对数据集的实际应用环节了

首先,首先调用joblib库中的load()函数加载已经训练好的模型,然后定义了一个文本预处理的函数,用于去除标点符号、特殊字符,转换成小写等操作。接着定义了一个情感分类的函数,该函数首先使用文本预处理函数对输入的文本进行预处理,然后使用训练好的模型对文本进行情感分类,最终返回相应的情感类别。在测试代码中,调用情感分类函数对输入的一段文本进行情感分类,并输出相应的结果。

import joblib

import re



# 加载训练好的模型

model = joblib.load('model.pkl')



# 定义文本预处理函数

def preprocess_text(text):

    # 将所有字母转为小写

    text = text.lower()

    # 去除标点符号和特殊字符

    text = re.sub(r'[^\w\s]', '', text)

    # 去除多余空格

    text = re.sub(r'\s+', ' ', text).strip()

    return text



# 定义情感分类函数

def classify_sentiment(model, text):

    # 对输入文本进行预处理

    text = preprocess_text(text)

    # 使用训练好的模型对处理后的文本进行分类

    label = model.predict([text])[0]

    # 根据分类结果返回情感类别

    if label == 0:

        return "Positive"

    elif label == 1:

        return "Negative"

    else:

        return "Neutral"



# 测试代码

if __name__ == "__main__":

    # 需要测试的文本

    text = "I hated it."

    # 对文本进行情感分类

    label = classify_sentiment(model, text)

    # 输出分类结果

    if label == "Positive":

        print(f"待检测的文本'{text}' 是一个积极的评论!")

    elif label == "Negative":

        print(f"待检测的文本'{text}' 是一个消极的评论!")

    else:

        print(f"待检测的文本'{text}' 是一个中性的评论!")

如图所示,我们顺利地实现了对文本的情感分类,能够将输入的文本自动分类为积极、消极或中性等三种情感类别。这样的分类器在实际应用中有着广泛的辅助价值,能够帮助用户迅速了解大量文本数据所表达的情感倾向,从而更好地判断和决策。

在训练模型的过程中,需要进行大量的数据预处理、特征选取、模型调优等操作,这些都需要精心设计和耐心实验。同时,还需要充分考虑到文本数据的特殊性质,如文本长度、语言风格、语义多样性等,以及数据集的规模、质量、分布等因素,才能够获得高效且准确的分类器。对于一些复杂结构、深层次表达的文本,可能需要进一步的优化和改进。因此,我们需要不断地优化这个训练模型,提高它的准确率让它更好地服务于各种应用场景。

四、实验总结

通过本次实验,我学习并掌握了文本分类中的多项式朴素贝叶斯算法,并使用sklearn库中的pipeline、TfidfVectorizer和GridSearchCV等功能来构建和优化文本情感分类模型。在实验中,我首先采用pandas库读入数据,然后使用train_test_split函数将数据集划分为训练集和测试集,接着定义了一个包括tf-idf特征提取和多项式朴素贝叶斯分类器的管道,并使用GridSearchCV函数来搜索最优参数组合。

在实现过程中,我遇到了一些困难,其中最大的困难是对于文本预处理的不熟悉,例如如何去除标点符号和特殊字符、如何去除多余空格,以及如何使用pipeline和GridSearchCV函数进行模型构建和调优等问题。但通过查阅相关资料和参考别人的经验,我成功地克服了这些困难,不断地优化了算法,提高了模型的准确性和稳定性。

最终,我将训练好的模型保存为model.pkl文件,并使用joblib库进行加载和预测。利用预处理函数 preprocess_text 和 classify_sentiment 函数,我可以输入待检测的文本,快速地对其进行情感分类,并输出相应的结果。整个实验过程让我深刻认识到了文本分类算法的重要性和应用场景,同时也掌握了一些常用的数据处理和机器学习工具,对我的学习和研究都具有非常大的帮助。

通过本次实验,我深刻认识到了文本分类算法在自然语言处理领域中的重要性和广泛应用场景。在实现过程中,管道和GridSearchCV函数都让我受益匪浅。管道能够将多个数据处理和模型构建步骤串联起来,方便了代码的编写和维护;而GridSearchCV函数则能够自动搜索最优参数组合,减少了参数调整的负担,提高了模型的效率。我也通过调整参数组合,不断优化模型,使得模型的准确率不断提高,从而感受到了解决实际问题的成就感和满足感。

最后,我非常感谢老师的耐心指导和教授的知识,没有老师的培养和教育,我不可能这么顺利地完成本次实验。在以后的学习和工作中,我会更加努力地学习和实践,不断提高自己的技能和能力,为实现个人价值和社会贡献做出更多的努力。谢谢!

(想起来也没法洗稿哈哈哈因为数据集我没放进来哈哈哈哈哈)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于多项贝叶斯的三分类的情感分析实现 的相关文章

  • “NoneType”对象不可订阅?

    list1 name1 info1 10 list2 name2 info2 30 list3 name3 info3 50 MASTERLIST list1 list2 list3 def printer lst print Availa
  • 理解Python中的元类和继承[重复]

    这个问题在这里已经有答案了 我对元类有一些困惑 具有继承性 class AttributeInitType object def init self kwargs for name value in kwargs items setattr
  • Python lambda 函数没有在 for 循环中正确调用[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 中的 Tkinter 制作一个计算器 我使用 for 循环来绘制按钮 并且尝试使用 lambda 函数 以便仅在按下按钮时调用按钮的操作 而不是在程序启动时立即调用 然而 当我尝试这
  • 数据操作 startdate enddate python pandas

    我有一个促销描述数据集 其中包含有关正在运行的各种促销活动及其开始日期 结束日期的信息 promo item start date end date Buy1 get 1 A 2015 01 08 2015 01 12 Buy1 get 1
  • 箱线图与箱线图有何不同?

    我想知道当我们在海生图书馆中有箱线图时为什么会有箱线图 我知道一件事是箱线图优化了表示数据的方式 特别是对于大型数据集 但我不知道为什么 除此之外 我没有任何充分的理由使用箱线图 箱线图将中位数显示为中心线 第 50 个百分位数 然后将第
  • MySQL 的 read_sql() 非常慢

    我将 MySQL 与 pandas 和 sqlalchemy 一起使用 然而 它的速度非常慢 对于一个包含 1100 万行的表 一个简单的查询需要 11 分钟以上才能完成 哪些行动可以改善这种表现 提到的表没有主键 并且仅由一列索引 fro
  • 将新形状传递给“np.reshape”

    Within numpy ndarray reshape https docs scipy org doc numpy reference generated numpy ndarray reshape html the shape参数是一
  • Python:如何删除圆括号内的文本?

    我试过了 但没用 return re sub myResultStats text 建议 thanks 尝试这个 return re sub myResultStats text 括号表示捕获组 因此您必须转义它们
  • 使用 Flask 时在 Python 中实现持久数据库连接的最佳实践

    我的问题是关于在生产环境或其他关注性能的环境中使用 Flask 时处理数据库连接的推荐方法 在 Flask 中 g 对象可用于存储内容 并且可以将打开的数据库连接放置在那里 以允许应用程序在同一请求期间的后续数据库查询中重用它们 但是 g
  • 通过 pyodbc 连接到 Azure SQL 数据库

    我使用 pyodbc 连接到本地 SQL 数据库 该数据库工作正常 SQLSERVERLOCAL Driver SQL Server Native Client 11 0 Server localdb v11 0 integrated se
  • python中的语音识别持续时间设置问题

    我有一个 Wav 格式的音频文件 我想转录 我的代码是 import speech recognition as sr harvard sr AudioFile speech file wav with harvard as source
  • 从文件中读取单词并放入列表中

    本质上 我有一个巨大的文件 所有文件包含每行多个单词 每个单词用空格分隔 有点像这样 WORD WORD WORD WORD ANOTHER WORD SCRABBLE BLAH YES NO 我想要做的是将文件中的所有单词放入一个巨大的列
  • Emacs:调试Python的方法

    我把这个贴在程序员 stackexchange com https softwareengineering stackexchange com questions 29844 emacs methods for debugging pyth
  • captureWarnings 设置为 True 不会捕获警告

    我想记录所有警告 我以为这样的设定captureWarnings to True应该可以解决问题 但事实并非如此 代码 import logging import warnings from logging handlers import
  • 在 python 中计时时,我应该如何考虑 subprocess.Popen() 开销?

    编码社区的成员比我更聪明 我有一个 python 问题要问你们 我正在尝试优化一个 python 脚本 该脚本 除其他外 返回子进程执行和终止的挂钟时间 我想我已经接近这样的事情了 startTime time time process s
  • NumPy 数组不可 JSON 序列化

    创建 NumPy 数组并将其保存为 Django 上下文变量后 加载网页时收到以下错误 array 0 239 479 717 952 1192 1432 1667 dtype int64 is not JSON serializable
  • 使用 JSON 可序列化枚举自动生成棉花糖模式

    创建与我的模型相同的棉花糖模式的日子已经一去不复返了 我发现这个优秀的答案 https stackoverflow com a 42892443 4097322这解释了我如何使用简单的装饰器从 SQA 模型自动生成模式 因此我实现了它并替换
  • 如何在特定时间启动Tornado周期性回调?

    目前在我的 Tornado 应用程序中 我正在使用定期调用回调PeriodicCallback每隔一小时 像这样 import tornado ioloop from tornado ioloop import PeriodicCallba
  • Python中如何实现相对导入

    考虑 stuff init py mylib py Foo init py main py foo init py script py script py想要进口mylib py 这只是一个示例 但实际上我只想在父目录中进行模块的相对导入
  • 继承自 NumPy 数组的类如何更改其自身的值?

    我有一个继承自 NumPy n 维数组的简单类 我想要该类的两个方法可以更改该类实例的数组值 其中一种方法应将类实例的数组设置为类实例的列表数据属性的值 另一种方法应将一些列表值附加到类实例的数组中 我不确定如何实现这一点 但我的尝试如下

随机推荐

  • Springmvc 学习心得

    1 三层架构的介绍和mvc的设计模式 Springmvc的特点 清晰的角色划分 每个功能模块对应一个组件 1 前端控制器 DispatchServlet 2 处理器映射器 HanderMapping 根据 requestMapping 找到
  • Java单元测试框架-1-TestNg初识

    目录 1 1xUnit整体作用 1 2着重介绍Junit TestNg 1 3TestNg测试框架介绍 1 4Eclipse安装TestNG 1 5TestNg测试 1 1xUnit整体作用 xUnit是各种代码驱动测试框架的统称 这些框架
  • @property详细解读

    property 这个关键字 学过iOS的一定会经常用 但是如果你问一个人 property是干嘛用的 可能就会有人一脸茫然地问你 不就是声明属性用的么 这话当然对 那么 property的背后的机制是什么 是如果声明属性 做了哪些事情呢
  • 谈谈代码走读

    代码走读的重要性就不说了 我想谈谈对代码走读的总体认识 首先代码走读前 代码必须编译通过 强类型检查的语言 比如JAVA 自带的编译器就够了 如果是弱类型检查的语言 比如C C 应该用辅助的静态检查工具 比如lint 进行检查 毕竟机器发现
  • 刷题集——POJ 2179 Fliptile(枚举+模拟)

    Fliptile Time Limit 2000MS Memory Limit 65536K Total Submissions 28860 Accepted 10139 Description Farmer John knows that
  • vue element-ui 侧边栏刷新高亮丢失问题解决

    改造之前 侧边栏刷新高亮丢失 用的是rooter link包裹 代码如下
  • JS逆向steam登录

    JS逆向steam登录 前言 我们爬虫有时候 会遇到登录才能获取到数据的情况 最开始的时候我们只需要加入请求的data参数就可以 可是现在网站为了反爬 对登录的密码或者账号都做了加密处理 如果我们不破解出这些加密的密码或者账号 就没办法实现
  • 数据库报Connection is read-only. Queries leading to data modification are not allowed

    数据库报Connection is read only Queries leading to data modification are not allowed 具体是某张表的插入操作时报的错误 问题排查过程 这个超过是批量操作发生的 第一
  • Linux-du命令

    du命令 说明 du命令也是查看使用空间的 但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看 还是和df命令有一些区别的 参数 a或 all 显示目录中个别文件的大小 b或 bytes 显示目录或文件大小时 以b
  • EL表达式语言

    引用 http blog 163 com s zhchluo blog static 1501470820075205739439 基本语法 一 EL简介 1 语法结构 expression 2 与 运算符 EL 提供 和 两种运算符来存取
  • 【uniapp】this有时为啥打印的是undefined?(箭头函数修改this)

    博主 初映CY的前说 前端领域 本文核心 uniapp中this指向问题 前言 this大家知道是我们当前项目的实例 我们可以在这个this上面拿到我们原型上的全部数据 这个常用在我们在方法中调用其他方法使用 一 uniapp中this指向
  • Cplex—java集成,idea配置 步骤大全 windows版本

    首先搜索官网cplex下载安装包 本次示例以windows版本 1 双击打开安装包 2 选择简体中文 3 都是默认 修改路径的同学请记得自己的安装路径后面配置环境变量要用 4 这里我已经安装过了中间步骤直接跳过 5 接下来我们需要在java
  • 郑州大学校园网故障问题解决方法

    1 郑州大学校园网学生用户使用指南 可进入郑州大学网络管理中心网站 校园网交流QQ群 群一475137403 群二685466506 微信公众号 郑州大学网络管理中心 一 校园网注册 1 微信扫码并关注 郑州大学网络管理中心 点击进入微信公
  • FFMPEG对于rtp的推流以及VLC验证

    前言 参考资料 https blog csdn net zhoubotong2012 article details 86711097 https blog csdn net zhoubotong2012 article details 8
  • 2021-10-23

    对于算法题 还是要及时地进行总结和收获 不然 对于核心的知识掌握过几天就忘记了 相当于之前付出的努力都打了水漂 多浪费啊 LRU缓存机制 LRU 缓存机制 运用你所掌握的数据结构 设计和实现一个 LRU 最近最少使用 缓存机制 实现 LRU
  • 【转】在java中,OOA是什么?OOD是什么?OOP是什么?

    Object Oriented Analysis 面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后 按照面向对象的思想来分析问题 OOA与结构化分析有较大的区别 OOA所强调的是在系统调查资料的基础上 针对OO方法所需要的素
  • C++ vector容器-44-vector插入和删除以及存取

    本篇继续学习vector容器 前面学习了vector是一个单端数组 也就是说vector的插入和删除 基本上都是在数组的末端进行 本篇要学习的vector插入和删除的方法就能体现这个特点 最后学习vector的存取操作 1 vector的插
  • 论文笔记 2023.5.22

    图像分类的深度卷积神经网络模型综述 图像分类的过程 图像预处理 图像特征提取 人工提取 传统图像分类算法 卷积操作提取 卷积神经网络 使用分类器对图像进行分类 以图像分类为载体 深度卷积神经网络模型主要包括以下四个类别 1 经典深度卷积神经
  • KVM处理器管理和硬件辅助虚拟化技术

    KVM处理器管理和硬件辅助虚拟化技术 Intel 在2006年发布了硬件虚拟化技术 其中支持X86体系结构的称为Intel VT x技术 AMD称为SVM技术 VT x引入了一种新的处理器操作 叫做VMX Virtual MachineEx
  • 基于多项贝叶斯的三分类的情感分析实现

    写在前面 本实验报告是一篇很水的水课的期末大作业 代码 数据集均为原创 意在用最少的代码和最简单的数据集完成老师留下的题目 仅供交流学习使用 禁止直接洗稿嗷 目录 写在前面 一 实验目的 二 实验手段和方法 三 实验内容 四 实验总结 一