数据分析-08-B站美食视频图鉴 干饭人干饭魂干饭都是人上人(包含数据和代码)

0. 获取数据集

关注公众号:『AI学习星球
回复:B站美食视频图鉴 即可获取数据下载。
论文辅导算法学习可以通过公众号滴滴我
在这里插入图片描述

1. 项目背景

通过采集数据,数据处理,分析出美食up最喜欢做什么样的食材,最受欢迎的美食up有什么共同之处,美食视频热门标签是什么,哪些标签的视频更容易火,高浏览量的视频财富密码是什么,等等,一系列的了解。

2. 数据抽取

导入包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

加载数据

data1=pd.read_csv('BiliBili_FOOD_Video_1.csv')
data2=pd.read_csv('BiliBili_FOOD_Video_2.csv')
data3=pd.read_csv('Bilibili_FOOD_Video_3.csv')
data4=pd.read_csv('Bilibili_FOOD_Video_4.csv')
print(data1.columns.tolist())
print("data1.shape:",data1.shape)
print("data2.shape:",data2.shape)
print("data3.shape:",data3.shape)
print("data4.shape:",data4.shape)

在这里插入图片描述
合并数据集

data=pd.concat([data1,data2,data3,data4],axis=0)
data=data.reset_index(drop=True)
data.head()

在这里插入图片描述
查看数据大小

data.shape

缺失值统计

data.shape[0]-data.count()

在这里插入图片描述

2.1 美食UP最喜欢做啥样的食材

我们通过上面的数据可以发现食材可以来自:

  • 标题:50买了一个两斤半的猪肘,小马今天做“红烧猪肘”软烂入味,肥而不腻!
  • 视频介绍: 吃不完的猪肉,直接放冰箱就错了,教您一招,放30天还是新鲜的啊
  • 标签: 美食美食美食制作\n 猪肉\n \n 保存

我们可以对文本进行预处理以及统计词频,画出相关词云,进行产看

a. 标题中的食材统计
import jieba.posseg
[(w.word,w.flag) for w in jieba.posseg.cut('吃不完的猪肉,直接放冰箱就错了,教您一招,放30天还是新鲜的啊')]

在这里插入图片描述

# 先统计一些名词
from collections import Counter
from tqdm import tqdm_notebook,tqdm
title_noun_words=[]
title_texts=[]
for title in tqdm(data['标题']):
    # print([(w.word,w.flag) for w in jieba.posseg.cut(str(title))])
    word_flags=[(w.word,w.flag) for w in jieba.posseg.cut(str(title))]
    words_=[(wf[0]) for wf in word_flags if wf[1] in ['n','nz'] ]
    title_texts.append(' '.join([(wf[0]) for wf in word_flags]))
    title_noun_words.extend(words_)
print(len(Counter(title_noun_words)))
Counter(title_noun_words).most_common(20)

在这里插入图片描述

# 去除一些非食材的停用词
food_stop_words=['作品','美食','美味','人','味道','学会','教程',
    '锅','配方','营养','家常','早餐','家人','工人','小吃','大厨',
    '大家','食谱','技巧','日记','企时','方法','孩子','懒人',
    '正宗','厨房','手','饭','饭店','过瘾','农村']
noun_topk_words=Counter(title_noun_words).most_common(10000)
noun_topk_words=[wc for wc in noun_topk_words if wc[0] not in food_stop_words]
noun_topk_words[:20]

在这里插入图片描述

# plot 词云函数
import pyecharts.options as opts
from pyecharts.charts import WordCloud
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_NOTEBOOK

def plot_wordclod(data,title=""):
    c=(
        WordCloud()
        .add(series_name=title, data_pair=noun_topk_words, word_size_range=[10, 66])
        .set_global_opts(
            title_opts=opts.TitleOpts(
                title=title, title_textstyle_opts=opts.TextStyleOpts(font_size=23)
            ),
            tooltip_opts=opts.TooltipOpts(is_show=True),
        )
    )
    return c
# 使用次数最多的食材词云
c=plot_wordclod(noun_topk_words,title="标题中的热点食材分析")
c.render_notebook()

在这里插入图片描述

