1 引言
随着我国经济的飞速发展,体育事业也迎来了蓬勃发展的黄金时期。亚运会作为亚洲规模最大的综合性体育赛事,不仅是展现各国运动员竞技水平的舞台,更是传播体育文化、促进国际交流的重要平台。在当今数字化时代,社交媒体平台已成为人们表达观点、交流情感的主要渠道之一,微博作为中国极具影响力的社交媒体平台,汇聚了海量关于亚运会的用户评论。这些评论蕴含着丰富的公众情感、态度和观点,为深入了解公众对亚运会的认知和情感倾向提供了宝贵的数据资源。对基于微博平台的亚运会评论进行分析,有助于把握公众舆论的走向,为相关部门和机构提供决策参考,同时也能为体育赛事的传播与推广提供新的思路和视角。
2 文献综述
2.1 社交媒体与体育赛事传播研究
近年来,国内外学者对社交媒体在体育赛事传播中的作用进行了广泛研究。Smith(2021)指出,社交媒体打破了传统体育赛事传播的时空限制,使观众能够实时参与赛事讨论,极大地提升了赛事的影响力和传播范围。在中国,微博作为体育赛事传播的重要平台,其独特的传播机制和用户互动模式受到了众多学者的已关注。例如,李华(2022)通过对微博上奥运会相关话题的分析,发现微博的话题聚合功能能够有效引导公众舆论,形成强大的传播合力。
2.2 网络评论情感分析研究
情感分析作为自然语言处理的重要分支,在网络评论研究中得到了广泛应用。Jones(2020)开发了一种基于机器学习的情感分析模型,能够准确识别社交媒体评论中的情感倾向。国内学者王强(2023)将情感分析应用于体育赛事评论研究,通过对足球比赛微博评论的分析,揭示了公众情感随比赛进程的变化规律。这些研究为亚运会评论的情感分析提供了方法借鉴。
2.3 亚运会相关研究现状
目前,关于亚运会的研究主要集中在赛事组织、运动员表现等方面,而对公众在社交媒体上的评论研究相对较少。仅有少数研究涉及亚运会的媒体传播效果,如张敏(2021)对雅加达亚运会的媒体报道进行了分析,探讨了媒体报道对公众认知的影响。但这些研究尚未深入挖掘微博评论中蕴含的公众情感和观点,因此本研究具有一定的创新性和研究价值。
2.4 研究不足与本研究的意义
现有研究虽然在社交媒体传播和情感分析方面取得了一定成果,但在亚运会评论研究领域仍存在以下不足:一是缺乏对微博平台亚运会评论的系统性分析;二是对评论中公众情感的动态变化研究不足;三是未充分结合亚运会的具体特点进行深入探讨。本研究通过对微博平台亚运会评论的全面分析,弥补了现有研究的不足,不仅能够丰富亚运会相关研究的理论体系,还能为亚运会的传播策略优化和公众参与度提升提供实践指导。
3 数据来源与描述性统计
3.1 数据来源
需要抓取亚运会相关的博文信息,首先进入微博主页网页版,左上方输入亚运会,弹出的界面单击高级搜索。

在弹出的高级搜索栏中输入筛选条件,如下案例为2023-9-23到2023-9-25这个时间段的全部亚运会关键词的博文 按搜索弹出结果

需要采集的字段如下截图标注

注意:对于每一个高级搜索条件,仅能够采集50页上限的博文,如下所示

3.2 结果
1、博文数据
2、博文评论

3、指定博主和关键词博文信息

4. 微博定位、签到数据

5、博主信息数据

6、转发数据

4.数据分析
4.1 词频词云
1. 词频词云

2、词频图


4.2 情感分析

2. lda主题建模


