基于主题的情绪分析:将主题建模与情绪分析联系起来

news2024/11/23 2:07:56

一、说明

        朋友们,大家好!现在我们学习了如何在Twitter数据上进行主题建模和情感分析,但我们还没有将这两种技术联系在一起。我们如何获得与每个主题相对应的情绪?在这篇文章中,我将向您展示进行基于主题的情绪分析的方法。让我们潜入!

二、准备数据

        我们仍将使用我们通过废弃与卡塔尔世界杯相关的推文来准备的数据。如果您忘记了该怎么做,请查看此处。同样,我们将抽取 300 条推文用于演示目的。

import pandas as pd
import pickle
import requests
import random 

with open('world_cup_tweets.pkl', 'rb') as f:
    data = pickle.load(f)

tweets = data.Tweet_processed.to_list()
tweets = random.sample(tweets, 300)

        然后我们将模型和拥抱脸令牌存储在相应的变量中。我们将定义我们的功能:分析。如果您不知道如何创建自己的拥抱面孔令牌,请查看我在下一页中的上一篇文章。

model = "cardiffnlp/twitter-roberta-base-sentiment-latest"
hf_token = "YOUR OWN TOKEN"

API_URL = "https://api-inference.huggingface.co/models/" + model
headers = {"Authorization": "Bearer %s" % (hf_token)}

def analysis(data):
    payload = dict(inputs=data, options=dict(wait_for_model=True))
    response = requests.post(API_URL, headers=headers, json=payload)
    return response.json()

三、情绪分析与扭曲

        在此阶段之前,我们在进行情绪分析时遵循相同的步骤。从这里开始,我们的代码中将发生一些小的变化,因为我们将专注于获取每条推文的每个情绪概率分数。

# Following is the code for doing Topic Based Sentiment Analysis. 
# Not only we need to get the higher score, 
# we need to store the sentiment probability score for every tweet for further calculation. 

import pandas as pd

tweets_analysis = []

for tweet in tweets:
    try:
        sentiment_result = analysis(tweet)[0]
        sentiment_probabilities = {label['label']: label['score'] for label in sentiment_result}
        tweets_analysis.append({'tweet': tweet, **sentiment_probabilities})
    except Exception as e:
        print(e)

        Python 中的语法用于解压缩字典。在这里,它用于使用字典解包将字典作为键值对添加到字典中。这将创建一个新字典,其中包含 中的键和键值对。**sentiment_probabilities{'tweet': tweet}tweetsentiment_probabilities

df = pd.DataFrame.from_records(tweets_analysis, columns=['tweet'] + list(sentiment_probabilities.keys()))
df = df.reset_index(drop=True)

df.head()
df.to_pickle('world_cup_tweets_sentiment_score.pkl')

        我们可以用上面的代码创建一个新的数据框。在此代码中,从字典列表创建熊猫数据帧。该方法用于从字典列表创建数据帧,其中每个字典对应于数据帧中的一行。tweets_analysisfrom_records()

        该参数指定数据帧的列名。第一列设置为 ,其余列使用该函数设置为字典的键。columns'tweet'sentiment_probabilitieslist()

        然后,该方法用于重置数据帧的索引,从 0 开始并删除上一个索引。生成的数据帧将为每个推文提供一行,其中包含推文文本列和每个情绪标签的概率。reset_index()

让我们检查数据集的前几行。如果它看起来正确,不要忘记腌制以备后用。

 

四、使用 BERTopic 进行主题建模

现在我们将使用 BERTopic 进行主题建模。如果您需要更新该方法,请查看下面列出的我之前的帖子。

texts=df['tweet']
from bertopic import BERTopic

topic_model = BERTopic(language="english", calculate_probabilities=True, verbose=True)
topics, probs = topic_model.fit_transform(texts)

        在这里,我们将获得每条推文及其相应的主题。然后我们将结果存储在数据框中。

df2 = pd.DataFrame(topic_model.get_document_info(texts))
df2.head()

 

五、将情绪与主题合并

        正如我们所看到的,相同的推文存储在 df2 中的列名“文档”和 df 中的列名“tweet”下。我们可以先合并两个数据框,然后从两个数据框中删除一列。

df_merge = pd.merge(df,df2, how='inner', left_on = 'tweet', right_on = 'Document')
df_merge = df_merge.drop('Document', axis=1)
df_merge.head()

我们可能不会得到相同的结果,因为采样过程是随机完成的,但数据结构应该是相同的。请仔细检查您的结果。然后,我们将创建一个新的数据框,用于存储每个主题及其相应的情绪概率分数。

