“Datawhale AI夏令营”基于带货视频评论的用户洞察挑战赛
前言:本次是Datawhale AI夏令营2025年第一期的内容,赛事是:基于带货视频评论的用户洞察挑战赛(科大讯飞AI大赛)
一、赛事背景
在直播电商爆发式增长浪潮中,短视频平台积累的海量带货视频及用户评论数据蕴含巨大商业价值。这些数据不仅是消费者体验的直接反馈,更是驱动品牌决策的关键资产。
用户洞察的核心在于视频内容与评论数据的联合挖掘:
通过智能识别推广商品
分析评论中的情感表达与观点聚合
精准捕捉消费者真实态度与需求痛点
本挑战赛聚焦"商品识别-情感分析-聚类洞察"全链条,将碎片化评论转化为结构化商业智能,实现三大价值:
揭示用户对商品功能/价格/服务的多维评价
构建消费者偏好画像优化选品策略
科学评估网红带货效能与转化潜力
在电商竞争白热化的当下,此分析能力已成为企业构建差异化竞争优势的核心武器。
二、赛事任务
参赛者需基于提供的带货视频文本及评论文本数据,完成以下三阶段分析任务:
1)【商品识别】精准识别推广商品;
2)【情感分析】对评论文本进行多维度情感分析,涵盖维度见数据说明;
3)【评论聚类】按商品对归属指定维度的评论进行聚类,并提炼类簇总结词。
三、数据说明
本次挑战赛为参赛选手提供包含85条脱敏后的带货视频数据及6477条评论文本数据,数据包括少量有人工标注结果的训练集(仅包含商品识别和情感分析的标注结果)以及未标注的测试集。我们从赛事官网下载数据,可以看到是两个csv文件,其格式说明如下:
1)带货视频内容文本信息的数据格式
序号 | 变量名称 | 变量格式 | 解释 |
---|---|---|---|
1 | video_id | string | 视频id |
2 | video_desc | string | 视频描述 |
3 | video_tags | string | 视频标签 |
4 | product_name | string | 推广商品名称 |
注:product_name需根据提供的视频信息进行提取,并从匹配到商品列表[Xfaiyx Smart Translator, Xfaiyx Smart Recorder]中的一项。
2)评论区文本信息的数据格式
序号 | 变量名称 | 变量格式 | 解释 |
---|---|---|---|
1 | video_id | string | 视频id |
2 | comment_id | string | 评论id |
3 | comment_text | string | 评论文本 |
4 | sentiment_category | int | 关于商品的情感倾向分类 |
5 | user_scenario | int | 是否与用户场景有关,0表示否,1表示是 |
6 | user_question | int | 是否与用户疑问有关,0表示否,1表示是 |
7 | user_suggestion | int | 是否与用户建议有关,0表示否,1表示是 |
8 | positive_cluster_theme | string | 按正面倾向聚类的类簇主题词 |
9 | negative_cluster_theme | string | 按负面倾向聚类的类簇主题词 |
10 | scenario_cluster_theme | string | 按用户场景聚类的类簇主题词 |
11 | question_cluster_theme | string | 按用户疑问聚类的类簇主题词 |
12 | suggestion_cluster_theme | string | 按用户建议聚类的类簇主题词 |
注:
a.需进行情感分析的字段包括sentiment_category、user_scenario、user_question和user_suggestion。训练集中部分数据已提供标注,测试集需自行预测。其中字段sentiment_category情感倾向分类的数值含义见下表:
分类值 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
含义 | 正面 | 负面 | 正负都包含 | 中性 | 不相关 |
b.需进行聚类的字段包括:
- positive_cluster_theme:基于训练集和测试集中正面倾向(sentiment_category=1 或 sentiment_category=3)的评论进行聚类并提炼主题词,聚类数范围为 5~8。
- negative_cluster_theme:基于训练集和测试集中负面倾向(sentiment_category=2 或 sentiment_category=3)的评论进行聚类并提炼主题词,聚类数范围为 5~8。
- scenario_cluster_theme:基于训练集和测试集中用户场景相关评论(user_scenario=1)进行聚类并提炼主题词,聚类数范围为 5~8。
- question_cluster_theme:基于训练集和测试集中用户疑问相关评论(user_question=1)进行聚类并提炼主题词,聚类数范围为 5~8。
- suggestion_cluster_theme:基于训练集和测试集中用户建议相关评论(user_suggestion=1)进行聚类并提炼主题词,聚类数范围为 5~8。
注意,聚类样本包含训练集和测试集的全部满足上述条件的评论样本。
评估指标:
评估指标由三部分组成,分别是1)商品识别100分,结果采用精确匹配评估;2)情感分析100分,结果采用加权平均F1分数;3)评论聚类100分,结果采用轮廓系数。最终得分由三部分相加,总分300分。
由以上评估指标我们可以看到,要想提高分数,获得好的排名,就要从这三个方向努力。
四、Baseline分析
Datawhale给我们提供了Baseline,因为我之前对NLP这个方向也不熟,没参加过类似的竞赛,所以我们从Baseline开始学起。再次感谢Datawhale的辛苦付出。
1.数据解读
首先我们需要解读数据,了解我们的数据,这样我们后面才能从数据着手,提升模型性能。数据处理的好坏,往往决定了最终模型的上限!
import pandas as pd
video_data = pd.read_csv("origin_videos_data.csv")
comments_data = pd.read_csv("origin_comments_data.csv")
我们使用pandas读取数据,然后我们查看一下video_data和comments_data。
video_data(视频数据):这里我们随机采样看一下。
video_data.sample(10)
# video_data[:20]
# 20条数据,训练集
我们可以看到video_desc(视频描述)包括多国语言,还有表情符号;video_tags(视频标签)同样包括多种语言,其中还存在缺失值;product_name(推广商品名称)这里主要是二分类:“Xfaiyx Smart Translator”以及“Xfaiyx Smart Recorder”以及测试集缺失值。
经过进一步分析,我们发现,本次共提供了20条训练数据,65条测试数据,共85条数据。
comments_data(评论数据):我们同样查看一下数据
经过分析,这里训练集共1741条,其中评论内容也是多语言。
2.商品识别文本分类
首先合并视频描述文本和视频标签文本
video_data["text"] = video_data["video_desc"].fillna("") + " " + video_data["video_tags"].fillna("")# 合并视频描述和标签字段
接下来我们导入需要用到的库,这里主要使用jieba库进行分词向量化处理,使用sklearn库进行机器学习模型的构建。
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import SGDClassifier
from sklearn.svm import LinearSVC
from sklearn.cluster import KMeans
from sklearn.pipeline import make_pipeline
文本分类代码:
product_name_predictor = make_pipeline(TfidfVectorizer(tokenizer=jieba.lcut, max_features=50), SGDClassifier()
)
product_name_predictor.fit(video_data[~video_data["product_name"].isnull()]["text"],video_data[~video_data["product_name"].isnull()]["product_name"],
)
video_data["product_name"] = product_name_predictor.predict(video_data["text"])
代码解析:
首先我们创建了一个两步机器学习管道,包括1)文本向量化:TfidfVectorizer
将原始文本转换为数值特征;2)分类模型:SGDClassifier()
随机梯度下降分类器
然后模型训练:仅使用有标签的数据(商品名称非空的行)进行训练,输入为视频的文本数据(text
列),目标标签:商品名称(product_name
列)
最后预测:我们使用刚刚训练好的模型对数据集中的所有视频文本进行商品名称预测,并将预测结果直接赋值给product_name
列。
3.情感分析文本分类
代码如下:
for col in ['sentiment_category','user_scenario', 'user_question', 'user_suggestion']:predictor = make_pipeline(TfidfVectorizer(tokenizer=jieba.lcut), SGDClassifier())predictor.fit(comments_data[~comments_data[col].isnull()]["comment_text"],comments_data[~comments_data[col].isnull()][col],)comments_data[col] = predictor.predict(comments_data["comment_text"])
代码解析:
1.循环处理多个分类任务:
同时处理四个不同的文本分类任务
每个任务有独立的标签列和分类器
共享相同的特征(评论文本)和预处理方式
2.这里同样也是三步走,建立机器学习管道、模型训练、预测。使用TfidfVectorizer
:将文本转换为TF-IDF特征向量,使用SGDClassifier
:随机梯度下降分类器。
4.评论聚类
代码如下:
我们需要对positive_cluster_theme,negative_cluster_theme,scenario_cluster_theme,question_cluster_theme,suggestion_cluster_theme五个字段进行分别聚类,因为代码都差不多,只是字段不同,故代码只展示了positive_cluster_theme这一部分。
top_n_words = 10
kmeans_predictor = make_pipeline(TfidfVectorizer(tokenizer=jieba.lcut), KMeans(n_clusters=2)
)kmeans_predictor.fit(comments_data[comments_data["sentiment_category"].isin([1, 3])]["comment_text"])
kmeans_cluster_label = kmeans_predictor.predict(comments_data[comments_data["sentiment_category"].isin([1, 3])]["comment_text"])kmeans_top_word = []
tfidf_vectorizer = kmeans_predictor.named_steps['tfidfvectorizer']
kmeans_model = kmeans_predictor.named_steps['kmeans']
feature_names = tfidf_vectorizer.get_feature_names_out()
cluster_centers = kmeans_model.cluster_centers_
for i in range(kmeans_model.n_clusters):top_feature_indices = cluster_centers[i].argsort()[::-1]top_word = ' '.join([feature_names[idx] for idx in top_feature_indices[:top_n_words]])kmeans_top_word.append(top_word)comments_data.loc[comments_data["sentiment_category"].isin([1, 3]), "positive_cluster_theme"] = [kmeans_top_word[x] for x in kmeans_cluster_label]
代码解析:
1.聚类目标:分析情感类别为1和3(积极)的评论,发现这些评论中的主题模式。
2.聚类流程:文本向量化、聚类算法、主题提取
3.主题词提取:聚类中心点表示主题的"中心位置";特征权重表示词汇对主题的重要性;权重最高的词汇代表主题的核心内容。
最后是处理结果提交:
video_data[["video_id", "product_name"]].to_csv("submit/submit_videos.csv", index=None)
comments_data[['video_id', 'comment_id', 'sentiment_category','user_scenario', 'user_question', 'user_suggestion','positive_cluster_theme', 'negative_cluster_theme','scenario_cluster_theme', 'question_cluster_theme','suggestion_cluster_theme']].to_csv("submit/submit_comments.csv", index=None)
ok,我们把新生成结果的submit文件夹打包提交到赛事官网就完成啦。撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
贴一下自己的分数吧,努力上分。。。
码字不易,觉得有用的点个赞吧。