Labubu为什么火?基于多平台数据的潮玩IP受众与舆情分析
本研究分析抖音、B站和小红书平台关于潮玩IP“Labubu”的用户评论数据(共7069条),探讨其火爆原因及舆论特征。通过情感分析和词频统计发现,评论呈现两极分化:极端负面评价(占比49.5%)集中批评“泡沫经济”“智商税”等,反映对盲盒商业模式的质疑;极端正面评价(11.3%)则强调“可爱”“文化输出”等情感价值。地域分布显示,广东、江浙沪用户讨论最活跃,海外以美日为主。词云分析揭示核心争议围绕
🤵♂️ 个人主页:@艾派森的个人主页
✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
目录
1.项目背景
近年来,中国潮玩市场迅速崛起,以泡泡玛特(POP MART)为代表的品牌通过盲盒经济和IP运营成功打开了年轻消费群体市场。其中,Labubu作为泡泡玛特旗下的核心IP之一,凭借其独特的设计风格和限量营销策略,在社交媒体上引发了广泛讨论,既收获了忠实粉丝的追捧,也面临“炒作”“泡沫”等质疑。
然而,关于Labubu的爆火原因,现有研究多聚焦于商业模式分析或消费者行为理论,而较少基于真实用户数据探讨其受众特征和舆情态势。尤其是在不同社交平台(如B站、抖音、小红书)上,用户对Labubu的态度是否存在差异?负面评价主要集中在哪些方面?粉丝的忠诚度又源于哪些情感驱动?这些问题尚未得到系统的数据验证。
因此,本研究拟通过爬取多平台(B站、抖音、小红书)的用户评论数据,结合情感分析、词频统计、地域分布等方法,深入解析:
-
Labubu的核心受众画像(性别、地域、平台差异);
-
舆情情感分布及争议焦点(为何负面评价占比极高?);
-
潮玩IP的爆火逻辑——是依赖情感消费,还是存在市场泡沫?
研究成果不仅能为潮玩行业的IP运营提供数据支持,也可作为Z世代消费文化的典型案例,探讨当代年轻人对“情感溢价”和“品牌价值”的认知冲突。
2.数据集介绍
本实验数据集分别采集抖音、B站和小红书平台中关于“Labubu为什么火”相关视频下面的用户评论数据,其中抖音3142条数据,B站2500条数据,小红书1427条数据。
抖音评论:
B站评论:
小红书评论:
3.技术工具
Python版本:3.9
代码编辑器:jupyter notebook
pip install transformers==4.41.1
pip install tf-keras==2.16.0
pip install torch==2.5.0
4.实验过程
4.1导入数据
导入第三方库并加载数据集
import matplotlib.pylab as plt
import numpy as np
import seaborn as sns
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False #解决符号无法显示
import warnings
warnings.filterwarnings('ignore')
dy_comment = pd.read_csv('dy_comment.csv')
bz_comment = pd.read_csv('bz_comment.csv')
xhs_comment = pd.read_csv('xhs_comment.csv')
# 合并三个数据集,取共有字段
new_df = pd.concat([dy_comment[['用户昵称','IP属地','评论时间','评论内容']],
bz_comment[['用户昵称','IP属地','评论时间','评论内容']],
xhs_comment[['用户昵称','IP属地','评论时间','评论内容']]])
new_df.head()
依次查看三个数据集文件
删除缺失值和重复值
# 删除缺失数据
dy_comment.dropna(inplace=True)
bz_comment.dropna(inplace=True)
xhs_comment.dropna(inplace=True)
# 删除重复数据
dy_comment.drop_duplicates(inplace=True)
bz_comment.drop_duplicates(inplace=True)
xhs_comment.drop_duplicates(inplace=True)
4.2数据可视化
性别比例分布
分析B站数据中的性别比例
sns.countplot(data=bz_comment,x='用户性别')
print(bz_comment['用户性别'].value_counts())
plt.show()
man,woman=789,235 #准备男、女的人数及比例
man_perc = man /(man+woman) #计算男生女生所占的比
woman_perc = woman /(man+woman)
#调用pie绘制饼图 传入一个列表,列表中是比例数据
paches,texts,autotexts = plt.pie([man_perc,woman_perc],
autopct='%0.1f%%',labels=['男','女'],explode =(0,0.1))
#设置字体大小和颜色
for text in autotexts:
text.set_color('white')
text.set_fontsize(24)
for t in texts:
t.set_color('red')
t.set_fontsize(18)
从结果来看,男性比例大于女性比例,这一结果可能与事实相反,还需进一步验证,可能原因如下:
Labubu这类IP潮玩(如泡泡玛特)的传统受众以女性为主,但B站男性用户基数大(平台性别比约6:4),可能稀释了女性比例。
男性用户更倾向于在B站发表评论,而女性用户可能活跃在小红书等其他平台。
Labubu的“为什么火”讨论可能吸引了更多对“流行文化分析”感兴趣的男性用户。
用户评论长度分布特征
查看三大平台的用户评论长度分布情况
plt.figure(figsize=(10, 8))
# 第一个子图(左上)
plt.subplot(2, 2, 1)
sns.histplot(x=[len(x) for x in dy_comment['评论内容']],kde=True)
plt.title('抖音用户评论长度分布')
# 第二个子图(右上)
plt.subplot(2, 2, 2)
sns.histplot(x=[len(x) for x in bz_comment['评论内容']],kde=True)
plt.title('B站用户评论长度分布')
# 第三个子图(左下)
plt.subplot(2, 2, 3)
sns.histplot(x=[len(x) for x in xhs_comment['评论内容']],kde=True)
plt.title('小红书用户评论长度分布')
# 第四个子图(右下)
plt.subplot(2, 2, 4)
dy_comment_len = np.mean([len(x) for x in dy_comment['评论内容']])
bz_comment_len = np.mean([len(x) for x in bz_comment['评论内容']])
xhs_comment_len = np.mean([len(x) for x in xhs_comment['评论内容']])
plt.bar(x=['抖音','B站','小红书'],
height=[dy_comment_len,bz_comment_len,xhs_comment_len],
color=['#FF9999', '#99CCFF', '#FFCC99']
)
plt.title('各平台用户评论长度均值')
plt.tight_layout()
plt.show()
整体上看,抖音、B站、小红书的评论长度均呈长尾分布,即大多数评论较短,少数评论极长(可能包含详细讨论或复制粘贴内容)。抖音和小红书评论长度高度集中在 0-50 字符(短文本主导),符合“快速互动”场景(如表情包、简短回复),其均值接近(抖音 19.1,小红书 21.9),说明两者用户评论习惯相似。而B站评论范围更广(0-100 字符),且均值显著更高(39.0),反映用户更倾向于发表中长评论。这也反应了平台的特性,即抖音/小红书注重碎片化浏览,B站强调社区互动(弹幕+评论文化)。
国内IP分布特征
# 处理IP变量获取地图数据
china_divisions = [
"河北", "山西", "辽宁", "吉林", "黑龙江",
"江苏", "浙江", "安徽", "福建", "江西",
"山东", "河南", "湖北", "湖南", "广东",
"海南", "四川", "贵州", "云南", "陕西",
"甘肃", "青海",
"北京", "天津", "上海", "重庆",
"内蒙古", "广西", "西藏", "宁夏", "新疆",
'中国台湾'
]
result = []
for x,y in zip(new_df['IP属地'].value_counts().index.to_list(),new_df['IP属地'].value_counts().values.tolist()):
if x == '新疆':
result.append(['新疆维吾尔自治区',y])
elif x == '西藏':
result.append(['西藏自治区',y])
elif x == '内蒙古':
result.append(['内蒙古自治区',y])
elif x == '宁夏':
result.append(['宁夏回族自治区',y])
elif x in ['重庆','北京','天津','上海']:
result.append([x + '市',y])
elif x == '广西':
result.append(['广西壮族自治区',y])
elif x == '中国香港':
result.append(['香港特别行政区',y])
elif x == '中国澳门':
result.append(['澳门特别行政区',y])
elif x == '中国台湾':
result.append(['台湾省',y])
elif x == '未知':
pass
elif x not in china_divisions:
pass
else:
result.append([x+'省',y])
result
接着做出热力地图可视化
from pyecharts.charts import *
from pyecharts import options as opts
map = Map()
map.add('各省份评论数量',result,
maptype='china',
is_map_symbol_show=False,
label_opts=opts.LabelOpts(is_show=False))
map.set_global_opts(
visualmap_opts=opts.VisualMapOpts(max_=800,min_=1)
)
map.render_notebook()
从评论数量的地理分布来看,Labubu相关讨论呈现出明显的区域集中性,与我国互联网用户密度和经济发展水平高度吻合。广东省以984条评论遥遥领先,江浙沪(江苏566、浙江546、上海381)紧随其后,共同构成了第一梯队,这与长三角、珠三角地区高度发达的潮玩消费市场和活跃的年轻群体特征相符。第二梯队的山东、河南、北京、四川等省份的评论量在300-400区间,反映出区域中心省份的文化传播影响力。值得注意的是,港澳台地区的评论量显著低于内地省份(香港31、台湾12、澳门4),可能受平台用户基数限制或文化差异影响。整体分布呈现"东密西疏"的典型特征,西部省份如西藏(7)、青海(6)的参与度较低,与人口密度和互联网渗透率呈正相关。这种地理分布模式与我国潮玩消费市场的区域成熟度基本一致,侧面印证了Labubu作为都市青年文化的符号属性。
国外IP分布特征
# 分析国外IP
result = []
for x,y in zip(new_df['IP属地'].value_counts().index.to_list(),new_df['IP属地'].value_counts().values.tolist()):
if x in china_divisions:
pass
elif x == '中国香港':
pass
elif x == '中国澳门':
pass
elif x == '中国台湾':
pass
elif x == '未知':
pass
elif x == 'IP未知':
pass
else:
result.append([x,y])
result
从海外评论数据来看,Labubu的国际影响力呈现出以华人文化圈为核心、向发达国家辐射的特点。美国(43条)和日本(42条)的评论量最高,反映出这两个国家作为全球潮玩重要市场对中国IP的接受度,其中日本的高参与度可能与其成熟的动漫衍生品文化有关。英语系国家如澳大利亚(30)、加拿大(22)、英国(18)构成了第二梯队,这与当地华人群体规模和潮玩市场成熟度相匹配。东南亚国家的表现尤为亮眼,马来西亚(20)、新加坡(12)、泰国(6)等地的活跃度超过了部分欧洲发达国家,凸显出中华文化在东南亚地区的传播优势。值得注意的是,虽然评论覆盖了30余个国家和地区,但除头部几个国家外,其他地区的参与度普遍较低(多在5条以下),呈现出明显的"长尾分布",表明Labubu的国际化仍处于初期阶段,影响力主要集中在华人社群和潮流文化发达区域。这种分布格局与中国潮玩出海的整体趋势基本一致,也印证了文化亲和力在IP传播中的关键作用。
4.3数据清洗
在做后面的情感分析之前,需要对评论文本进行清洗工作,从评论数据可以看出,存在表情,例如“[裂开]、[笑哭R]”等字眼需要处理,同时文本中还有很多@用户昵称,评论中常见的 @格式通常如下:
-
@昵称 内容
-
@昵称
-
多个@:
@张三 @李四 一起冲!
这里自定义一个处理函数,并用示例数据进行测试
import re
def text_clean(text):
# 去除@昵称,匹配以@开头,后面跟随任意非空白字符(包括表情、汉字、英文字母等)
comment = re.sub(r'@[\S]+', '', text)
# 去除形如 [笑哭R] 的平台表情
comment = re.sub(r'\[[^\[\]]{1,10}\]', '', comment).strip()
return comment
# 示例数据
comments = [
"@only-y1 感觉火的莫名其妙",
"@张三 @李四 一起冲!",
"@爱吃大米饭",
"有无感的人吗[裂开]",
"过两年就是时代的眼泪了[笑哭R]"
]
# 清洗后的评论
cleaned_comments = [text_clean(c) for c in comments]
print(cleaned_comments)
接着调用函数进行处理
因为有的评论文本全部是@用户昵称,所以在处理之后会出现空缺,先把它定为空值
接着进行删除缺失数据
4.4情感分析
这里选用HuggingFace平台中的预训练模型tabularisai/multilingual-sentiment-analysis
from transformers import pipeline
import warnings
warnings.filterwarnings('ignore')
# 指定模型所在路径
model_path = r"D:\code\HugglingFace\multilingual-sentiment-analysis\model"
# 加载模型
pipe = pipeline("text-classification", model=model_path)
# 使用该 pipeline 进行情感分析
result = pipe(new_df['评论内容'].to_list())
new_df['label'] = [item['label'] for item in result]
new_df['score'] = [item['score'] for item in result]
new_df
统计一下各情绪的数量
可视化
pie_data = new_df['label'].value_counts()
y = pie_data.values
plt.pie(y,
labels=pie_data.index, # 设置饼图标签
autopct='%.2f%%', # 格式化输出百分比
)
plt.show()
从情感分析结果来看,Labubu相关评论呈现出明显的两极分化特征。极端负面评价(Very Negative)以3499条的数量占据绝对主导,远超其他情绪分类的总和,甚至达到极端正面评价(Very Positive)的4倍以上,这种悬殊比例在IP讨论中较为罕见。中性评论(Neutral)以1314条位居第二,表明部分用户保持客观态度,而积极情绪(Positive+Very Positive)合计1396条,虽有一定声量但相对弱势。值得注意的是,普通负面评价(Negative)仅403条,与极端负面形成鲜明对比,暗示用户对Labubu的负面情绪更多表现为强烈抵触而非温和批评。这种情感分布可能反映出该IP存在较大争议性,或遭遇了特定事件的舆情冲击。下一步我将针对Very Negative文本进行分析,这将有助于厘清负面情绪产生的根源,判断是产品本身问题还是网络舆论的阶段性波动。
词频统计
先定义一个词频统计的函数
import collections
import re
import jieba
# 统计词频
def Statistical_word_frequency(df,filename):
jieba.load_userdict('dit.txt') # 这里你可以添加jieba库识别不了的网络新词,避免将一些新词拆开
jieba.initialize() # 初始化jieba
data = ''.join([re.sub(r'[^0-9A-Za-z][^0-9A-Za-z][^0-9A-Za-z][^0-9A-Za-z]:','',item) for item in df])
# 文本预处理 :去除一些无用的字符只提取出中文出来
new_data = re.findall('[\u4e00-\u9fa5]+', data, re.S)
new_data = "".join(new_data)
# 文本分词
seg_list_exact = jieba.cut(new_data)
result_list = []
with open('stopwords.txt', encoding='utf-8') as f: #可根据需要打开停用词库,然后加上不想显示的词语
con = f.readlines()
stop_words = set()
for i in con:
i = i.replace("\n", "") # 去掉读取每一行数据的\n
stop_words.add(i)
for word in seg_list_exact:
if word not in stop_words and len(word) > 1:
result_list.append(word)
word_counts = collections.Counter(result_list)
# 词频统计:获取前50最高频的词
word_counts_top = word_counts.most_common(50)
with open(f'{filename}.txt','w',encoding='utf-8')as f:
for i in word_counts_top:
f.write(str(i[0]))
f.write('\t')
f.write(str(i[1]))
f.write('\n')
接着调用词频函数
Statistical_word_frequency(df=new_df[new_df['label']=='Very Negative']['评论内容'],filename='Very Negative词频统计')
泡泡玛特 350
拉布布 160
盲盒 149
价值 112
娃娃 90
玩具 89
中国 80
不理解 76
炒作 66
不喜欢 64
泡沫 64
审美 63
手办 62
玩偶 61
价格 58
韭菜 56
游戏 55
不好看 54
产品 51
情绪 50
好丑 50
为啥 50
资本 49
智商税 49
消费 45
泡泡 45
洗钱 44
跟风 43
有钱人 42
视频 42
评论 41
看不懂 40
塑料 39
击鼓 39
年轻人 37
很丑 37
郁金香 37
恐怖 36
黄牛 35
搞不懂 35
潮玩 34
经济 33
市场 33
赚钱 33
朋友 32
传花 32
垃圾 32
奢侈品 31
义乌 30
溢价 29
做成词云图可视化
从词频统计和词云图来看,围绕Labubu的负面讨论呈现出明显的经济批判和文化质疑双重特征。"泡泡玛特"作为高频词(350次)直指品牌本身,而"盲盒"(149)、"价值"(112)、"价格"(58)等词汇的密集出现,配合"郁金香"(37)、"泡沫"(64)、"击鼓传花"(32)等隐喻,暴露出用户将潮玩市场与17世纪荷兰郁金香泡沫相类比的心理认知——这种集体记忆的唤醒暗示着相当比例的消费者认为Labubu的爆火是资本运作下的非理性繁荣。"炒作"(66)、"韭菜"(56)、"智商税"(49)等词汇构成的经济批判链条,与"不好看"(54)、"好丑"(50)、"审美"(63)等美学否定相互强化,形成了对产品价值从市场逻辑到文化价值的全面解构。尤其值得注意的是"不理解"(76)、"搞不懂"(35)、"为啥"(50)等困惑性表达的频繁出现,反映出主流消费群体与潮玩亚文化圈层之间的认知鸿沟,这种鸿沟在"黄牛"(35)、"溢价"(29)、"奢侈品"(31)等二级市场乱象的助推下进一步激化为对立情绪。义乌(30)作为中国小商品代名词的突兀出现,更暴露出部分用户对潮玩"工业化艺术"本质的抵触,将之视为"塑料"(39)流水线产品的溢价骗局。这种批判浪潮的集中爆发,很可能与近期泡泡玛特股价波动、盲盒监管政策收紧等行业动态相关,呈现出社会对"潮玩经济"可持续性的深层焦虑。
接着继续分析Very Positive文本
Statistical_word_frequency(df=new_df[new_df['label']=='Very Positive']['评论内容'],filename='Very Positive词频统计')
可爱 110
喜欢 70
中国 57
好看 54
泡泡玛特 45
拉布布 37
河南 23
娃娃 19
超级 15
价值 15
厉害 15
经济 13
国外 12
世界 12
品牌 11
情绪 11
每次 11
年轻人 11
外国人 10
终于 10
盲盒 10
公司 10
玩偶 9
精神 9
形象 8
玩具 8
潮流 8
文化 7
设计 6
全球 6
从积极评价的词频统计来看,Labubu的忠实粉丝群体呈现出鲜明的文化自豪感与情感投射特征。"可爱"(110次)作为压倒性高频词,配合"喜欢"(70)、"好看"(54)等直观审美评价,构成了最基础的情感认同层,这种纯粹的美学愉悦与负面评价中的"丑"形成尖锐对立,印证了该IP在设计语言上的争议性。值得注意的是,"中国"(57)与"国外"(12)、"外国人"(10)、"世界"(12)等词汇的联动出现,暴露出粉丝将Labubu的成功视为民族文化输出的骄傲符号,这种情绪在"河南"(23)这一具体地域词的出现中得到强化——可能暗指泡泡玛特创始人王宁的河南籍贯引发的乡土认同。"价值"(15)、"经济"(13)、"首富"(11)、"品牌"(11)等经济语汇的渗入,显示部分粉丝有意将产品情感价值转化为市场成功叙事,以此对冲负面评价中的"泡沫"指控。而"精神"(9)、"情绪"(11)等抽象概念的浮现,则暗示核心粉丝已超越物质消费层面,将Labubu升华为某种亚文化精神图腾。这种积极评价体系与负面声浪形成镜像对照:二者同样关注"价值"但得出相反结论,同样提及"年轻人"却指向不同世代态度,同样讨论"经济"却演绎出繁荣与泡沫的平行叙事,这种割裂恰恰反映了当代流行文化产品在破圈过程中必然遭遇的认知撕裂。
5.总结
本次分析围绕Labubu(拉布布)潮玩的用户评论数据展开,结合地域分布、情感分析、高频词统计等多个维度,揭示了这一IP在社交媒体上的热议焦点及其背后的文化现象。以下是核心发现与总结:
1. 受众分布:区域集中,海外辐射
国内热度:广东省(984条)领跑,江浙沪(江苏566、浙江546、上海381)紧随其后,经济发达地区的年轻用户是核心讨论群体。
海外传播:美国(43)、日本(42)等国家的评论量较高,东南亚(马来西亚20、新加坡12)也表现活跃,但整体仍以华人文化圈为主,国际化尚处早期阶段。
2. 情感两极分化:争议与信仰并存
极端负面(Very Negative, 3499条)占据主导,高频词如“泡沫”(64)、“智商税”(49)、“炒作”(66)显示部分用户对潮玩市场的批判,甚至类比“郁金香泡沫”,质疑其可持续性。
极端正面(Very Positive, 798条)虽较少,但用词如“可爱”(110)、“中国骄傲”(57)、“品牌价值”(15)体现忠实粉丝的情感认同,视Labubu为文化符号。
中性评论(Neutral, 1314条)占比不低,可能反映部分用户持观望态度,或仅进行客观讨论。
3. 争议核心:潮玩经济的价值之争
-
批判视角:
-
认为Labubu是“资本游戏”(49),依赖盲盒(149)营销制造“虚假稀缺”,导致“溢价”(29)和“黄牛”(35)乱象。
-
审美争议显著,“不好看”(54)、“好丑”(50)等词频较高,部分用户难以接受其设计风格。
-
-
支持视角:
-
粉丝强调其“可爱”(110)、“文化输出”(12)价值,甚至将其与“中国品牌”(11)崛起挂钩。
-
部分用户从“经济”(13)角度肯定其商业成功,如提及“首富”(11)等词汇。
-
4. 深层洞察:Z世代的消费文化冲突
Labubu的舆论场折射出当代年轻人的消费矛盾:
情感消费 vs 理性批判:有人愿为“情绪价值”(11)买单,有人用“韭菜”(56)嘲讽盲目跟风。
亚文化圈层化:核心粉丝(如用“精神”9次描述)与圈外大众(“不理解”76次)存在认知鸿沟。
地域与经济因素:国内高热度省份(如广东、江浙沪)与海外华人圈的讨论差异,反映潮玩在不同市场的接受度。
总的来说,Labubu的爆火不仅是潮玩行业的个案,更是当代消费文化的缩影——在情感经济与批判思维的碰撞中,IP的价值既被狂热追捧,也被尖锐质疑。其成功依赖于精准的圈层营销,但也因过度商业化引发信任危机。未来,如何平衡艺术价值与商业逻辑,或许是潮玩品牌长期发展的关键。
源代码
import matplotlib.pylab as plt
import numpy as np
import seaborn as sns
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False #解决符号无法显示
import warnings
warnings.filterwarnings('ignore')
dy_comment = pd.read_csv('dy_comment.csv')
bz_comment = pd.read_csv('bz_comment.csv')
xhs_comment = pd.read_csv('xhs_comment.csv')
# 合并三个数据集,取共有字段
new_df = pd.concat([dy_comment[['用户昵称','IP属地','评论时间','评论内容']],
bz_comment[['用户昵称','IP属地','评论时间','评论内容']],
xhs_comment[['用户昵称','IP属地','评论时间','评论内容']]])
new_df.head()
dy_comment
bz_comment
xhs_comment
# 删除缺失数据
dy_comment.dropna(inplace=True)
bz_comment.dropna(inplace=True)
xhs_comment.dropna(inplace=True)
# 删除重复数据
dy_comment.drop_duplicates(inplace=True)
bz_comment.drop_duplicates(inplace=True)
xhs_comment.drop_duplicates(inplace=True)
sns.countplot(data=bz_comment,x='用户性别')
print(bz_comment['用户性别'].value_counts())
plt.show()
man,woman=789,235 #准备男、女的人数及比例
man_perc = man /(man+woman) #计算男生女生所占的比
woman_perc = woman /(man+woman)
#调用pie绘制饼图 传入一个列表,列表中是比例数据
paches,texts,autotexts = plt.pie([man_perc,woman_perc],
autopct='%0.1f%%',labels=['男','女'],explode =(0,0.1))
#设置字体大小和颜色
for text in autotexts:
text.set_color('white')
text.set_fontsize(24)
for t in texts:
t.set_color('red')
t.set_fontsize(18)
plt.figure(figsize=(10, 8))
# 第一个子图(左上)
plt.subplot(2, 2, 1)
sns.histplot(x=[len(x) for x in dy_comment['评论内容']],kde=True)
plt.title('抖音用户评论长度分布')
# 第二个子图(右上)
plt.subplot(2, 2, 2)
sns.histplot(x=[len(x) for x in bz_comment['评论内容']],kde=True)
plt.title('B站用户评论长度分布')
# 第三个子图(左下)
plt.subplot(2, 2, 3)
sns.histplot(x=[len(x) for x in xhs_comment['评论内容']],kde=True)
plt.title('小红书用户评论长度分布')
# 第四个子图(右下)
plt.subplot(2, 2, 4)
dy_comment_len = np.mean([len(x) for x in dy_comment['评论内容']])
bz_comment_len = np.mean([len(x) for x in bz_comment['评论内容']])
xhs_comment_len = np.mean([len(x) for x in xhs_comment['评论内容']])
plt.bar(x=['抖音','B站','小红书'],
height=[dy_comment_len,bz_comment_len,xhs_comment_len],
color=['#FF9999', '#99CCFF', '#FFCC99']
)
plt.title('各平台用户评论长度均值')
plt.tight_layout()
plt.show()
[dy_comment_len,bz_comment_len,xhs_comment_len]
# 处理IP变量获取地图数据
china_divisions = [
"河北", "山西", "辽宁", "吉林", "黑龙江",
"江苏", "浙江", "安徽", "福建", "江西",
"山东", "河南", "湖北", "湖南", "广东",
"海南", "四川", "贵州", "云南", "陕西",
"甘肃", "青海",
"北京", "天津", "上海", "重庆",
"内蒙古", "广西", "西藏", "宁夏", "新疆",
'中国台湾'
]
result = []
for x,y in zip(new_df['IP属地'].value_counts().index.to_list(),new_df['IP属地'].value_counts().values.tolist()):
if x == '新疆':
result.append(['新疆维吾尔自治区',y])
elif x == '西藏':
result.append(['西藏自治区',y])
elif x == '内蒙古':
result.append(['内蒙古自治区',y])
elif x == '宁夏':
result.append(['宁夏回族自治区',y])
elif x in ['重庆','北京','天津','上海']:
result.append([x + '市',y])
elif x == '广西':
result.append(['广西壮族自治区',y])
elif x == '中国香港':
result.append(['香港特别行政区',y])
elif x == '中国澳门':
result.append(['澳门特别行政区',y])
elif x == '中国台湾':
result.append(['台湾省',y])
elif x == '未知':
pass
elif x not in china_divisions:
pass
else:
result.append([x+'省',y])
result
from pyecharts.charts import *
from pyecharts import options as opts
map = Map()
map.add('各省份评论数量',result,
maptype='china',
is_map_symbol_show=False,
label_opts=opts.LabelOpts(is_show=False))
map.set_global_opts(
visualmap_opts=opts.VisualMapOpts(max_=800,min_=1)
)
map.render_notebook()
# 分析国外IP
result = []
for x,y in zip(new_df['IP属地'].value_counts().index.to_list(),new_df['IP属地'].value_counts().values.tolist()):
if x in china_divisions:
pass
elif x == '中国香港':
pass
elif x == '中国澳门':
pass
elif x == '中国台湾':
pass
elif x == '未知':
pass
elif x == 'IP未知':
pass
else:
result.append([x,y])
result
new_df['评论内容']
import re
def text_clean(text):
# 去除@昵称,匹配以@开头,后面跟随任意非空白字符(包括表情、汉字、英文字母等)
comment = re.sub(r'@[\S]+', '', text)
# 去除形如 [笑哭R] 的平台表情
comment = re.sub(r'\[[^\[\]]{1,10}\]', '', comment).strip()
return comment
# 示例数据
comments = [
"@only-y1 感觉火的莫名其妙",
"@张三 @李四 一起冲!",
"@爱吃大米饭",
"有无感的人吗[裂开]",
"过两年就是时代的眼泪了[笑哭R]"
]
# 清洗后的评论
cleaned_comments = [text_clean(c) for c in comments]
print(cleaned_comments)
new_df['评论内容'] = new_df['评论内容'].astype(str).apply(text_clean)
new_df['评论内容']
new_df['评论内容'] = new_df['评论内容'].apply(lambda x:x if len(x)>2 else np.nan)
new_df.isnull().sum()
new_df.dropna(inplace=True)
new_df.isnull().sum()
new_df[new_df['评论内容'].str.len() > 500]
from transformers import pipeline
import warnings
warnings.filterwarnings('ignore')
# 指定模型所在路径
model_path = r"D:\code\HugglingFace\multilingual-sentiment-analysis\model"
# 加载模型
pipe = pipeline("text-classification", model=model_path)
# 使用该 pipeline 进行情感分析
result = pipe(new_df['评论内容'].to_list())
new_df['label'] = [item['label'] for item in result]
new_df['score'] = [item['score'] for item in result]
new_df
new_df['label'].value_counts()
pie_data = new_df['label'].value_counts()
y = pie_data.values
plt.pie(y,
labels=pie_data.index, # 设置饼图标签
autopct='%.2f%%', # 格式化输出百分比
)
plt.show()
import collections
import re
import jieba
# 统计词频
def Statistical_word_frequency(df,filename):
jieba.load_userdict('dit.txt') # 这里你可以添加jieba库识别不了的网络新词,避免将一些新词拆开
jieba.initialize() # 初始化jieba
data = ''.join([re.sub(r'[^0-9A-Za-z][^0-9A-Za-z][^0-9A-Za-z][^0-9A-Za-z]:','',item) for item in df])
# 文本预处理 :去除一些无用的字符只提取出中文出来
new_data = re.findall('[\u4e00-\u9fa5]+', data, re.S)
new_data = "".join(new_data)
# 文本分词
seg_list_exact = jieba.cut(new_data)
result_list = []
with open('stopwords.txt', encoding='utf-8') as f: #可根据需要打开停用词库,然后加上不想显示的词语
con = f.readlines()
stop_words = set()
for i in con:
i = i.replace("\n", "") # 去掉读取每一行数据的\n
stop_words.add(i)
for word in seg_list_exact:
if word not in stop_words and len(word) > 1:
result_list.append(word)
word_counts = collections.Counter(result_list)
# 词频统计:获取前50最高频的词
word_counts_top = word_counts.most_common(50)
with open(f'{filename}.txt','w',encoding='utf-8')as f:
for i in word_counts_top:
f.write(str(i[0]))
f.write('\t')
f.write(str(i[1]))
f.write('\n')
Statistical_word_frequency(df=new_df[new_df['label']=='Very Negative']['评论内容'],filename='Very Negative词频统计')
with open('Very Negative词频统计.txt')as f:
wc_list = []
for value in f.readlines():
temp = []
text,num = value.split('\t')
temp.append(text)
temp.append(int(num))
wc_list.append(temp)
from pyecharts.charts import *
wc = WordCloud()
data = wc_list
wc.add('',data)
wc.set_global_opts(title_opts=opts.TitleOpts('词云图'))
wc.render_notebook()
Statistical_word_frequency(df=new_df[new_df['label']=='Very Positive']['评论内容'],filename='Very Positive词频统计')
with open('Very Positive词频统计.txt')as f:
wc_list = []
for value in f.readlines():
temp = []
text,num = value.split('\t')
temp.append(text)
temp.append(int(num))
wc_list.append(temp)
from pyecharts.charts import *
wc = WordCloud()
data = wc_list
wc.add('',data)
wc.set_global_opts(title_opts=opts.TitleOpts('词云图'))
wc.render_notebook()
with open('clean_comment_data.txt','w',encoding='utf-8')as f:
for text in new_df['评论内容']:
f.write(text)
f.write('\n')
资料获取,更多粉丝福利,关注下方公众号获取
更多推荐
所有评论(0)