df_topic_sentiment = df_merge.groupby('Topic').agg({'neutral': 'mean', 'positive': 'mean', 'negative': 'mean'})
df_topic_sentiment = df_topic_sentiment.reset_index()
df_topic_sentiment

        在此代码中,通过使用该方法按现有数据帧的值对行进行分组来创建新的数据帧。df_topic_sentimentdf_mergeTopicgroupby()

        然后,该方法用于将聚合函数应用于每组行。在这种情况下,使用字典语法计算 、 和列的平均值。这将创建一个新的数据帧,每个唯一 ,其中每行显示相应主题中所有推文中每个情绪标签的平均值。agg()neutralpositivenegative{'neutral': 'mean', 'positive': 'mean', 'negative': 'mean'}Topic

        最后,该方法用于重置数据帧的索引,这会将值从索引移动到常规列。生成的数据帧将具有每个唯一 的一行,其中 、 、 和 的列显示每个主题中每个标签的平均情绪值。reset_index()TopicTopicTopicneutralpositivenegative

       为了更好地了解每个主题代表什么,我们可以获取每个主题的频率并将其存储在数据框中。然后使用公共列“主题”将df_topic_sentiment合并到它上面。

freq = topic_model.get_topic_info()
df_freq = pd.DataFrame(freq)
df_new = pd.merge (df_freq, df_topic_sentiment, how = 'inner', on = 'Topic' )
df_new

        我们可以添加一个得分最高的新列,然后定义一个函数来显示情绪标签,这是最高分对应的标签。

# add new column with the highest score
score_cols = ['neutral', 'positive', 'negative']
df_new['highest_score'] = df_new[score_cols].max(axis=1)

# define function to calculate sentiment label
def get_sentiment(row):
    if row['positive'] == row['highest_score']:
        return 'positive'
    elif row['negative'] == row['highest_score']:
        return 'negative'
    else:
        return 'neutral'

# apply function to each row and create new column
df_new['sentiment'] = df_new.apply(get_sentiment, axis=1)

df_new

        在我们抽样的 300 条推文中,我们可以得出结论,大多数主题都传达了积极的情绪。

六、总结

        在这篇文章中,我向您展示了如何进行基于主题的情绪分析。此功能尚未包含在BERTopic库或Hugging Face的情感分析模型中。通过一些数据操作,我们使之成为可能。

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

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

相关文章

Kubernetes 企业级高可用部署

1、Kubernetes高可用项目介绍 单master节点的可靠性不高,并不适合实际的生产环境。Kubernetes 高可用集群是保证 Master 节点中 API Server 服务的高可用。API Server 提供了 Kubernetes 各类资源对象增删改查的唯一访问入口,是整个 Kubernetes 系统的数…

云原生 AI 工程化实践之 FasterTransformer 加速 LLM 推理

作者:颜廷帅(瀚廷) 01 背景 OpenAI 在 3 月 15 日发布了备受瞩目的 GPT4,它在司法考试和程序编程领域的惊人表现让大家对大语言模型的热情达到了顶点。人们纷纷议论我们是否已经跨入通用人工智能的时代。与此同时,基…

linux pwn 相关工具

环境搭建 虚拟机安装 镜像下载网站为了避免环境问题建议 22.04 ,20.04,18.04,16.04 等常见版本 ubuntu 虚拟机环境各准备一份。注意定期更新快照以防意外。虚拟机建议硬盘 256 G 以上,内存也尽量大一些。硬盘大小只是上界&#…

RocketMQ、Dashboard部署以及安全设置

RocketMQ、dashboard部署以及安全设置 一、启动RocketMQ1.1 下载RocketMQ1.2 修改配置文件1.2.1 修改nameServer Jvm内存配置1.2.2 修改broker参数 1.3 启动1.3.1 启动NameServer1.3.2 启动Broker1.3.3 测试是否启动成功1.3.3.1 测试消息发送1.3.3.2 测试消息接收1.3.3.3 Java程…

SSM——用户、角色、权限操作