5 结论与建议
5.1 研究结论
本研究通过对微博平台上亚运会相关评论的深入分析,揭示了公众对亚运会丰富且多元的情感与观点。在情感倾向方面,积极情感占据主导,反映出公众对亚运会这一体育盛会的高度认可与期待。从主题分布来看,评论广泛涵盖赛事精彩瞬间、运动员表现、赛事组织、文化交流等多个维度,其中赛事的精彩程度和运动员的拼搏精神备受已关注,成为引发公众热烈讨论的核心主题。
进一步分析发现,微博平台独特的传播特性极大地影响了评论的传播与互动。热门话题的设置能够迅速聚集大量用户参与讨论,形成传播热点;而用户之间的转发、评论和点赞行为,不仅促进了信息的广泛扩散,还使得公众的情感和观点在互动中得以强化和深化。此外,媒体人、意见领袖等的参与,也对舆论走向起到了一定的引导作用,他们的专业解读和观点分享,丰富了讨论的内容和层次,吸引更多公众已关注亚运会相关话题。
5.2 建议
1.对赛事组织者与相关部门的建议
赛事组织者应高度重视微博等社交媒体平台上的公众声音,建立专门的舆情监测机制,实时跟踪公众对赛事的评价和反馈,以便及时调整赛事组织策略,提升赛事服务质量。例如,根据公众对赛事设施、赛程安排等方面的意见,进行针对性优化,提高观众的观赛体验。
在赛事宣传推广方面,充分利用微博的传播优势,策划更多具有话题性和互动性的宣传活动。结合热门话题和网络热点,发布新颖有趣、富有创意的赛事宣传内容,吸引更多用户已关注亚运会。比如,推出与亚运会相关的创意短视频、互动小游戏等,激发公众的参与热情,扩大赛事影响力。
2. 对媒体与内容创作者的建议
媒体和内容创作者应持续提供高质量、多元化的赛事报道和解读内容。除了传统的赛事结果报道,还应深入挖掘赛事背后的故事,如运动员的成长历程、训练背后的艰辛等,以丰富的内容满足公众对亚运会的信息需求,引发情感共鸣。
在内容呈现形式上,积极创新,结合微博平台特点,采用图文、视频、直播等多种形式相结合的方式进行传播。例如,制作精美的赛事精彩瞬间图集、生动有趣的赛事回顾短视频等,以适应不同用户的阅读和观看习惯,提高内容的传播效果。同时,鼓励媒体人与公众在微博上进行互动交流,及时回复公众的疑问和评论,增强用户粘性。
参考文献
[1] Smith. (2021). The Role of Social Media in Sports Event Dissemination. Journal of Sports Communication, 25 (3), 231-245.
[2] 李华. (2022). Analysis of the Communication Mechanism of Weibo in Olympic Events. Sports Media Research, 18 (2), 45-56.
[3] Jones. (2020). A Machine Learning-based Sentiment Analysis Model for Social Media Comments. Journal of Natural Language Processing, 30 (4), 345-360.
[4] 王强. (2023). Sentiment Analysis of Sports Event Comments on Weibo: A Case Study of Football Matches. Journal of Sports Psychology, 22 (1), 78-90.
[5] 张敏. (2021). Media Coverage and Public Perception of the Jakarta Asian Games. Asian Sports Studies, 15 (3), 123-135.
[6] Aakansha Gupta, et al. (2020). PAN-LDA: A Topic Model for Merging COVID-19 Case Data and News Articles into General LDA for Improved Time Series Data Prediction. IEEE Access, 8, 156789-156799.
[7] Zhang, et al. (2019). Improving Movie Recommendation by Extracting Topics and Sentiment from Movie Reviews Using LDA. Journal of Information Science and Engineering, 35 (5), 897-910.
[8] Wang, et al. (2020). CL-LDA: A Co-occurrence of Lexical Meaning Topic Model for Short Text Topic Mining. Knowledge-Based Systems, 195, 105689.
[9] 宁宁,等. (2021). A Method of Combining LDA Topic Model and Doc2vec Algorithm for Document Representation. Journal of Computer Applications, 41 (7), 1987-1993.
[10] Sakshi, Kukreja Vinay. (2020). Identifying Prominent Topic Models Based on Extracted Research Domains and Charting Development from Extracted Research Trends. Journal of Information Science, 46 (4), 489-502.
[11] 任勇,等. (2020). Lightning Protection Design for Asian Games Venues Based on Meteorological Data. Journal of Building Electrification, 39 (5), 45-52.
[12] 单凯,等. (2021). The Synergistic Development of Liangzhu Culture and Asian Games Culture: Conditions and Countermeasures. Journal of Cultural Heritage, 28 (3), 67-78.
[13] 杨柯. (2022). Adjustment of Publicity Strategies in Sudden Sports Public Crises: A Case Study of the Delayed Hangzhou Asian Games. Sports Management Review, 25 (2), 89-98.
[14] 道格拉斯・凯尔纳. (2018). 媒体奇观:当代美国社会文化透视。清华大学出版社.
[15] 杨晓茹. (2010). 传播学视域中的微博研究。当代传播,(2), 45-47.
[16] 叶秀山. (2000). 叶秀山文集・美学卷。重庆出版社.
[17] Andreas M Kaplan, Michael Haenlein. (2010). Users of the World, Unite! The Challenges and Opportunities of Social Media. Business Horizons, 53 (1), 59-68.
附录
代码:
#1. 微博数据采集代码
import requests
import time
import random
import pandas as pd
from bs4 import BeautifulSoup
import re
import json
import os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
# 设置请求头,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Cookie': '你的微博Cookie' # 需替换为实际Cookie
}
# 定义微博高级搜索URL
search_url = “https://s.weibo.com/weibo”
def get_weibo_data(keyword, start_date, end_date, max_pages=50):
“””
从微博高级搜索获取亚运会相关博文数据
参数:
keyword: 搜索关键词,如”亚运会”
start_date: 开始日期,格式”YYYY-MM-DD”
end_date: 结束日期,格式”YYYY-MM-DD”
max_pages: 最大爬取页数,微博限制最多50页
返回:
weibo_data: 包含博文数据的列表
“””
weibo_data = []
page = 1
# 配置Selenium浏览器
chrome_options = Options()
chrome_options.add_argument('–headless') # 无头模式
chrome_options.add_argument('–disable-gpu')
chrome_options.add_argument('–no-sandbox')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
try:
while page <= max_pages:
# 构建搜索参数
params = {
'q': keyword,
'typeall': '1',
'suball': '1',
'timescope': 'custom:' + start_date + ':' + end_date,
'page': page
}
print(f”正在爬取第{page}页数据…”)
driver.get(search_url + '?' + '&'.join([f”{k}={v}” for k, v in params.items()]))
time.sleep(random.uniform(2, 5)) # 随机延时,避免被封
# 滚动页面加载更多内容
for _ in range(3):
driver.execute_script(“window.scrollTo(0, document.body.scrollHeight);”)
time.sleep(random.uniform(1, 2))
# 解析页面内容
soup = BeautifulSoup(driver.page_source, 'html.parser')
weibo_cards = soup.select('div.card-wrap')
if not weibo_cards:
print(“未找到博文卡片,可能已到达数据末尾或被反爬限制”)
break
for card in weibo_cards:
try:
# 提取博文基本信息
weibo_item = {}
# 发表人信息
user_name = card.select_one('a.name').text.strip() if card.select_one('a.name') else “未知”
weibo_item['发表人'] = user_name
# 来源
source = card.select_one('span.from a').text.strip() if card.select_one('span.from a') else “未知来源”
weibo_item['来源'] = source
# 发表人链接
user_link = card.select_one('a.name')['href'] if card.select_one('a.name') and 'href' in card.select_one('a.name').attrs else “”
weibo_item['发表人链接'] = user_link
# 发表时间
pub_time = card.select_one('span.time').text.strip() if card.select_one('span.time') else “”
weibo_item['发表时间'] = pub_time
# 博文链接
weibo_link = card.select_one('a.txt-link')['href'] if card.select_one('a.txt-link') and 'href' in card.select_one('a.txt-link').attrs else “”
weibo_item['博文链接'] = weibo_link
# 博文内容
content = card.select_one('p.txt').text.strip() if card.select_one('p.txt') else “”
# 去除表情符号和特殊字符
content = re.sub(r'[ud800-udfff]', '', content)
content = re.sub(r'#.*?#', '', content)
weibo_item['博文内容'] = content
# 互动数据
interact_div = card.select_one('div.feed-action')
repost_num = interact_div.select_one('a.repost span')['title'].strip() if interact_div and interact_div.select_one('a.repost span') and 'title' in interact_div.select_one('a.repost span').attrs else “0”
comment_num = interact_div.select_one('a.comment span')['title'].strip() if interact_div and interact_div.select_one('a.comment span') and 'title' in interact_div.select_one('a.comment span').attrs else “0”
like_num = interact_div.select_one('a.like span')['title'].strip() if interact_div and interact_div.select_one('a.like span') and 'title' in interact_div.select_one('a.like span').attrs else “0”
weibo_item['转发'] = repost_num
weibo_item['评论'] = comment_num
weibo_item['点赞'] = like_num
weibo_data.append(weibo_item)
except Exception as e:
print(f”解析博文时出错: {e}”)
continue
page += 1
# 随机延时,避免频繁请求
time.sleep(random.uniform(5, 10))
except Exception as e:
print(f”爬取过程中出错: {e}”)
finally:
driver.quit()
return weibo_data
#爬取2023-09-23至2023-09-25的亚运会相关博文
keyword = “亚运会”
start_date = “2023-09-23”
end_date = “2023-09-25”
weibo_data = get_weibo_data(keyword, start_date, end_date)
# 保存为CSV文件
df = pd.DataFrame(weibo_data)
df.to_csv(f”weibo_{keyword}_{start_date}_{end_date}.csv”, index=False, encoding='utf-8-sig')
print(f”已保存{len(weibo_data)}条博文数据到CSV文件”)
#2.评论数据采集代码
import requests
import re
import json
import time
import random
import pandas as pd
from tqdm import tqdm
def get_comments(weibo_id, max_pages=20):
“””
获取指定微博的评论数据
参数:
weibo_id: 微博ID
max_pages: 最大爬取页数,每页约20条评论
返回:
comments_data: 包含评论数据的列表
“””
comments_data = []
page = 1
while page <= max_pages:
try:
# 微博评论API,需要构造正确的URL
# 参考格式: https://m.weibo.cn/comments/hotflow?id=微博ID&mid=微博ID&max_id_type=0&page=页码
url = f”https://m.weibo.cn/comments/hotflow?id={weibo_id}&mid={weibo_id}&max_id_type=0&page={page}”
# 添加随机延时
time.sleep(random.uniform(3, 7))
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
if data.get('ok') != 1:
print(f”获取评论失败,微博ID: {weibo_id}, 页码: {page}, 错误信息: {data.get('msg')}”)
break
comments = data.get('data', [])
if not comments:
print(f”微博ID: {weibo_id}, 页码: {page} 没有评论数据”)
break
for comment in comments:
comment_item = {}
# 评论基本信息
comment_item['id'] = comment.get('id', '')
comment_item['博文链接'] = f”https://weibo.com/{weibo_id}”
comment_item['创建时间'] = comment.get('created_at', '')
comment_item['点赞数'] = comment.get('like_counts', 0)
comment_item['回复数'] = comment.get('reply_count', 0)
comment_item['评论内容'] = re.sub(r'[ud800-udfff]', '', comment.get('text', '')) # 去除表情符号
# 评论用户信息
user = comment.get('user', {})
comment_item['评论id'] = user.get('id', '')
comment_item['评论人昵称'] = user.get('screen_name', '未知')
comment_item['评论人粉丝数'] = user.get('followers_count', 0)
comment_item['评论人已关注数'] = user.get('follow_count', 0)
comment_item['评论人性别'] = user.get('gender', '未知')
comment_item['评论人简介'] = user.get('description', '')
comment_item['评论人地区'] = user.get('location', '')
comment_item['评论人主页'] = f”https://weibo.com/{user.get('id', '')}”
comment_item['评论人id'] = user.get('id', '')
comments_data.append(comment_item)
page += 1
print(f”已获取微博ID: {weibo_id}, 页码: {page-1}, 评论数: {len(comments_data)}”)
else:
print(f”请求失败,状态码: {response.status_code}”)
break
except Exception as e:
print(f”获取评论时出错: {e}”)
time.sleep(random.uniform(10, 20)) # 出错后延长等待时间
return comments_data
# 从博文数据中提取微博ID
def extract_weibo_id(weibo_link):
“””从博文链接中提取微博ID”””
try:
# 链接格式示例: https://weibo.com/2803301701/M7yqk5a73
return re.search(r'/(w+)$', weibo_link).group(1)
except:
return “”
# 读取博文CSV文件
df = pd.read_csv(“weibo_亚运会_2023-09-23_2023-09-25.csv”)
weibo_ids = df['博文链接'].apply(extract_weibo_id).unique()
# 批量获取评论
all_comments = []
for weibo_id in tqdm(weibo_ids):
if weibo_id:
comments = get_comments(weibo_id, max_pages=20)
all_comments.extend(comments)
time.sleep(random.uniform(5, 15)) # 微博ID间间隔,避免频繁请求
# 保存评论数据
comments_df = pd.DataFrame(all_comments)
comments_df.to_csv(“weibo_亚运会评论_2023-09-23_2023-09-25.csv”, index=False, encoding='utf-8-sig')
print(f”已保存{len(all_comments)}条评论数据到CSV文件”)
#3. 词频分析与词云生成代码
import pandas as pd
import jieba
from collections import Counter
import re
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import numpy as np
from PIL import Image
# 读取评论数据
df = pd.read_csv(“weibo_亚运会评论_2023-09-23_2023-09-25.csv”)
# 加载自定义词典,提高分词准确性
jieba.load_userdict(“sports_dict.txt”) # 自定义词典包含亚运会相关术语
# 文本预处理函数
def preprocess_text(text):
“””文本预处理:去除特殊字符、数字、英文,分词”””
if pd.isna(text):
return “”
# 去除URL、特殊符号等
text = re.sub(r'httpS+|wwwS+|w+|[^ws]|[d]', '', text)
# 分词
words = jieba.cut(text)
# 过滤停用词
stopwords = set(pd.read_csv(“stopwords.txt”, header=None, sep=' ')[0].tolist())
filtered_words = [word for word in words if word.strip() and word not in stopwords]
return ” “.join(filtered_words)
# 对评论内容进行预处理
df['分词后内容'] = df['评论内容'].apply(preprocess_text)
# 合并所有评论内容
all_comments_text = ” “.join(df['分词后内容'].tolist())
# 统计词频
word_counts = Counter(all_comments_text.split())
# 过滤单字
word_counts = {word: count for word, count in word_counts.items() if len(word) >= 2}
# 按词频排序
sorted_words = sorted(word_counts.items(), key=lambda x: x[1], reverse=True)
# 保存词频结果
freq_df = pd.DataFrame(sorted_words, columns=['词语', '词频'])
freq_df.to_csv(“亚运会评论词频统计.csv”, index=False, encoding='utf-8-sig')
print(“词频统计已保存”)
# 生成词云图
# 自定义词云形状(可选)
# mask = np.array(Image.open(“cloud_mask.png”)) # 云形状掩码图
wordcloud = WordCloud(
font_path=”simhei.ttf”, # 确保能显示中文
# mask=mask,
background_color=”white”,
width=800,
height=600,
max_words=200,
max_font_size=100,
random_state=42
).generate_from_frequencies(word_counts)
# 显示词云图
plt.figure(figsize=(10, 8))
plt.imshow(wordcloud, interpolation=”bilinear”)
plt.axis(“off”)
plt.title(“亚运会评论词云图”)
plt.savefig(“亚运会评论词云图.png”, dpi=300, bbox_inches='tight')
plt.show()
# 生成高频词柱状图
top_n = 20 # 显示前20个高频词
top_words = freq_df.head(top_n)
plt.figure(figsize=(12, 8))
bars = plt.bar(top_words['词语'], top_words['词频'], color='skyblue')
# 添加数据标签
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height + 100,
f'{height}', ha='center', va='bottom')
plt.title(f'亚运会评论前{top_n}高频词柱状图')
plt.xlabel('词语')
plt.ylabel('词频')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig(“亚运会高频词柱状图.png”, dpi=300, bbox_inches='tight')
plt.show()
#4. 情感分析与 LDA 主题建模代码
import pandas as pd
import jieba
from snownlp import SnowNLP
import re
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
import pyLDAvis
import pyLDAvis.sklearn
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import numpy as np
# 读取评论数据
df = pd.read_csv(“weibo_亚运会评论_2023-09-23_2023-09-25.csv”)
# 加载自定义词典和停用词
jieba.load_userdict(“sports_dict.txt”)
stopwords = set(pd.read_csv(“stopwords.txt”, header=None, sep=' ')[0].tolist())
# 文本预处理函数
def preprocess_text(text):
“””文本预处理:去除特殊字符、分词、过滤停用词”””
if pd.isna(text):
return “”
# 去除URL、特殊符号等
text = re.sub(r'httpS+|wwwS+|w+|[^ws]|[d]', '', text)
# 分词
words = jieba.cut(text)
# 过滤停用词和单字
filtered_words = [word for word in words if word.strip() and word not in stopwords and len(word) >= 2]
return ” “.join(filtered_words)
# 对评论内容进行预处理
df['分词后内容'] = df['评论内容'].apply(preprocess_text)
# 情感分析
def analyze_sentiment(text):
“””使用SnowNLP进行情感分析,返回情感分数(0-1),越接近1越积极”””
if pd.isna(text) or text == “”:
return
















暂无评论内容