2023年第三届中国高校大数据挑战赛第二场赛题C:用户对博物馆评论的情感分析(附上代码与详细视频讲解)

问题重述:

博物馆是公共文化服务体系的重要组成部分。国家文物局发布, 2021 年我国新增备案博物馆 395 家,备案博物馆总数达 6183 家,排名全球前列;5605 家博物馆实现免费开放,占比达 90%以上;全国博物馆举办展览 3.6 万个,教育活动 32.3 万场;虽受疫情影响,全国

博物馆仍接待观众 7.79 亿人次。

但在总体繁荣业态下,一些地方博物馆仍存在千馆一面、公共文化服务供给同质化的尴尬局面,在发展定位、体系布局、功能发挥等方面尚需完善提升。这给博物馆基于自身特色进一步迈向真正的公共性提出了新课题,也即坚持守正创新,坚持直面公众和社会的公共文化服务的创造性转化、创新性发展。

为了提升博物馆公共服务水平,课题组收集大众点评平台上用户对南京市朝天宫、瞻园、甘熙宅第、江宁织造博物馆和六朝博物馆五个博物馆的点评数据,数据字段主要包括:用户编号、评论内容、评论时间等。

问题1:针对每位用户的评论,建立情感判别模型,判断评论内容的情感正反方向,输出评论内容的情感方向为正面、中立、负面, 并统计每个博物馆历史评论各个方向情感的比例分布情况。

问题 2:综合考虑评论内容中情感词、程度副词、否定词、标点符合等等影响情感方向的指标,建立情感得分评价模型,得到每位户评论的情感得分,并基于得分对五个博物馆进行客观排名。

问题 3:针对每位用户评论的内容,可通过事件抽取或实体抽取算法,从评论内容中抽取影响用户情感的关键事件或因素,如某用户评论“非常不错!环境高大上!好多是最近房地产开发盖新房子时新挖出来的,不错“,可得知该评论为正面情感,影响其正面评价的是” 房地产开发盖新房子时新挖的“、”环境高大上“两个因素。基于上述抽取的关键事件或影响因素,综合分析得到影响用户对五个博物馆情感的影响因素

问题 4:基于上述分析得到的数据结果,为五个博物馆撰写一段提升公共服务水平的可行性建议,建议要有理有据,且具有一定的可操作性。

问题分析

  1. 建立情感判别模型,对评论内容的情感方向进行分类(正面、中立、负面),并统计每个博物馆历史评论各个方向情感的比例。
  2. 建立情感得分评价模型,考虑情感词、程度副词、否定词、标点符号等因素,为每条评论打分,并基于得分对博物馆进行排名。
  3. 通过事件抽取或实体抽取算法,从评论中抽取影响用户情感的关键事件或因素,分析影响用户情感的因素。
  4. 基于以上分析,为五个博物馆提出提升公共服务水平的可行性建议。

解题代码

使用python脚本对数据集进行分析

import pandas as pd

# 加载数据
data_path = '数据-五个博物馆评论内容.xlsx'
df = pd.read_excel(data_path)

# 数据清洗
# 转换评论星级至正确的比例
df['评论星级(抓取的数据/10=评论星级)'] = df['评论星级(抓取的数据/10=评论星级)'].apply(lambda x: x / 10)

# 确保所有文本字段都是字符串类型
df['评论内容'] = df['评论内容'].astype(str)

# 处理时间数据,这里简单示例,实际情况可能需要根据时间数据的具体乱码情况做更复杂的处理
# 假设我们只是转换时间格式,并忽略乱码问题
df['时间(部分时间有乱码,或无法抓取,是平台后端问题,爬虫无法解决)'] = pd.to_datetime(df['时间(部分时间有乱码,或无法抓取,是平台后端问题,爬虫无法解决)'], errors='coerce')

# 查看处理后的数据
print(df.head())

# 注意:这里的时间处理仅为示例,根据实际乱码情况可能需要更详细的处理步骤

在这里插入图片描述
对于“赞”和“回应”这样的字段,NaN可能表示没有人点赞或回应。在进行数据分析时,我们可以选择将这些NaN值替换为0,表示“没有赞”或“没有回应”,而不是直接删除这些记录。这样,我们可以保留更多的评论数据进行分析,因为评论内容本身对于情感分析来说是最重要的。

# 处理NaN值,将“赞”和“回应”字段中的NaN替换为0
df['赞'].fillna(0, inplace=True)
df['回应'].fillna(0, inplace=True)

# 确认整个数据集处理情况
print(df.describe())  # 展示数据的统计概况来确认处理范围

在这里插入图片描述

# 对整个DataFrame按情感分数排序
df_sorted = df.sort_values(by='情感分数', ascending=False)

# 显示情感分数最高的评论
print("最积极的评论:")
print(df_sorted.iloc[0])

# 显示情感分数最低的评论
print("\n最消极的评论:")
print(df_sorted.iloc[-1])

# 如果想显示更多的积极或消极评论,可以调整iloc的索引,例如使用df_sorted.iloc[:5]来查看前5个最积极的评论

在这里插入图片描述

import jieba