1. 数据库与表结构 1.1 用户表 1.1.1 用户表信息描述 users 1.1.2 sql语句 CREATE TABLE users( id varchar2(32) default SYS_GUID() PRIMARY KEY, email VARCHAR2(50) UNIQUE NOT NULL, username VARCHAR2(50), PASSWORD VARCHAR2(50), phoneNum VARCHAR2(20), STATUS INT…

Ceph入门到精通-Aws Iam(user,role,group,policy,resource)架构图和快速入门

-- Aws Iam(identity,user,role,group,policy,resource,)架构图和快速入门. 【官网】:Cloud Computing Services - Amazon Web Services (AWS) 应用场景 aws 云服务运维,devops过程中经常涉及各项服务,权限,角色的处理。 为了更好的使用各项…

C语言入门 Day_4 小数 字符和常量

目录 前言 1.浮点型 2.字符型 3.易错点​​​​​​​ 4.思维导图 前言 我们学习了C语言中用来表示整数的数据类型:整型(int),今天我们会学习用来表示小数的数据类型:浮点型(float) 1.浮点型 …

tinymce动态生成

最近在做一个vue项目, 其中用到了富文本tinymce插件,界面上需要有多个编辑器, 界面如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/f029b487c799482d8d53c2c31e07ccad.png 这里点击添加按钮, 需要动态添加tinymce组件 页面的元素 // item是v-for循环中的对象 <…

【第三阶段】kotlin语言的split

const val INFO"kotlin,java,c,c#" fun main() {//list自动类型推断成listList<String>val listINFO.split(",")//直接输出list集合&#xff0c;不解构println("直接输出list的集合元素&#xff1a;$list")//类比c有解构&#xff0c;ktoli…

linux下的lld命令

Linux下的lld命令的主要作用&#xff1a;用来查看程式运行所需的共享库&#xff08;动态链接库&#xff09;,常用来解决程式因缺少某个库文件而不能运行的一些问题。 1、首先ldd不是一个可执行程序&#xff0c;而只是一个shell脚本 2、ldd 的使用 lld 可执行程序或者动态库…

一维离散动力系统计算的基本理论

离散动力系统计算的基本理论 离散动力系统的基本概念与基本定理 离散动力系统的定义 形如 的迭代系统称为一个一阶离散动力系统。其中一阶指显式的仅依赖前一项类似得&#xff0c;我们可以定义m-阶离散动力系统 和更高维度的动力系统 不动点 不动点 周期轨道 周期与不变集 …

Android 组件

TextView 文本框 用于显示文本的一个控件。文本的字体尺寸单位为 sp 。sp: scaled pixels(放大像素). 主要用于字体显示。 文本常用属性 属性名说明id为TextView设置一个组件id&#xff0c;根据id&#xff0c;我们可以在Java代码中通过 findViewById()的方法获取到该对象&…

2011-2021年数字普惠金融指数Bartik工具变量法(含原始数据和Bartik工具变量法代码)

2011-2021年数字普惠金融指数Bartik工具变量法&#xff08;含原始数据和Bartik工具变量法代码&#xff09; 1、时间&#xff1a;2011-2020&#xff08;省级、城市&#xff09;&#xff0c;2014-2020&#xff08;区县&#xff09; 2、原始数据来源&#xff1a;北大金融研究中心…

IDEA 中Tomcat源码环境搭建

一、从仓库中拉取源代码 配置仓库地址、项目目录&#xff1b;点击Clone按钮&#xff0c;从仓库中拉取代码 Tomcat源码对应的github地址&#xff1a; https://github.com/apache/tomcat.git 二、安装Ant插件 打开 File -> Setting -> Plugins 三、添加Build文件 &…

UI设计师个人工作总结范文

UI设计师个人工作总结范文篇一 感受到了领导们“海纳百川”的胸襟&#xff0c;感受到了作为广告人“不经历风雨&#xff0c;怎能见彩虹”的豪气&#xff0c;也体会到了重庆广告从业人员作为拓荒者的艰难和坚定(就目前国内广告业而言&#xff0c;我认为重庆广告业尚在发展阶段并…

云曦暑期学习第五周——2022美亚杯个人赛

I.案件详情 于2022年10月&#xff0c;有市民因接获伪冒快递公司的电邮&#xff0c;不慎地于匪徒架设的假网站提供了个人信用咭资料导致经济损失。警方追查下发现当中一名受骗市民男子李大輝 (TaiFai) 的信用卡曾经被匪徒在区内的商舖购物。 后来警方根据IP地址&#xff0c;锁定…

(二分查找) 剑指 Offer 53 - I. 在排序数组中查找数字 I ——【Leetcode每日一题】

❓剑指 Offer 53 - I. 在排序数组中查找数字 I 难度&#xff1a;简单 统计一个数字在排序数组中出现的次数。 示例 1: 输入: nums [5,7,7,8,8,10], target 8 输出: 2 示例 2: 输入: nums [5,7,7,8,8,10], target 6 输出: 0 提示&#xff1a; 0 < n u m s . l e n g …

【Go语言】go_session(超级详细)

目录 前言附件代码审计Index函数Admin函数Flask函数server.py问题 思路本地搭建环境admin绕过SaveUploadedFile方法payload 总结 前言 国赛初赛有一道题目go session&#xff0c;用go的Gin框架和pongo2模板引擎写的&#xff0c;是关于go的pongo2模板注入和flask的热加载&#…