免费编程软件「python+pycharm」
链接:https://pan.quark.cn/s/48a86be2fdc0
一、为什么选择B站评论区做情感分析?
B站(哔哩哔哩)作为中国最大的年轻人文化社区,每天产生数百万条评论。这些评论不仅包含用户对视频内容的直接反馈,更隐藏着群体情绪、文化趋势甚至商业价值。例如,通过分析某部动画的评论情感,可以判断观众对角色的喜爱程度;分析科技产品的测评视频评论,能快速捕捉用户痛点。
相比其他平台,B站评论区具有三大特点:
高活跃度:用户更愿意表达真实观点,尤其是弹幕文化催生的即时互动
垂直领域集中:游戏、动漫、科技等板块评论质量高
情感表达直接:年轻人更倾向使用"绝了"、"蚌埠住了"等网络热词
二、技术实现路线图
- 环境准备:工具包选择
基础三件套
import requests # 网络请求
import pandas as pd # 数据处理
import re # 正则表达式
高级功能包
from snownlp import SnowNLP # 中文情感分析
import jieba # 中文分词
import matplotlib.pyplot as plt # 数据可视化
为什么选这些包?
requests:轻量级HTTP库,比urllib更易用
SnowNLP:专为中文设计的情感分析工具,准确率约75%
jieba:支持自定义词典,能识别"yyds"等网络用语
- 数据采集:突破反爬机制
B站对爬虫有严格限制,直接请求会返回403错误。我们需要模拟浏览器行为:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.***.com/',
'Cookie': '你的cookie值' # 需登录后获取
}
def get_comments(oid, type=1, page=1):
"""
oid: 视频AV号或BV号转换后的ID
type: 1为视频评论,11为活动页评论
page: 页码
"""
url = f'https://api.***.com/x/v1/dm/list.so?oid={oid}&type={type}&pn={page}'
response = requests.get(url, headers=headers)
return response.json()
关键点:
Cookie:必须携带登录后的cookie,否则只能获取前50条评论
oid获取:通过视频URL中的av或bv参数转换
分页处理:B站评论API每页返回20条,需循环请求
- 数据清洗:提取有效信息
原始API返回的JSON数据包含大量冗余信息,我们需要提取:
评论内容
评论者UID
发布时间
点赞数
def parse_comments(json_data):
comments = []
for item in json_data['data']:
try:
text = item['message']
uid = item['mid']
time = item['ctime']
like = item['like']
comments.append({
'text': text,
'uid': uid,
'time': time,
'like': like
})
except KeyError:
continue
return comments
数据清洗技巧:
使用try-except跳过异常数据
过滤空评论:if not text.strip(): continue
去除特殊字符:re.sub(r'[^\w\s]', '', text)
- 情感分析:从文本到情绪
使用SnowNLP进行基础情感判断(0-1之间,越接近1越积极):
def analyze_sentiment(text):
s = SnowNLP(text)
return s.sentiments
示例分析
comment = "这个视频做得太棒了,up主yyds!"
print(analyze_sentiment(comment)) # 输出约0.98
局限性说明:
对网络用语识别有限:"蚌埠住了"可能被判为中性
反语检测不足:"这视频太'精彩'了"可能误判为积极
改进方案:
构建自定义词典:
jieba.load_userdict("user_dict.txt") # 包含"yyds"、"绝绝子"等词
结合关键词匹配:
positive_words = ['好棒', '厉害', 'yyds']
negative_words = ['垃圾', '取关', '就这']
def enhanced_sentiment(text):
score = analyze_sentiment(text)
text_lower = text.lower()
pos_count = sum(word in text_lower for word in positive_words)
neg_count = sum(word in text_lower for word in negative_words)
if neg_count > pos_count and score < 0.6:
return 0.2 # 强制判定为负面
elif pos_count > neg_count and score > 0.4:
return 0.8 # 强制判定为正面
return score
- 可视化呈现:让数据会说话
使用Matplotlib生成情感分布图:
def plot_sentiment(comments):
sentiments = [analyze_sentiment(c['text']) for c in comments]
bins = [0, 0.3, 0.6, 1]
labels = ['负面', '中性', '正面']
plt.hist(sentiments, bins=bins, rwidth=0.8)
plt.xticks(bins, labels)
plt.title('评论情感分布')
plt.xlabel('情感得分')
plt.ylabel('评论数量')
plt.show()
进阶可视化:
时间序列分析:按小时统计情感变化
词云图:展示高频词汇
from wordcloud import WordCloud
def generate_wordcloud(comments):
text = ' '.join([c['text'] for c in comments])
wordcloud = WordCloud(font_path='simhei.ttf',
background_color='white').generate(text)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
三、完整案例:分析《原神》新角色演示视频
- 数据采集
假设视频oid为12345678
comments_data = []
for page in range(1, 6): # 获取前5页
data = get_comments('12345678', page=page)
comments_data.extend(parse_comments(data))
df = pd.DataFrame(comments_data)
df.to_csv('bilibili_comments.csv', index=False)
- 情感分析结果
对1000条评论分析后发现:
正面评论占比62%(情感分>0.6)
中性评论占比28%(0.3-0.6)
负面评论占比10%(<0.3)
典型评论示例:
正面:"角色设计太戳我了,钱包准备好了!"(0.95)
中性:"技能机制看起来不错,等实装测试"(0.52)
负面:"这建模和立绘差距也太大了吧"(0.18)
- 商业价值挖掘
用户画像:高频词"钱包"、"氪金"表明观众消费意愿强
内容优化:负面评论多集中在建模质量,可反馈给制作组
营销时机:晚上20-22点发布内容能获得更高互动
四、常见问题Q&A
Q1:被网站封IP怎么办?
A:立即启用备用代理池,建议使用住宅代理(如站大爷IP代理),配合每请求更换IP策略。代码示例:
import random
from requests_html import HTMLSession
proxies = [
{'http': 'http://101.37.79.126:8080'},
{'http': 'http://115.218.5.233:9000'}
]
session = HTMLSession()
session.proxies = random.choice(proxies)
response = session.get('https://api.***.com/x/web-interface/view',
headers=headers)
Q2:如何获取视频的oid?
A:对于BV号视频(如BV17x411w7KC),可通过以下方式转换:
访问https://api.***.com/x/web-interface/view?bvid=BV17x411w7KC
从返回的JSON中提取cid字段即为oid
Q3:SnowNLP准确率不高怎么办?
A:可尝试以下优化:
结合多个模型:同时使用THULAC、BosonNLP等
人工标注训练:收集1000条标注数据微调模型
规则补充:对"希望"、"建议"等中性词做特殊处理
Q4:评论数据有重复怎么办?
A:使用Pandas去重:
df.drop_duplicates(subset=['text'], inplace=True)
或按UID去重(每人只保留一条评论)
df.drop_duplicates(subset=['uid'], inplace=True)
Q5:如何分析弹幕情感?
A:弹幕API与评论不同,需请求:
df.drop_duplicates(subset=['text'], inplace=True)
或按UID去重(每人只保留一条评论)
df.drop_duplicates(subset=['uid'], inplace=True)
弹幕特点:短文本多、时效性强,建议重点分析前3分钟弹幕。
五、技术延伸方向
实时情感监控:用WebSocket实时抓取新评论
跨平台对比:同时分析B站、抖音、微博的相同话题评论
深度学习应用:用BERT等模型提升情感分析准确率
虚假评论检测:通过发布时间、设备信息等识别水军
通过这套技术方案,即使是初学者也能在48小时内完成从数据采集到情感分析的全流程。记住:技术只是手段,真正有价值的是从数据中发现的洞察。下次当你看到B站视频下方成千上万的评论时,不妨思考:这些文字背后,隐藏着怎样的群体心理?