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_descvideo_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+词频统计

后续优化方向

  1. 向量模型升级
    • 采用bge-m3等SOTA向量模型(需解决环境依赖)
  2. 动态聚类优化
    # 轮廓系数选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)))
    
  3. 多模态融合
    • 结合视频标签与评论情感联合优化主题词生成

技术总结:在环境受限条件下,通过规则增强和算法简化实现关键突破
赛事排名:当前Top 7%(持续优化中)
代码开源GitHub项目链接


五、参赛心得

  1. 轻量优先原则:当环境受限时,优先选择可解释性强的简单方案
  2. 数据质量决定上限:清洗和预处理对聚类效果影响超过算法选择
  3. 迭代验证闭环:每步优化后立即验证模块得分,避免链路误差累积

欢迎技术交流

posted @ 2025-07-16 22:58  叶谨之  阅读(19)  评论(0)    收藏  举报