b. 视频介绍汇中的食材
# 先统计一些名词
from collections import Counter
from tqdm import tqdm_notebook,tqdm
tag_noun_words=[]
tag_texts=[]
for text in tqdm(data['标签']):
    text=''.join(str(text).split())
    # print([(w.word,w.flag) for w in jieba.posseg.cut(str(text))])
    word_flags=[(w.word,w.flag) for w in jieba.posseg.cut(str(text))]
    words_=[(wf[0]) for wf in word_flags if wf[1] in ['n','nz'] ]
    tag_texts.append(' '.join([(wf[0]) for wf in word_flags if wf[0]]))
    tag_noun_words.extend(words_)
noun_topk_words=Counter(intro_noun_words).most_common(100000)
food_stop_words2=['视频','食材','口感','物','评论','时间','西施',
'朋友','油管','手工','菜','农村']
noun_topk_words=[wc for wc in noun_topk_words if wc[0] not in \
food_stop_words2+food_stop_words]
noun_topk_words[:20]

在这里插入图片描述

c=plot_wordclod(noun_topk_words,title="视频介绍中的热点食材分析")
c.render_notebook()

在这里插入图片描述

c. 标签中的食材统计
# 先统计一些名词
from collections import Counter
from tqdm import tqdm_notebook,tqdm
tag_noun_words=[]
tag_texts=[]
for text in tqdm(data['标签']):
    text=''.join(str(text).split())
    # print([(w.word,w.flag) for w in jieba.posseg.cut(str(text))])
    word_flags=[(w.word,w.flag) for w in jieba.posseg.cut(str(text))]
    words_=[(wf[0]) for wf in word_flags if wf[1] in ['n','nz'] ]
    tag_texts.append(' '.join([(wf[0]) for wf in word_flags if wf[0]]))
    tag_noun_words.extend(words_)
noun_topk_words=Counter(intro_noun_words).most_common(100000)
food_stop_words3=['原','博','时候','小伙伴',
'一键','记录','家庭','技术','文化','减脂',
'教学','小时','材料','量','天']
noun_topk_words=[wc for wc in noun_topk_words if wc[0] not in \
food_stop_words2+food_stop_words+food_stop_words3]
noun_topk_words[:20]

在这里插入图片描述

c=plot_wordclod(noun_topk_words,title="视频标签中的热点食材分析")
c.render_notebook()

在这里插入图片描述

d. 基于Word2Vec的食材词发现
!pip install gensim -i http://mirrors.aliyun.com/pypi/simple/ 
corpus=title_texts+intro_texts+tag_texts
print("num sentences of corpus:{}".format(len(corpus)))

num sentences of corpus:141036

sentences=[sent.split() for sent in corpus]
from gensim.models import word2vec, keyedvectors
model = word2vec.Word2Vec(size=50, min_count=1, hs=1, negative=0)
model.build_vocab(sentences)
model.train(sentences, total_examples=model.corpus_count, epochs=model.epochs)

(9784246, 12376900)

sims = model.wv.most_similar('蛋糕', topn=10)
sims

在这里插入图片描述

sims = model.wv.most_similar('鸡蛋', topn=10)
sims

在这里插入图片描述

sims = model.wv.most_similar('猪肉', topn=10)
sims

在这里插入图片描述

sims = model.wv.most_similar('牛肉', topn=10)
sims

在这里插入图片描述

  • 从上面分析我们发现,美食up主比较喜欢:蛋糕、面包、鸡蛋、面粉、牛奶食材类的美食,难道是因为喜欢吃甜的,还是因为比较容易操作
  • 其次也喜欢做做肉类的食物,比如猪肉,牛肉等

2.2 最受欢迎的美食UP有什么共同之处

data.head(2)

在这里插入图片描述

a. 最受欢迎的美食UP的评分计算

目标是寻找综合得分最高的美食up主播:视频质量高、互动效果最好的UP
我们可以根据播放量,弹幕数,点赞数,金币数,收藏量,分享数以及评论数的总和的视频平均得分来定义最受欢迎的美食up主
在这里插入图片描述

import re

def get_nums(x):
    res=re.findall(r"\d+\.?\d*",x)
    
    if len(res)>0:
        num=float(res[0])
        if '万' in x:
            return num*10000
        return num
    return 0
