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位
欣欣子
许你佳景
琪聚山顶
狮子猫
忙内
南风有叙
还是喻言
小哭包
果汁美貌
小陆公主
螺蛳粉
反手撑
男团舞

本文标签: 刘雨昕虞书欣编程