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

news2024/11/26 15:00:11

问题重述:

博物馆是公共文化服务体系的重要组成部分。国家文物局发布, 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)}")

在这里插入图片描述

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

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

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

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

相关文章

基于Springboot的高校汉服租赁网站(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的高校汉服租赁网站(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

蓝桥杯算法错题记录-基础篇

文章目录 本文还在跟新,最新跟新时间3/11!!! 格式一定要符合要求,(输入,输出格式)1. nextInt () next() nextLine() 的注意事项2 .数的幂 a^2等3.得到最大长度(最大...&a…

Redis缓存问题详解和处理

缓存更新策略 缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库. 常见的解决方案: 缓存空对象 优点: 实现简单, 维护方便缺点: 额外的内存消耗, 可能造成短期的不一致 布隆过滤 优点: 内存占用较少(保存的是数据…

【0基础学C语言】04-常量、变量

一、数据的存储 1.数据类型 首先来看看计算机是怎么存储数据的。总的来说,计算机中存储的数据可以分为两种:静态数据和动态数据。 1> 静态数据 概念:静态数据是指一些永久性的数据,一般存储在硬盘中。硬盘的存储空间一般都比较大,现在普通计算机的硬盘都有500G左右…

Leetcode每日一题[C++]-1261.在受污染的二叉树中查找元素

题目描述 题目链接:. - 力扣(LeetCode) 给出一个满足下述规则的二叉树: root.val 0如果 treeNode.val x 且 treeNode.left ! null,那么 treeNode.left.val 2 * x 1如果 treeNode.val x 且 treeNode.right ! nu…

这些年背过的面试题——SpringMVC篇

1 什么是SpringMVC ?简单介绍下你对SpringMVC的理解? SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用…

ST MotorControl Workbench 6.2.1 使用总结

目录 前言 软件安装 根据自己硬件配置参数 生成代码 开发板运行 ​ 总结 前言 好久没有玩ST的电机库了,已经更新到了MotorControl Workbench 6.2.1,6以上的版本比5的版本界面操作有很大的不同,核心算法有些增加。最近体验了一把使用自…

jeecg 启动 微服务 更改配置本地host地址

1. windows系统下,在开始—运行里面输入(找不到运行菜单可直接按WinR键): C:\WINDOWS\system32\drivers\etc ,如图所示: 2. 用记事本 打开这个文件 在最下面输入这个即可

G. Rudolf and Subway

解题思路 每条边的边权可选,由颜色决定同一颜色的线路可以直达颜色最多有种考虑将颜色视作链接点,进行分层图跑最短路最终结果除2最多建条边(直接存状态Map跑最短路被毙掉了) import java.io.*; import java.math.BigInteger; im…

【案例】IPC 中的WinCC RT Advanced PC项目,如何下载及开机自动启动?

导读:TIA WinCC Advanced (高级版)V17项目如何下载到目标计算机(需要运行项目的电脑)? 01WinCC RT Adv项目下载 1、在计算机开始菜单中点击“运行”或通过Win键R调出运行窗口,并输入 CMD 然后回车: 打开 W…

虚拟化

什么是虚拟化 虚拟化(Virtualization)是一种资源分配和管理技术,是将计算机的各种实体资源,比如CPU、内存、磁盘空间、网络适配器等,进行抽象转换后虚拟的设备,可以实现灵活地分割、组合为一个或多个计算机配置环境,并…

rt-thread组件之audio组件(结合mp3player包使用)

前言 继上一篇RT-Thread组件之Audio框架i2s驱动的编写的编写,应用层使用rt-thread软件包里面的wavplayer组件以及 rt-thread组件之audio组件(结合wavplayer包使用)的文章本篇使用的是 mp3player软件包,与wavplayer设计框架基本上是一样的,只…

万字完整版【C语言】指针详解~

一、前言 初始指针(0):着重于讲解指针的概念、基本用法、注意事项、以及最后如何规范使用指针深入指针(1):讲解指针变量常见的类型,如何去理解这些类型、最后就是如何正确的使用深入指针&#…

语音情感基座模型emotion2vec

在语音技术领域,准确理解用户的语音指令和意图是构建高效人机交互系统的基础。一个高品质的语音交互系统不仅需要理解字面上的语言内容,更应捕捉到说话者语音中蕴含的情感信息。这正是语音情感识别(SER)技术要解决的问题&#xff…

【libwebrtc】基于m114的构建

libwebrtc A C++ wrapper for binary release, mainly used for flutter-webrtc desktop (windows, linux, embedded).是 基于m114版本的webrtc 最新(20240309 ) 的是m122了。官方给出的构建过程 .gclient 文件 solutions = [{"name" : src,"url

Caffeine缓存

本地缓存基于本地环境的内存,访问速度非常快,对于一些变更频率低、实时性要求低的数据,可以放在本地缓存中,提升访问速度 使用本地缓存能够减少和Redis类的远程缓存间的数据交互,减少网络 I/O 开销,降低这…

Python 导入Excel三维坐标数据 生成三维曲面地形图(体) 5-1、线条平滑曲面且可通过面观察柱体变化(一)

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…

【软考中级】网络工程师:11.网络管理

11.1 网络管理五大功能域 故障管理、配置管理、计费管理、安全管理和性能管理。 故障管理:尽快发现故障,找出故障原因,以便找出补救措施。 配置管理:初始化、维护和关闭网络设备或子系统。 计费管理:计费监视主要是跟…

dubbo调用的自定义过滤器中设置MDC无法生效的问题

AI的解释 Dubbo自定义过滤器不生效可能有多种原因&#xff0c;以下是一些常见的原因及解决方法&#xff1a; 过滤器未正确配置&#xff1a; 检查过滤器是否已经在Dubbo的配置文件中正确声明&#xff0c;并且已经添加到过滤器链中。在XML配置中&#xff0c;应使用<dubbo:se…

Ubuntu 14.04:PaddleOCR基于PaddleServing的在线服务化部署(失败)

一、 二、安装 注&#xff1a; 安装 PaddleOCR 2.3 。 因为 PaddleOCR 2.4 的 推荐环境 PaddlePaddle > 2.1.2。 https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/doc/doc_ch/environment.md 安装前的环境准备 在使用Paddle Serving之前&#xff0c;需要完…