tmp=pd.DataFrame()
tmp['up']=data['发布者']
tmp['play_count']=data['总播放数'].apply(lambda x:get_nums(str(x))).astype("float")
tmp['barrage_count']=data['总弹幕数'].apply(lambda x:get_nums(str(x))).astype("float")
tmp['vote_count']=data['点赞数'].apply(lambda x:get_nums(str(x))).astype("float")
tmp['coin_count']=data['金币数'].apply(lambda x:get_nums(str(x))).astype("float")
tmp['favorite_count']=data['收藏量'].apply(lambda x:get_nums(str(x))).astype("float")
tmp['share_count']=data['分享数'].apply(lambda x:get_nums(str(x))).astype("float")
tmp['review_count']=data['评论数'].apply(lambda x:get_nums(str(x))).astype("float")

tmp['play_count'].describe()
tmp['barrage_count'].describe()
tmp['vote_count'].describe()
tmp.describe()

在这里插入图片描述

# 美食up评分
tmp['up'].value_counts()

在这里插入图片描述

tmp['video_count']=tmp.groupby(by='up')['play_count'].transform('count')
tmp['video_count'].describe()

在这里插入图片描述

tmp['score']=tmp[count_columns].sum(axis=1)
tmp['score']

在这里插入图片描述

tmp['popular_score']=tmp.groupby(by='up')['score'].transform('sum')/tmp['video_count']
tmp['popular_score']=tmp['popular_score']*100
tmp['popular_score'].describe()

在这里插入图片描述

up_score={}
for index,row in tmp.iterrows():
    if row['up'] not in up_score:
        up_score[row['up']]=row['popular_score']
# up_score
b. 最受欢迎的top5美食UP的共同之处
# sorted(up_score.items(),key=lambda x:x[1],reverse=False)[-2]
top5_ups=sorted(up_score.items(),key=lambda x:x[1],reverse=False)[-5:]
top5_ups

在这里插入图片描述

import pyecharts.options as opts
from pyecharts.charts import Line, Grid
from pyecharts.commons.utils import JsCode



x_data = [x[0] for x in top5_ups]
print(x_data)
y_data =  [y[1] for y in top5_ups]

background_color_js = (
    "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
    "[{offset: 0, color: '#c86589'}, {offset: 1, color: '#06a7ff'}], false)"
)
area_color_js = (
    "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
    "[{offset: 0, color: '#eb64fb'}, {offset: 1, color: '#3fbbff0d'}], false)"
)

c = (
    Line(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js)))
    .add_xaxis(xaxis_data=x_data)
    .add_yaxis(
        series_name="主播热度",
        y_axis=y_data,
        is_smooth=True,
        is_symbol_show=True,
        symbol="circle",
        symbol_size=6,
        linestyle_opts=opts.LineStyleOpts(color="#fff"),
        label_opts=opts.LabelOpts(is_show=True, position="top", color="white"),
        itemstyle_opts=opts.ItemStyleOpts(
            color="red", border_color="#fff", border_width=3
        ),
        tooltip_opts=opts.TooltipOpts(is_show=False),
        areastyle_opts=opts.AreaStyleOpts(color=JsCode(area_color_js), opacity=1),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="B站最受欢迎的美食UP",
            pos_bottom="3%",
            pos_left="center",
            title_textstyle_opts=opts.TextStyleOpts(color="#fff", font_size=15),
        ),
        xaxis_opts=opts.AxisOpts(
            type_="category",
            boundary_gap=False,
            axislabel_opts=opts.LabelOpts(margin=3, color="#ffffff63"),
            axisline_opts=opts.AxisLineOpts(is_show=False),
            axistick_opts=opts.AxisTickOpts(
                is_show=True,
                length=10,
                linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
            ),
            splitline_opts=opts.SplitLineOpts(
                is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
            ),
        ),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            position="right",
            axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63"),
            axisline_opts=opts.AxisLineOpts(
                linestyle_opts=opts.LineStyleOpts(width=2, color="#fff")
            ),
            axistick_opts=opts.AxisTickOpts(
                is_show=True,
                length=30,
                linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
            ),
            splitline_opts=opts.SplitLineOpts(
                is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
            ),
        ),
        legend_opts=opts.LegendOpts(is_show=False),
    )
)

(
    Grid()
    .add(
        c,
        grid_opts=opts.GridOpts(
            pos_top="20%",
            pos_left="10%",
            pos_right="10%",
            pos_bottom="15%",
            is_contain_label=True,
        ),
    )
    # .render("beautiful_line_chart.html")
)
c.render_notebook()

