admin管理员组文章数量:1516870
1. 简介
- 这个博客是B站up主 葩葩数据 小姐姐的有关THE9爱奇艺扫楼 弹幕热度排名及词云图制作 视频的代码整理,有兴趣的同学可以参考 ,希望能给小姐姐多多点赞投币,以后有时间会把小姐姐的其他视频代码整理出来.
2. 弹幕数据的获取
2.1 导包
# 导入所需的包
import requests
import zlib
import re
import jieba
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import numpy as np
importPIL.Image as image
from wordcloud import WordCloud
2.2 获取数据
数据来自于6.11爱奇艺扫楼活动回放视频的弹幕
# 导入所需的包
url_base='
content_l=[]
id_l=[]for i inrange(1,30):try:
url = url_base+str(i)+'.z'
res = requests.get(url).content
print('Page '+str(i)+' loading...')
res_byte =bytearray(res)
xml = zlib.decompress(res_byte).decode('utf-8')
findContent = re.compile(r'<content>(.*)</content>')
findID = re.compile(r'<uid>(.*)</uid>')
content_l += re.findall(findContent, xml)
id_l += re.findall(findID, xml)
except:print('Over')break
运行结果:
3. 分析数据
d ={'Content':content_l,'ID':id_l} # 词云图本身是不用id的 但是这里统计一下每个id的留言次数 看是不是恶意刷屏
df = pd.DataFrame(d)
df
运行结果:
3.1 统计每个Id的弹幕数,看是否有恶意刷屏
id_d ={}for id in id_l:if not id in id_d:
id_d[id]=1else:
id_d[id]+=1
id_sort =sorted(id_d.items(), key=lambda x:x[1], reverse=True)for id in id_sort[:15]:print('ID:'+str(id[0][:6])+'xxxx 次数'+str(id[1]))
运行结果:
# 看一下排名前5的id 究竟发了什么
for id in id_sort[:5]:print('ID '+str(id[0][:6])+'xxxx:')print(df[['Content']][df["ID"]==id[0]])
运行结果:
4. 热度统计
# 制作词典
name_d={}
name_d['刘雨昕']=['雨','昕','刘老师','刘雨欣']
name_d['虞书欣']=['欣欣','虞','鱼']
name_d['许佳琪']=['许','佳','ki','Ki','KI']
name_d['喻言']=['喻','言','忙内','特种兵']
name_d['谢可寅']=['寅','shaking','Shaking','SHAKING','虎子']
name_d['安崎']=['崎','陈雅馨','安琦','安琪']
name_d['赵小棠']=['赵','棠','铁牛']
name_d['孔雪儿']=['雪','孔','大壮','猪猪']
name_d['陆柯燃']=['陆','柯','燃','小陆公主']
name_d['THE9']=['the9','The9','THE9','NINE','Nine','nine','团','组合']
name_d
运行结果:
for name in name_d:
nickname_str = name_d[name][0]try:for nickname in name_d[name][1:]:
nickname_str+='|'+nickname
except:
none
df[name]=df.Content.str.contains(nickname_str)
df
运行结果:
其中,True代表这条弹幕中包含了对应列(姓名)的关键字。
4.1 涉及每名成员的弹幕数量
name_l =list(name_d.keys())
df_count = df.replace(True,1)
df_sum=df_count.groupby('ID')[name_l].sum()
df_sum_distinct=df_sum.replace(range(1,500),1)
df_sum.sum().sort_values(ascending=False) # 按照弹幕条数进行统计
运行结果:
4.2 涉及每名成员的弹幕所属ID数量
df_sum_distinct.sum().sort_values(ascending=False) # 按照发弹幕的人数进行统计
运行结果:
4.3 热度排名
name_bar_l=df_sum_distinct.sum().sort_values(ascending=False).index.tolist()
num_bar_l=df_sum_distinct.sum().sort_values(ascending=False).values.tolist()%matplotlib inline
plt.rcParams['font.sans-serif']=['Arial Unicode MS'] # 用来正常显示中文标签
title ='弹幕讨论热度排名'
plt.figure(figsize=(18,9))
plt.title(title)
plt.xlabel('姓名')
plt.ylabel('弹幕提及人数')
plt.bar(name_bar_l, num_bar_l)
plt.show()
运行结果:
4.4 热力图
# 计算相关性
d_corr ={}for name in name_l:
d_corr[name]=df_sum_distinct.loc[(df_sum_distinct[name]==1)].sum().values.tolist()
df_corr = pd.DataFrame(d_corr, index=name_l)
df_corr = df_corr.replace(df_sum_distinct.sum().values.tolist(),0)
df_corr
运行结果:
fig = plt.figure(figsize=(19,10))
ax = sns.heatmap(df_corr, annot=True, linewidths=0.5, cmap='coolwarm')
bottom, top = ax.get_ylim()
ax.set_ylim(bottom+0.5,top-0.5)
ax.set_title('被同一ID提及', fontdict={'fontsize':12,'fontweight':'heavy'})
运行结果:
5. 构建词云
content =""for line in df.Content[df['刘雨昕']==True].tolist(): # 之前再df已经对每个人的评论做了分类 提及就为True
content += line
content
运行结果:
jieba.load_userdict('The9') # The9 关键词词库:根据切词结果 不断完善
stopwords =[line.strip()for line inopen('stopwords').readlines()] # stopwords 停用词:根据词频 不断完善
cutcontent = jieba.lcut(content)
finalContent=[]for word in cutcontent:if not word in stopwords:
finalContent.append(word)
sta ={}for word in finalContent:
sta[word]= sta.get(word,0)+1sorted(sta.items(), key = lambda x : x[1], reverse = True)
运行结果:
def wordCount(name):
content =""for line in df.Content[df[name]==True].tolist():
content += line
cutcontent = jieba.lcut(content)
finalContent=[]for word in cutcontent:if not word in stopwords:
finalContent.append(word)
sta ={}for word in finalContent:
sta[word]= sta.get(word,0)+1returnsorted(sta.items(), key = lambda x : x[1], reverse = True)
def wordcouldContent(name):
content =""for line in df.Content[df[name]==True].tolist():
content += line
cutcontent = jieba.lcut(content)
finalContent=[]for word in cutcontent:if not word in stopwords:
finalContent.append(word)
text =" ".join(finalContent) # 注意这里分号之间要有空格
return text
wordCount("虞书欣")
运行结果:
def wordcloudShow(name):
text =wordcouldContent(name)
mask = np.array(image.open("a.png"))
wordcloud =WordCloud(
# mask = mask, #可以自定义词云的轮廓
background_color='white',
max_words=15,
width=8000,
height=6000,
font_path='/System/Library/Fonts/PingFang.ttc',
collocations=False, # 防止出现重复词
regexp = r"\w[\w']*").generate(text)
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
运行结果:
6. 链接
- 关于 代码对应的视频讲解 ,参考 .
代码中出现的文档
1、stopwords.txt
!
了
?
的
啊
吗
我
是
在
有
好
你
就
都
吧
呀
和
,
;
,&#
;
什么
这么
不
想
怎么
时候
说
'
多
看
要
很
可以
太
感觉
那
那个
~
这
这个
她
哈
哈哈
哈哈哈
哈哈哈哈
真的
被
给
也
一直
刘雨昕
虞书欣
许佳琪
喻言
谢可寅
安崎
赵小棠
孔雪儿
陆柯燃
人
一个
一条
小
让
啦
——
没
又
还
嘛
死
哦
能
不能
么
自己
别人
到
个
我们
没有
一下
2、THE9.txt
刘雨昕
虞书欣
许佳琪
喻言
谢可寅
安崎
赵小棠
孔雪儿
陆柯燃
THE9
the9
The9
节奏病
c位
绝对c位
欣欣子
许你佳景
琪聚山顶
狮子猫
忙内
南风有叙
还是喻言
小哭包
果汁美貌
小陆公主
螺蛳粉
反手撑
男团舞
版权声明:本文标题:最新动态:THE9爱奇艺扫楼活动,看弹幕热度排名及惊艳词云呈现! 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.betaflare.com/biancheng/1772302061a3273319.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。


发表评论