# 自定义情感词典、程度副词典和否定词典
sentiment_dict = {
    "好": 1,
    "高兴": 2,
    "喜欢": 2,
    "棒": 2,
    "不错": 1,
    "差": -2,
    "失望": -2,
    "糟": -2,
    "讨厌": -2,
}

degree_dict = {
    "非常": 1.5,
    "很": 1.2,
    "稍微": 0.8,
    "一点": 0.5,
}

negation_dict = {
    "不": -1,
    "没": -1,
    "无": -1,
}

# 情感得分计算函数
def calculate_sentiment_score(text):
    words = list(jieba.cut(text))
    score = 0
    negation = 1
    degree = 1
    
    for word in words:
        if word in negation_dict:
            negation = -1
        elif word in degree_dict:
            degree = degree_dict[word]
        elif word in sentiment_dict:
            score += sentiment_dict[word] * negation * degree
            # Reset negation and degree
            negation = 1
            degree = 1
            
    return score

# 测试代码
comments = [
    "非常喜欢这个博物馆,展览很棒",
    "不是很好,稍微有点失望",
    "没那么差,但也没有很好",
    "真的很讨厌,完全失望",
]

for comment in comments:
    print(f"评论: {comment}, 情感得分: {calculate_sentiment_score(comment)}")

在这里插入图片描述

import pandas as pd
import jieba


xls = pd.ExcelFile(data_path)

all_museums_df_list = []

for sheet_name in xls.sheet_names:
    df = pd.read_excel(xls, sheet_name=sheet_name)
    df['评论内容'] = df['评论内容'].astype(str)  # 确保评论内容为字符串
    df['情感得分'] = df['评论内容'].apply(calculate_sentiment_score)
    df['博物馆名称'] = sheet_name
    all_museums_df_list.append(df)

all_museums_df = pd.concat(all_museums_df_list, ignore_index=True)

museum_avg_sentiment = all_museums_df.groupby('博物馆名称')['情感得分'].mean()
museum_ranking = museum_avg_sentiment.sort_values(ascending=False)

print("博物馆情感得分排名:")
print(museum_ranking)

在这里插入图片描述

import matplotlib.pyplot as plt

# 已给出的博物馆情感得分排名数据
museum_names = ["江宁织造博物馆", "六朝博物馆", "甘熙宅第", "瞻园", "朝天宫"]
sentiment_scores = [0.557347, 0.539564, 0.454345, 0.425397, 0.335504]
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
# 绘图
plt.figure(figsize=(10, 6))
plt.barh(museum_names, sentiment_scores, color='skyblue')
plt.xlabel('平均情感得分')
plt.title('博物馆情感得分排名')
plt.gca().invert_yaxis()  # 让最高得分的博物馆显示在最上面
plt.grid(axis='x')

# 显示图形
plt.show()

在这里插入图片描述

import pandas as pd
import jieba.analyse



# 初始化一个空字典来存储每个博物馆的关键词
museum_keywords = {}

# 遍历每个sheet
for sheet_name in xls.sheet_names:
    df = pd.read_excel(xls, sheet_name=sheet_name)
    df['评论内容'] = df['评论内容'].astype(str)  # 确保评论内容为字符串类型
    
    # 初始化一个列表来存储当前博物馆的所有关键词
    keywords_list = []
    
    # 提取每条评论的关键词
    for text in df['评论内容']:
        keywords = jieba.analyse.extract_tags(text, topK=5)
        keywords_list.extend(keywords)
    
    # 存储当前博物馆的关键词
    museum_keywords[sheet_name] = keywords_list

# 汇总分析结果
for museum, keywords in museum_keywords.items():
    print(f"博物馆: {museum}, 关键词: {set(keywords)}")

在这里插入图片描述

详细的视频讲解(代码文件内附视频讲解)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

plantUML使用指南之序列图

文章目录 前言一、序列图1.1 语法规则1.1.1 参与者1.1.2 生命线1.1.3 消息1.1.4 自动编号1.1.5 注释1.1.6 其它1.1.7 例子 1.2 如何画好 参考 前言 在软件开发、系统设计和架构文档编写过程中,图形化建模工具扮演着重要的角色。而 PlantUML 作为一种强大且简洁的开…

Kafka消费者重平衡

「(重平衡)Rebalance本质上是一种协议,规定了一个Consumer Group下的所有Consumer如何达成一致,来分配订阅Topic的每个分区」。 比如某个Group下有20个Consumer实例,它订阅了一个具有100个分区的Topic。 正常情况下&…

Linux的MySQL安装与卸载

安装与卸载 卸载安装配置yum源安装MySQL 声明一下本人用的Linux版本是CentOs7.9版本的。 卸载 如果我们用的云服务器,云服务器可能会自带MySQL或者mariadb(其实就是MySQL的一个开源分支),如果我们不想用自带的,需要先…

2023年全国职业院校技能大赛软件测试赛题第9套

2023年全国职业院校技能大赛 软件测试赛题第9套 赛项名称: 软件测试 英文名称: Software Testing 赛项编号: GZ034 归属产业: 电子与信息大类 赛项组别: 高等职业教育 …