在这里插入图片描述

c. 最受欢迎的美食UP的共同之处
[('食贫道', 157.639744308143),
 ('盗月社食遇记', 157.8850674826937),
 ('李子柒', 166.98607295886805),
 ('绵羊料理', 167.51002373169584),
 ('罗翔说刑法', 371.44284802902325)]
data[data['发布者'].isin(['罗翔说刑法'])].head(3)

在这里插入图片描述

data[data['发布者'].isin(['绵羊料理'])].head(3)

在这里插入图片描述

data[data['发布者'].isin(['李子柒'])].head(3)

在这里插入图片描述

data[data['发布者'].isin(['盗月社食遇记'])].head(3)

在这里插入图片描述
通过计算美食up主播的流行性评分,我们可以看出:

  • 比较受欢迎的美食up主播的视频播放量都会非常高,能够达到几百万的两级,比如流行性评分第一名的主播罗翔说刑法的单个视频播放量达到了800+万
  • 这些大V主播的运营能力比较强或者具有专业的运营团队,他们视频定位以及标签、简介都很完善,标题同时具有吸引力
  • 他们一般喜欢下午或者晚上发布视频,因为大家都下班或者休息了,这样曝光率会更高

2.3 浏览/投币 比最高的视频是

这个比较简单,我们可以直接通过视频的总播放数以及每个视频的金币数可以达到我们目标视频
注意:在get_nums函数里需要识别带有**万**字的数字,需要乘以10000

存在“相同视频” 我们可以对数据进行去重

print("去重之前的数据大小:",data.shape)
data=data.drop_duplicates(subset=['标题','发布者','发布者'],keep='first')
print("去重之后的数据大小:",data.shape)

去重之前的数据大小: (47012, 12)
去重之后的数据大小: (25544, 12)

a. 浏览最多的视频
data['play_count']=data['总播放数'].apply(lambda x:get_nums(str(x))).astype("float")
data['play_count'].describe()

在这里插入图片描述

# 按照总播放数从大到小排序
data=data.sort_values(by='play_count',ascending=False)
data.head(5)

在这里插入图片描述

video_counts=dict(zip(data['标题'],data['play_count']))
top_videos=sorted(video_counts.items(),key=lambda x:x[1],reverse=False)[-10:]
top_videos

在这里插入图片描述

from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.commons.utils import JsCode
from pyecharts.faker import Faker
x_data = [x[0] for x in top_videos]
y_data =  [y[1] for y in top_videos]
c = (
    Bar()
    .add_xaxis(x_data)
    .add_yaxis("视频播放量", y_data, category_gap="60%")
    .set_series_opts(
        itemstyle_opts={
            "normal": {
                "color": JsCode(
                    """new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                offset: 0,
                color: 'rgba(0, 244, 255, 1)'
            }, {
                offset: 1,
                color: 'rgba(0, 77, 167, 1)'
            }], false)"""
                ),
                "barBorderRadius": [30, 30, 30, 30],
                "shadowColor": "rgb(0, 160, 221)",
            }
        }
    )
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-10)),
        title_opts=opts.TitleOpts(title="播放数量最多的10个视频"))
    # .render("bar_border_radius.html")
)

grid=Grid()
# 仅使用pos_top修改相对顶部的位置
# grid.add(c,grid_opts=opts.GridOpts(pos_bottom="50%"))

c.render_notebook()
grid=Grid()
# 仅使用pos_top修改相对顶部的位置
grid.add(c,grid_opts=opts.GridOpts(pos_bottom="20%"))
grid.render_notebook()

在这里插入图片描述

data['coin_count']=data['金币数'].apply(lambda x:get_nums(str(x))).astype("float")
data['coin_count'].describe()

在这里插入图片描述

# 按照总播放数从大到小排序
data=data.sort_values(by='coin_count',ascending=False)
video_counts=dict(zip(data['标题'],data['coin_count']))
top_videos=sorted(video_counts.items(),key=lambda x:x[1],reverse=False)[-10:]
top_videos

在这里插入图片描述

