首先
相信有很多小伙伴都喜欢玩抖音吧,最近抖音张同学突然火了,两个月涨粉一千多万。看了他的视频,满满的生活气息,让人有一种家的感觉。这就让我很感兴趣了,必须得用Python对他分析一下。
今天这篇文章,我抓取了张同学的视频的评论数据,想从文本分析的角度,挖掘一下大家对张同学感兴趣的点。
张同学 10.4号开始发视频,视频的点赞量一直很高,11.17 号的视频达到了顶峰,收获 250w 个赞,之后关注量也开启了暴涨。
所以挖掘 11.17 号视频的评论,更有助于我们达成目的。
1. 抓取数据
抖音出了 web 版,抓取数据方便了很多。
滑到网页评论区,在浏览器网络请求里过滤包含comment的请求,不断刷新评论就可以看到评论的接口。
有了接口,就可以写 Python 程序模拟请求,获取评论数据。
请求数据要设置一定间隔,避免过大请求,影响别人服务
抓取评论数据有两点需要注意:
•有时候接口可能返回空数据,因此需要多试几次,一般过了人工滑动验证后的接口基本可用
•不同页面之间的数据可能会重复,所以需要跳页请求
2. EDA
11.17 号的视频有 12w 条评论,我只抓取了 1w 多条。
text列是评论。
先对数据做一些探索性的分析,之前介绍过几个EDA工具,可以自动产出基础的数据统计和图表。
这次我用的是ProfileReport
#####Python学习交流Q群:906715085##### #eda profile = ProfileReport(df, title=\'张同学抖音评论数据\', explorative=True) profile
评论时间分布
从评论的时间分布来看,由于发布的视频的时间是17号,所有17、18号评论发布量比较多。不过再往后甚至到了 12.9 号,仍然有不少新评论产生,说明视频热度确实很高。
评论的长度分布
大多数评论的字数在 20 以内,基本不超过 40 个字,说明都是短文本。
评论者身份
参与评论的人里, 99.8% 是没有认证身份的,说明评论用户里基本都是普通用户。
3. LDA
上面的统计数据还是太粗略了。
但我们要想知道大家的感兴趣点在哪,又不可能细到把 1.2w 条评论全部看完。
所以需要对这些评论先做一次归类,相当于把数据升维,抽象。因为只有将数据升维,了解每个维度的含义和占比,才能帮助我们从全局角度掌握数据。
这里我用LDA算法对文本聚类,聚合在一起的评论可以看做属于同一个主题。
LDA算法的核心思想有两点:
•具有一定相似性的文本会聚合在一起,形成一个主题。每个主题包含生成该主题需要的词,以及这些词的概率分布。以此可以人为推断出主题的类别。
•每篇文章会它有在所有主题下的概率分布,以此可以推断出文章属于哪个主题。
比如,经过LDA算法聚类后,某个主题中,战争、军费这类词出现概率很高,那么我们可以将该主题归类为军事。如果有一篇文章属于军事主题的概率很高,我们就可以将该文章分为军事一类。
简单介绍完LDA的理论,下面我们来实战一下。
3.1 分词、去停用词
#分词 emoji = {\'可怜\', \'发呆\', \'晕\', \'灵机一动\', \'击掌\', \'送心\', \'泣不成声\', \'哈欠\', \'舔屏\', \'偷笑\', \'愉快\', \'再见\', \'666\', \'熊吉\', \'尬笑\', \'吐舌\', \'撇嘴\', \'看\', \'绿帽子\', \'捂脸\', \'呆无辜\', \'强壮\', \'震惊\', \'阴险\', \'绝\', \'给力\', \'打脸\', \'咖啡\', \'衰\', \'一起加油\', \'酷拽\', \'流泪\', \'黑脸\', \'爱心\', \'笑哭\', \'机智\', \'困\', \'微笑袋鼠\', \'强\', \'闭嘴\', \'来看我\', \'色\', \'憨笑\', \'不失礼貌的微笑\', \'红脸\', \'抠鼻\', \'调皮\', \'紫薇别走\', \'赞\', \'比心\', \'悠闲\', \'玫瑰\', \'抱拳\', \'小鼓掌\', \'握手\', \'奸笑\', \'害羞\', \'快哭了\', \'嘘\', \'惊讶\', \'猪头\', \'吐\', \'暗中观察\', \'不看\', \'啤酒\', \'呲牙\', \'发怒\', \'绝望的凝视\', \'大笑\', \'吐血\', \'坏笑\', \'凝视\', \'可爱\', \'拥抱\', \'擦汗\', \'鼓掌\', \'胜利\', \'感谢\', \'思考\', \'微笑\', \'疑问\', \'我想静静\', \'灵光一闪\', \'白眼\', \'泪奔\', \'耶\'} stopwords = [line.strip() for line in open(\'stop_words.txt\', encoding=\'UTF-8\').readlines()] def fen_ci(x): res = [] for x in jieba.cut(x): if x in stopwords or x in emoji or x in [\'[\', \']\']: continue res.append(x) return \' \'.join(res) df[\'text_wd\'] = df[\'text\'].apply(fen_ci)
由于评论中有许多 emoji 表情, 我抽取了所以 emoji 表情对应的文本,生成 emoji 数组,用于过滤表情词。
3.2 调用LDA
from sklearn.feature_extraction.text import CountVectorizer from sklearn.decomposition import LatentDirichletAllocation import numpy as np def run_lda(corpus, k): cntvec = CountVectorizer(min_df=2, token_pattern=\'\\w+\') cnttf = cntvec.fit_transform(corpus) lda = LatentDirichletAllocation(n_components=k) docres = lda.fit_transform(cnttf) return cntvec, cnttf, docres, lda cntvec, cnttf, docres, lda = run_lda(df[\'text_wd\'].values, 8)
经过多次试验,将数据分成 8 类效果较好。
选取每个主题下出现概率 top20 的词:
主题的词分布
从这些词概率分布,归纳各主题的类别,主题0 ~ 主题7分别是:居然看完、知道钥匙在哪、农村生活、喂狗、拍摄手法、还用锁门?、鸡蛋放盐多、袜子放枕头下。
统计主题占比:
主题占比
红色的是主题3(喂狗),占比最大,很多人评论是:以为要做给自己吃,没想到是喂狗的。我看的时候也是这样认为的。
其他各主题占比比较均匀。
经过主题分类后,我们可以发现,张同学不仅仅是农村生活引起了大家的关注,更多的是视频中大量反常态的镜头。
最后,用树状图展示各主题及对应的具体评论。
主题下的文章
图太大,只截取了一部分。
从抓数据到分析,做得比较仓促。
核心代码已经贴在文章里。完整代码还在整理,需要代码或者文章有疑问的朋友可以在评论区留言。应该很多人还是喜欢张同学的,这一篇就到这里就莫得了。
来源:https://www.cnblogs.com/123456feng/p/16071484.html
本站部分图文来源于网络,如有侵权请联系删除。