“成像光谱遥感技术中的AI革命:ChatGPT应用指

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用,人工智能…

BUGKU-WEB ezbypass

题目描述 题目截图如下: 进入场景看看: 解题思路 代码审计题目发现需要构造一个字符串,使得它不包含字母、数字、特殊字符的PHP代码片段,长度小于105,然后传递给$codepost提交参数,eval(&…

【JS】浅谈防抖与节流

防抖与节流 前言一、防抖1.1是什么?1.2做什么?1.3应用场景?1.4实现原理? 二、节流是什么?2.1是什么?2.2做什么?2.3应用场景?2.4实现原理? 总结 前言 防抖与节流算是面试…

一起玩儿3D打印机——01 3D打印机初探

摘要:本文介绍3D打印技术的基本知识以及3D打印机的结构分类和组成 3D打印技术这几年得到了快速的发展,在一些特定领域和特定行业逐渐被越来越多的人所接受并大量使用。与之相关的供应链和产业链也日益壮大,并形成了完善的体系。 这次之所以…

虚拟化技术的介绍

查看是否支持虚拟化: Linux虚拟化平台安装 云服务类型: 华为云的介绍: 公有云配置 区域: 同一个区域中的云主机是可以互相连通的,不通区域云主机是不能使用内部网络互相通信的 选择离自己比较近的区域,可以减少网络延时卡顿 华为云yum仓库&…

[C语言] 数据存储

类型意义: 1.类型决定内存空间大小(大小决定了使用范围) 2.如何看待内存空间的视角 类型分类 整形 类型大小(字节)short2int4long4long8 浮点型 类型大小(字节)float4double8long double12 构造类型 数组结构性struct联合union枚举enum 指…

windows下安装python3.8

一、从官网下载安装包 官网地址:https://www.python.org/downloads/ 华为云地址:https://mirrors.huaweicloud.com/python/ 第三方镜像:https://registry.npmmirror.com/binary.html?pathpython/ 注意:从python3.8.10版本开始…

java八股文 笔记(持续更新中~)

1 Redis 2Mysql 3JVM 4java基础底层 5 spring 6 微服务 7.......(持续更新) One:Redis篇 1.穿透 2:击穿 3:雪崩 3 33 4:双写一致 5.持久化

Vue3全家桶 - Vue3 - 【8】模板引用【ref】(访问模板引用 + v-for中的模板引用 + 组件上的ref)

模板引用【ref】 Vue3官网-模板引用;如果我们需要直接访问组件中的底层DOM元素,可使用vue提供特殊的ref属性来访问; 一、 访问模板引用 在视图元素上采用ref属性来设置需要访问的DOM元素: 该 ref 属性可采用 字符串 值的执行设…

docker-compose Install ONLYOFFICE

ONLYOFFICE 前言 ONLYOFFICE 是一款全面的协作办公软件套件,集成了文档处理、电子表格和演示文稿等功能,为团队提供了无缝协作的工作环境。其功能强大,操作简便,是各种规模和类型的团队的首选工具。 功能介绍 多人协作:ONLYOFFICE 提供实时协作功能,让团队成员可以同时…

QGIS 开发之旅一《二次开发环境搭建》

1、 安装QT 下载QT Index of /new_archive/qt 我选择的版本是 Qt5.14.2 2、安装VS2017 Downloads & Keys - Visual Studio Subscriptions。下载后选择windows通用平台开发和C 开发就可以了。 3、安装插件QT vs tools 搜索 qt vs tools,选择第一个安装 …

【vivado】 clock wizard 时钟IP

一、前言 MMCM和PLL是在FPGA设计中不可避免需要使用到的时钟资源,对于其功能及使用方法的理解是正确进行FPGA设计的前提。 二、Xilinx 时钟 IP配置 vivado中使用时钟向导(Clocking Wizard)配置时钟IP核,其框图如下: clk_in 输入时钟&#…

MachineSink - 优化阅读笔记

注:该优化与全局子表达式消除刚好是相反的过程,具体该不该做这个优化得看代价模型算出来的结果(有采样文件指导算得会更准确) 该优化过程将指令移动到后继基本块中,以便它们不会在不需要其结果的路径上执行。 该优化过程并非旨在替代或完全…

按键+串口发送实验

摸鱼记录 Day_15 ~( ̄▽ ̄~)(~ ̄▽ ̄)~ review 前边已经学习了: 串口发送Vivado 串口通信(UART)------串口发送-CSDN博客 按键基于状态机的按键消抖实现-CSDN博客 1. …

CANopen转Profinet网关连接西门子PLC与变流器通讯

CANopen转Profinet网关(XD-COPNm20)在智能领域,变流器的应用非常广泛,变流器一般会采用CANopen协议。现场采用台达的变流器(支持CANopen协议)作为CANopen从站,S7-1500系列PLC做主站,…

ENVI 如何批量拆分多波段栅格

在处理遥感图像时,需要将多波段栅格进行拆分是很常见的需求。下面介绍一种方法,可以实现图像批量拆分并重命名。 打开ENVI的App Store 搜索并下载应用 在ENVI的App Store中搜索"将多波段图像拆分成多个单波段文件",并下载安装。 打…