from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.charts import Bar,Grid
from pyecharts.faker import Faker
x_data = [x[0] for x in top_videos]
y_data =  [y[1] for y in top_videos]
c = (

    Bar()
    .add_xaxis(x_data)
    .add_yaxis("视频投币数", y_data)
    .reversal_axis()
    .set_series_opts(label_opts=opts.LabelOpts(position="right"))
    .set_global_opts(title_opts=opts.TitleOpts(title="视频投币数"))
    # .render("bar_reversal_axis.html")
)
grid=Grid()
# 仅使用pos_top修改相对顶部的位置
grid.add(c,grid_opts=opts.GridOpts(pos_left="40%"))
grid.render_notebook()

在这里插入图片描述

2.4 美食视频的热门标签是什么?哪些标签的视频更容易火

!pip uninstall plotly cufflinks -y
!pip install plotly -i  https://pypi.tuna.tsinghua.edu.cn/simple
!pip install cufflinks -i https://pypi.tuna.tsinghua.edu.cn/simple
from plotly import tools
import plotly.graph_objs as go
from plotly.offline import iplot
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
%matplotlib inline

from matplotlib import rcParams
import seaborn as sns
from plotly import tools
import plotly.graph_objs as go
from plotly.offline import iplot
%matplotlib inline
plt.rcParams['figure.figsize'] = [10, 5]
import cufflinks as cf
cf.go_offline()
cf.set_config_file(offline=False, world_readable=True)
a. 标签的热点词
# 从标签中获取top-n个词
def get_top_n_words(corpus, n=None):
    vec = CountVectorizer().fit(corpus)
    bag_of_words = vec.transform(corpus)
    sum_words = bag_of_words.sum(axis=0) 
    words_freq = [(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.items()]
    words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)
    return words_freq[:n]

#从标签中获取出现次数最多的20个词
common_words = get_top_n_words(tag_texts, 20)

#打印词语与词频
for word, freq in common_words:
    print(word, freq)

#构建词语与词频的dataframe
df1 = pd.DataFrame(common_words, columns = ['word' , 'count'])

#对每个词语所有的词频进行累加并展示
df1.groupby('word').sum()['count'].sort_values(ascending=False).iplot(
    kind='bar', yTitle='Count', linecolor='black', title='视频标签中的Top 20个词')

美食 197577
制作 30706
vlog 19669
挑战 15382
打卡 13018
侦探 11737
田园 11313
测评 11232
记录 10449
生活 10019
人生 8873
百味 8872
探店 8818
农村 8503
年度 7161
料理 7150
家常菜 6601
教程 6340
创作 6086
吃货 5740

在这里插入图片描述

b. 标签的热门词语
# 获取top-k的bigra词组
def get_top_n_bigram(corpus, n=None):
    vec = CountVectorizer(ngram_range=(2, 2)).fit(corpus)
    bag_of_words = vec.transform(corpus)
    sum_words = bag_of_words.sum(axis=0) 
    words_freq = [(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.items()]
    words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)
    return words_freq[:n]

#从标签中获取出现次数最多的20个词
common_words = get_top_n_bigram(tag_texts, 20)

#打印词语与词频
for word, freq in common_words:
    print(word, freq)
    
#构建词语与词频的dataframe
df2 = pd.DataFrame(common_words, columns = ['word' , 'count'])

#对每个词语所有的词频进行累加并展示
df2.groupby('word').sum()['count'].sort_values(ascending=False).iplot(
    kind='bar', yTitle='Count', linecolor='black', title='视频标签中的Top 20个bigrams')

美食 美食 87290
美食 制作 19892
美食 vlog 15543
打卡 挑战 12924
美食 侦探 11731
美食 田园 9418
田园 美食 9131
人生 百味 8861
美食 测评 8176
百味 年度 7131
年度 美食 7131
农村 美食 6622
料理 制作 6139
美食 记录 5861
制作 教程 5833
制作 美食 5661
吃货 美食 5122
美食 探店 4860
厨艺 美食 4478
制作 人生 4118

在这里插入图片描述

c. 标签的热点短语
def get_top_n_trigram(corpus, n=None):
    vec = CountVectorizer(ngram_range=(3, 3), stop_words='english').fit(corpus)
    bag_of_words = vec.transform(corpus)
    sum_words = bag_of_words.sum(axis=0) 
    words_freq = [(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.items()]
    words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)
    return words_freq[:n]

common_words = get_top_n_trigram(tag_texts, 20)

for word, freq in common_words:
    print(word, freq)

