Datawhale AI夏令营| ML学习笔记:电商评论洞察挑战赛
Datawhale学习教程https://www.datawhale.cn/activity/324/learn/191/4315/7/11
讯飞AI开发者大赛:带货视频评论分析赛技术复盘与优化实践
赛事主页:iFLYTEK AI开发者大赛
初始得分:176.09(商品89.23 + 情感86.86 + 评论0.00)
*优化后得分
一、赛事任务与技术挑战
任务全景
graph LR
A[视频文本] --> B[商品识别]
C[评论文本] --> D[情感分析]
B --> E[分商品聚类]
D --> E
- 商品识别:从视频标题/描述中提取推广商品
- 情感分析:多维度分类(正/负情感、场景描述、疑问、建议)
- 评论聚类:按商品+情感维度聚类并提炼主题词
初始瓶颈
- 商品识别:89.23分(存在模糊匹配问题)
- 情感分析:86.86分(混合情感样本处理不足)
- 评论聚类:0分(模块未实现)
二、优化方案与实现细节
1. 商品识别:精准匹配升级(89.23 → 93+)
原始方案:视频标题关键词匹配
优化策略:
- 多特征融合:联合
video_desc和video_tags字段 - 正则强化:模式匹配商品变体
# 匹配示例:Xfaiyx Smart Recorder/Translator pattern = r'Xfaiyx\s+Smart\s+(Recorder|Translator)' - 规则校验:对模糊结果二次过滤
if partial_match in ['Xfaiyx']: # 模糊匹配 return filter_by_product_list(partial_match) # 商品库校验
2. 情感分析:细粒度分类优化(86.86 → 90+)
原始方案:逻辑回归+TF-IDF
优化策略:
- 样本增强:拆分混合情感文本
# 原始样本:"画质好但续航差" → 拆分为:["画质好-正面", "续航差-负面"] - 特征工程:情感词典特征融合
def extract_lexicon_features(text): pos_words = {'推荐','好用','满意'} neg_words = {'失望','卡顿','不值'} pos_count = sum(word in text for word in pos_words) neg_count = sum(word in text for word in neg_words) return [pos_count, neg_count] # 作为附加特征
3. 评论聚类:从0到1突破(0 → 53+)
技术难点
- 环境限制:无预训练模型/第三方库(scikit-learn等)
- 数据噪声:含无效字符和无关内容
四步解决方案
Step 1 数据清洗
import re
# 去除非文字字符
text = re.sub(r'[^\w\s]', ' ', text)
# 过滤无意义词
stopwords = {'的','是','了'}
text = ' '.join([word for word in text.split() if word not in stopwords])
Step 2 特征构建
# 构建Top1000词表
vocab = sorted(word_counts, key=word_counts.get, reverse=True)[:1000]
def text_to_vector(text, vocab):
words = text.split()
vector = [words.count(word) for word in vocab]
total = sum(vector)
return [v/total for v in vector] if total > 0 else vector
Step 3 聚类实现(纯Python KMeans)
class SimpleKMeans:
def __init__(self, n_clusters=5):
self.n_clusters = n_clusters
def fit_predict(self, X):
# 随机初始化质心
centroids = X[np.random.choice(len(X), self.n_clusters, replace=False)]
for _ in range(10):
# 分配样本到最近质心
labels = [np.argmin([np.linalg.norm(np.array(x)-np.array(c))
for c in centroids]) for x in X]
# 更新质心
new_centroids = []
for i in range(self.n_clusters):
cluster_points = [x for idx, x in enumerate(X) if labels[idx] == i]
new_centroids.append(np.mean(cluster_points, axis=0))
centroids = new_centroids
return labels
Step 4 主题词提取
def extract_keywords(cluster_texts, topk=5):
word_counts = Counter()
for text in cluster_texts:
for word in text.split():
word_counts[word] += 1
return [word for word, _ in word_counts.most_common(topk)]
三、关键问题与解决方案
| 问题类型 | 具体表现 | 解决方案 |
|---|---|---|
| 环境依赖 | 缺少scikit-learn/jieba | 纯Python实现KMeans/空格分词 |
| 数据缺失 | 原始数据文件丢失 | 从样本重建CSV文件 |
| 主题词噪声 | 包含停用词("的"、"了") | 清洗阶段过滤高频停用词 |
| 聚类效果不稳定 | 轮廓系数波动大 | 固定随机种子+多次取最优 |
四、效果验证与后续方向
性能提升对比
| 模块 | 优化前 | 优化后 | 关键改进点 |
|---|---|---|---|
| 商品识别 | 89.23 | 93+ | 多字段正则+商品库校验 |
| 情感分析 | 86.86 | 90+ | 样本拆分+词典特征 |
| 评论聚类 | 0 | 53+ | 轻量KMeans+词频统计 |
后续优化方向
- 向量模型升级
- 采用
bge-m3等SOTA向量模型(需解决环境依赖)
- 采用
- 动态聚类优化
# 轮廓系数选K(5-8范围) from sklearn.metrics import silhouette_score best_k = max(range(5,9), key=lambda k: silhouette_score(X, KMeans(k).fit_predict(X))) - 多模态融合
- 结合视频标签与评论情感联合优化主题词生成
技术总结:在环境受限条件下,通过规则增强和算法简化实现关键突破
赛事排名:当前Top 7%(持续优化中)
代码开源:GitHub项目链接
五、参赛心得
- 轻量优先原则:当环境受限时,优先选择可解释性强的简单方案
- 数据质量决定上限:清洗和预处理对聚类效果影响超过算法选择
- 迭代验证闭环:每步优化后立即验证模块得分,避免链路误差累积
欢迎技术交流

浙公网安备 33010602011771号