#构建词语与词频的dataframe
df3 = pd.DataFrame(common_words, columns = ['word' , 'count'])

#对每个词语所有的词频进行累加并展示
df3.groupby('word').sum()['count'].sort_values(ascending=False).iplot(
    kind='bar', yTitle='Count', linecolor='black', title='视频标签中的Top 20个trigrams')

美食 美食 美食 36312
美食 美食 制作 18082
美食 田园 美食 9048
美食 美食 田园 8722
美食 美食 侦探 7665
美食 美食 测评 7253
人生 百味 年度 7131
百味 年度 美食 7130
美食 美食 记录 5729
厨艺 美食 美食 4437
吃货 美食 美食 4433
制作 美食 vlog 4237
美食 制作 人生 4118
制作 人生 百味 4118
创作 美食 美食 3871
美食 侦探 悬赏 3818
美食 制作 美食 3797
农村 美食 美食 3477
制作 制作 教程 3036
探店 美食 美食 2665

在这里插入图片描述
从上面视频美食标签的中,我们可以得到一些常见的词语或者词组:

  • 视频标签的基础词汇:美食,制作,vlog,挑战,打卡,年度,农村
  • 视频标签的常用词组:美食 制作,打卡 挑战,年度 美食,农村 美食,制作 教程

2.5. 高流量的视频的财富密码是(标题关键字?发布时间)

我们按照浏览量 从大到小 进行排序

data=data.sort_values(by='play_count',ascending=False)
data.head(3)

在这里插入图片描述

data.shape

(25544, 14)

为了有效分析高浏览量的视频的财富密码,我们基于浏览量次数排名前1000的文章进行关键词和时间分析

top1000_videos=data.iloc[0:1000,:]
top1000_videos['play_count'].describe()

在这里插入图片描述

# top1000_videos=top1000_videos.dropna()
top1000_videos.shape

(1000, 14)

a. 基于Tfidf关键词提取
import jieba.analyse
from collections import Counter
food_stop_words=['作品','美食','美味','人','味道','学会','教程',
    '锅','配方','营养','家常','早餐','家人','工人','小吃','大厨',
    '大家','食谱','技巧','日记','企时','方法','孩子','懒人',
    '正宗','厨房','手','饭','饭店','过瘾','农村']
food_stop_words2=['视频','食材','口感','物','评论','时间','西施',
'朋友','油管','手工','菜','农村']
food_stop_words3=['原','博','时候','小伙伴',
'一键','记录','家庭','技术','文化','减脂',
'教学','小时','材料','量','天']

keywords=[]

for title in top1000_videos['标题']:
    keywords_top=jieba.analyse.extract_tags(title,topK=3)
    # print(keywords_top)
    keywords.extend(keywords_top)

keywords_cnt=Counter(keywords)
len(keywords_cnt)
top50_keywords=keywords_cnt.most_common(50)
top50_keywords[:10]

在这里插入图片描述

#构建词语与词频的dataframe
df3 = pd.DataFrame(top50_keywords, columns = ['word' , 'count'])

#对每个词语所有的词频进行累加并展示
df3.groupby('word').sum()['count'].sort_values(ascending=False).iplot(
    kind='bar', yTitle='Count', linecolor='black', title='Tf-Idf标题关键词')

在这里插入图片描述

b. 基于TextRank关键词提取
keywords=[]
for title in top1000_videos['标题']:
    keywords_top=jieba.analyse.textrank(title, topK=3, withWeight=False, allowPOS=('ns','n','vn','v')) 
    # print(keywords_top)
    keywords.extend(keywords_top)

keywords_cnt=Counter(keywords)
len(keywords_cnt)
top50_keywords=keywords_cnt.most_common(50)
print(top50_keywords[:10])
#构建词语与词频的dataframe
df3 = pd.DataFrame(top50_keywords, columns = ['word' , 'count'])

#对每个词语所有的词频进行累加并展示
df3.groupby('word').sum()['count'].sort_values(ascending=False).iplot(
    kind='bar', yTitle='Count', linecolor='black', title='TextRank标题关键词')

[(‘活动’, 344),
(‘作品’, 270),
(‘试吃’, 22),
(‘火锅’, 21),
(‘兄弟’, 18),
(‘重庆’, 17),
(‘牛肉’, 16),
(‘顶级’, 16),
(‘探店’, 16),
(‘退潮’, 16)]

在这里插入图片描述
我们从上面可以发现什么:

  • 首先可以知道在浏览量前1000的文章中浏览量分布,其中浏览量最大值为6839000(680万+),最小值295000(29万+),平均值为 742412(74万+),说明这些视频浏览数量都是很高的也比较具有代表性
  • 其次我们通过两种方式:Tfidf和Textrank算法提取标题关键词为:活动,作品,试吃,牛肉,拉面,等
  • 其次不少标题中出现了数字,我们看看还有数字的标题有哪些:从下面可以看出播放量1000的文章标题中约有43.8%的包含了数字,大多数代表了没试的价格,看来吃货们不仅关心是否好吃,同时还关心是否实惠,明码标价是最好的宣传方式
top1000_videos[top1000_videos['标题'].str.contains(r'\d+', regex=True)].shape

(438, 14)

top1000_videos[top1000_videos['标题'].str.contains(r'\d+', regex=True)].head()

在这里插入图片描述

c. 发布时间探索
# 将时间字符串转为时间格式
top1000_videos['time']=pd.to_datetime(top1000_videos['发布时间'])
top1000_videos['year']=top1000_videos['time'].dt.year.astype('Int64')
top1000_videos['month']=top1000_videos['time'].dt.month.astype('Int64')
top1000_videos['day']=top1000_videos['time'].dt.day.astype('Int64')
top1000_videos['hour']=top1000_videos['time'].dt.hour.astype('Int64')
top1000_videos['weekday']=top1000_videos['time'].dt.weekday.astype('Int64')+1
weekday_map={1:'周一',2:'周二',3:'周三',4:'周四',5:'周五',6:'周六',7:'周日'}
top1000_videos['weekday']=top1000_videos['weekday'].apply(lambda x:weekday_map[x] if x in weekday_map else '周一')
top1000_videos.head(2)

在这里插入图片描述

values = top1000_videos['weekday'].value_counts(dropna=False).keys().tolist()
counts = top1000_videos['weekday'].value_counts(dropna=False).tolist()
weekday_counts = dict(zip(values, counts))
print(weekday_counts)

{‘周五’: 173, ‘周三’: 147, ‘周日’: 145, ‘周一’: 140, ‘周二’: 140, ‘周六’: 136, ‘周四’: 119}

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker

c = (
    Pie()
    .add(
        "",
        [list(z) for z in zip(weekday_counts.keys(), weekday_counts.values())],
        radius=["40%", "75%"],
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="每周热门视频的发布数据分布"),
        legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    # .render("pie_radius.html")
)
c.render_notebook()

在这里插入图片描述
我们可以看出其实每周热门视频发布比例还是比较均匀的,但是有意思的现象是:周五发布的最多,其次是周三 周日和周一,奇数排在了前面,大家也可以验证下更多的视频
小时粒度的热门视频分布

top1000_videos['hour']=top1000_videos['hour'].astype(str)
values = top1000_videos['hour'].value_counts(dropna=False).keys().tolist()
counts = top1000_videos['hour'].value_counts(dropna=False).tolist()
hour_counts = dict(zip(values, counts))
hour_counts

{‘18’: 294,
‘17’: 198,
‘19’: 102,
‘11’: 93,
‘16’: 84,
‘12’: 51,
‘20’: 46,
‘15’: 23,
‘21’: 19,
‘14’: 18,
‘10’: 18,
‘22’: 14,
‘9’: 8,
‘0’: 6,
‘8’: 6,
‘23’: 5,
‘13’: 5,
‘1’: 4,
‘6’: 2,
‘7’: 2,
‘’: 1,
‘5’: 1}

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker

c = (
    Pie()
    .add(
        "",
        [list(z) for z in zip(hour_counts.keys(), hour_counts.values())],
        radius=["40%", "75%"],
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="视频发布时刻-小时分布"),
        legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    # .render("pie_radius.html")
)
c.render_notebook()

在这里插入图片描述
从上图可以看出,热门视频集中在中午(11点)、傍晚:16-19点区间,是不是都是在饭店左右哈哈?

关注公众号:『AI学习星球
回复:B站美食视频图鉴 即可获取数据下载。
论文辅导算法学习可以通过公众号滴滴我

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值