引言

以讯飞「基于带货视频评论的用户洞察挑战赛」的赛事项目为背景,将电商直播带货视频的碎片化用户评论转化为可量化的商业洞察信息。其实本质上在于利用自然语言处理、机器学习或者大模型技术,从海量的文本数据中提取有价值的商业洞察

主要涉及以下几个关键领域的任务:

  • 任务一(文本编码):基于视频内容识别对应的商品
  • 任务二(文本分类):从非结构化评论中提取情感倾向
  • 任务三(文本聚类):通过聚类总结用户的关键观点

1. 相关知识了解

文本编码

概念: 文本(文章句子、评论等)——> 机器可识别的向量(数字向量)

大模型文本编码关键步骤:

1. 分词: 将一句话拆解成更小的语言单元(通常是单词、子词、字符)

  • 例子:
    输入文本:"I love AI."
    分词结果可能是:["I", "love", "AI", "."]["I", "lov", "e", "AI", "."](具体取决于分词器类型)

2. 词元映射为索引每个词元都会被映射到一个词汇表中的索引号

  • ["I", "love", "AI", "."][101, 456, 987, 102]

3.位置编码(Position Encoding):

​ 因为 Transformer 结构本身没有序列顺序的概念,所以要显式加上位置信息

4. 生成词嵌入: 每个 token 索引会被映射为一个高维稠密向量

  • 举例:[101, 456, 987, 102][[0.1, 0.2, ..., 0.9], [...], ..., [...]]
  • 最终形成一个二维张量 [sequence_length, embedding_dim],比如 [4, 768]

常用方法包括独热编码、词嵌入 (如Word2Vec、GloVe等静态词向量)以及基于预训练模型的上下文词嵌入(如BERT、GPT等动态词向量)。

编码方式上下文相关稠密向量是否需要位置编码模型是否训练词向量适合场景
独热编码❌ 稀疏❌ 否❌ 否教学演示、早期模型
Word2Vec/GloVe✅ 静态❌ 否✅ 是(预训练)传统NLP任务
BERT/GPT等✅ 是✅ 动态✅ 是✅ 是(上下文训练)现代NLP任务、SOTA模型

文本分类:根据文本内容将其自动归类到预定义类别。

  • 本项目中的情感分析属于多维度文本分类任务,需要识别评论的情感倾向(正面/负面/中性等)以及是否涉及用户场景、疑问或建议等属性。
  • 常用方法包括基于规则和词典的方法、传统机器学习方法(如朴素贝叶斯、支持向量机SVM等)以及深度学习方法(如循环神经网络RNN、卷积神经网络CNN、Transformer等) 。

文本聚类:根据文本内容的相似性自动将文本分组,无需预先定义类别。

  • 本项目要求按商品对指定维度的评论进行聚类,并提炼每类的主题词。
  • 常用聚类算法包括K-Means(需预设簇数K)、层次聚类、DBSCAN等

2.赛题及数据

具体信息可查看官网

赛题难点

  • 数据量少,挑战模型泛化能力
    • 比赛提供的数据量相对较少,包含 85 条脱敏后的带货视频数据和 6477 条评论文本数据。其中,带有 人工标注结果的训练集更是有限
  • 多任务协同,要求全链路解决方案
    • 本次比赛并非单一任务,而是要求参赛者完成“ 商品识别-情感分析-评论聚类 ”的完整链条,每个阶段环环相扣。

解题思路

商品识别是基础,如果这里出了错,后续的情感分析和聚类就没有意义。情感分析的结果又会影响聚类的样本选择。

  • 商品识别 (高优先级): 必须尽可能准确。【文本分类】
  • 情感分析 (高优先级): 这是数据最丰富的部分,也是后面聚类的关键输入。【多标签文本分类】
  • 评论聚类 (次高优先级): 基于前两步的结果,需要考虑聚类的效果评估(轮廓系数)和主题词提炼的质量。无监督学习中的文本聚类+ 主题词提取

3.baseline解读

1.设计思路: 分阶段处理 各个任务,并利用 TF-IDF / BGE向量化线性分类器/KMeans 聚类 来完成商品识别、情感分析和评论聚类。

  • 计算资源需求低: 相较于大型深度学习模型,TF-IDF 和 LinearSVC/KMeans 对计算资源的要求非常低。这意味着它可以在普通的个人电脑上快速运行,无需高性能GPU,也符合比赛中可能存在的资源限制(尤其是在不使用额外付费资源的情况下)。

  • TF-IDF 的局限性: TF-IDF 仅关注词语的频率和文档分布,无法捕捉词语的 上下文信息语义相似性多义词 。例如,“苹果”在“买苹果手机”和“吃苹果”中含义不同,TF-IDF 无法区分。

    改进:可以尝试BERT

  • K-Means 的局限性: K-Means 是一种基于距离的聚类算法,它假设簇是凸形的且大小相近。它对初始质心敏感,且无法很好地处理不规则形状的簇。

2.代码整体流程

这个 baseline 代码严格按照比赛的三个任务顺序执行:

  1. 任务一: 训练一个模型来预测 product_name
  2. 任务二: 训练四个模型来分别预测四个情感相关的标签。
  3. 任务三: 对不同类别的评论进行聚类,并提取主题词。

分步详解

  1. 数据准备
video_data["text"] = video_data["video_desc"].fillna("") + " " + video_data["video_tags"].fillna("")

因为描述和标签都包含商品有关信息,合在一起,能给模型提供更全面信息

  1. 任务一:商品识别
product_name_predictor = make_pipeline( # 创建处理流水线 # 文本向量化+分类TfidfVectorizer(tokenizer=jieba.lcut, max_features=50), SGDClassifier()
)
product_name_predictor.fit(	# 训练模型,代码筛选出 product_name 这一列有标注的行,用这些数据来训练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"])	# 预测

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"])

这里用一个 for 循环,对 sentiment_category, user_scenario 等四个目标列,重复地做了和任务一几乎一样的事情:

  1. 创建一个 TF-IDF + SGDClassifier 的流水线。
  2. 用已有标注的评论数据进行训练。
  3. 对所有评论进行预测,填上对应的标签。

4.任务三:评论聚类

# 1. 定义并训练聚类模型
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"])# 2. 对评论进行聚类
kmeans_cluster_label = kmeans_predictor.predict(comments_data[comments_data["sentiment_category"].isin([1, 3])]["comment_text"])# 3. 提取每个类簇的主题词
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]	# 按TF-IDF权重排序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]

named_steps:从 pipeline 中取出各步骤的具体对象

feature_names:TF-IDF 中的所有词(按顺序)

cluster_centers_:每个聚类中心的向量,表示这个簇中哪些词的平均 TF-IDF 值最大

步骤:

  • 1、创建聚类流水线:这次的流水线是 TF-IDF + KMeansKMeans 是一种经典的聚类算法。

  • 2、筛选数据并训练:它先从所有评论中筛选出正面或包含正面的评论(sentiment_category 为 1 或 3),然后用这些评论来训练 KMeans 模型。

  • 3、预测簇标签:模型会给每一条正面评论分配一个它所属的类别标签(比如第0类或第1类)。

  • 4、提取主题词:找出TF-IDF权重最高的几个词,然后把这几个词拼成一个字符串,作为这个类别的“总结词”。

  • 5、结果:最后,把每个评论所属类别的“总结词”填到 positive_cluster_theme 这一列。

其它几个评论文本类似。

4.优化思考

对于任务一

  • 模型太简单TF-IDF + SGDClassifier 是非常基础的组合,它只能学到一些表面的词频信息,理解不了深层语义。

  • 参数max_features=50 这个参数限制了 TfidfVectorizer 只会关注最重要的50个词。尝试改为100呢?

对于任务二

  • 同样是TF-IDF局限性

对于任务三

  • 模型
  • 聚类数:写一个循环,尝试 n_clusters 从5到8的所有可能。对于每一个 n_clusters 值,都计算一下聚类的轮廓系数 (Silhouette Coefficient),选择让轮廓系数最高的那个 n_clusters 值作为你最终的聚类数量
# 动态确定最佳聚类数
from sklearn.metrics import silhouette_score
best_k = 0
best_score = -1for k in range(5,9):kmeans = KMeans(n_clusters=k)labels = kmeans.fit_predict(embeddings)score = silhouette_score(embeddings, labels)if score > best_score:best_k = k

优化思路1: 修改max_features参数循环聚类数

分数从
在这里插入图片描述

提高到
在这里插入图片描述

其它优化思路:(预训练模型大模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88716.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88716.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88716.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue中的render()函数

在 Vue 中&#xff0c;render() 是一个用于手动编写组件渲染逻辑的方法&#xff0c;它直接返回虚拟节点&#xff08;VNode&#xff09;&#xff0c;替代模板语法&#xff08;<template>&#xff09;来描述组件的 UI 结构。以下是关于 render() 方法的详细解析&#xff1a…

板凳-------Mysql cookbook学习 (十一--------9)

13.2 分组描述统计 mysql> select age, count(score) as n,-> sum(score) as sum,-> min(score) as minimum,-> max(score) as maximum,-> avg(score) as mean,-> stddev_samp(score) as std. dev.,-> var_samp(score) as variance-> from testscore-&…

编写产品需求文档:黄历日历小程序

整理产品需求文档&#xff1a;黄历日历小程序版本&#xff1a;1.0 更新时间&#xff1a;2025-7-9一、文档概述1.1 产品背景开发一款融合传统黄历文化的日历工具&#xff0c;提供每日吉凶查询、神煞展示和个人运势分析功能。1.2 目标用户关注传统历法的中老年群体婚嫁/搬家等需要…

Spring Boot + MyBatis 实现用户登录功能详解(基础)

一、项目概述做了几个项目发现有人问到怎么使用springbootHTMLjsCSS开发一个项目呢所以本文将介绍如何使用Spring Boot和MyBatis实现一个完整的用户登录功能。系统包含前端登录页面、后端控制器、服务层、数据访问层以及数据库交互。二、技术栈Spring Boot 2.xMyBatis 持久层框…

adb 简介与常用命令

1. adb 简介adb 的全称为 Android Debug Bridge&#xff0c;就是起到调试桥的作用。借助 adb 工具&#xff0c;我们可以管理设备或手机模拟器的状态。还可以进行很多手机操作&#xff0c;如安装软件、系统升级、运行 shell 命令等等。其实简而言说&#xff0c;adb 就是连接 And…

阿里云-跨账号同步OSS Bucket

说明 阿里云A账号的OSS BUCKET同步到B账号的指定OSS BUCKET。 账号Bucket NamesRAM角色A{源buctket}OSS-SYNCERB{目标buctket} 步骤 在阿里云A,B账号分别建上表buckets, 最好是相同地域的在A号-RAM控制台建立角色OSS-SYNCER&#xff0c;并赋权AliyunOSSFullAccess&#xff…

uniapp小程序无感刷新token

request.js // request.js import {getApptoken,getStoredApptoken } from ./tokenRequest // 从合并模块导入// 全局配置 const MAX_RETRIES 1 // 最大重试次数 const baseURL https://your-api.com// 请求队列和刷新状态 let requestsQueue [] let isRefreshing false// …

MySQL优化高手笔记

语雀完整版&#xff1a;https://www.yuque.com/g/mingrun/embiys/dv3btw/collaborator/join?tokenzMBwPzSMfSGINLuv&sourcedoc_collaborator# 《MySQL优化高手笔记》MySQL优化高手一、MySQL架构01 天天写CRUD,你知道你的系统是如何跟MySQL打交道的吗通过驱动连接数据库&am…

Git 详解:从概念,常用命令,版本回退到工作流

本文将从 Git 的核心概念讲起&#xff0c;详细介绍常用命令、各阶段版本回退、分支控制以及企业内常见的 Git 工作流。 Git 与 GitHub 简介 Git 简介 Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年开发。它与集中式版本控制系统&#xff08;…

CMSIS(Cortex Microcontroller Software Interface Standard)ARM公司为 Cortex-M 系列处理器

CMSIS&#xff08;Cortex Microcontroller Software Interface Standard&#xff09;是ARM公司为 Cortex-M 系列处理器&#xff08;如 M0/M3/M4/M7/M23/M33 等&#xff09;定义的一套硬件抽象层标准&#xff0c;旨在简化嵌入式开发&#xff0c;提高代码的可移植性和复用性。 核…

[特殊字符] 扫描式处理:Python 自动提取 PDF 中关键词相关表格并导出为 Excel

本文演示如何利用 pdfplumber 批量处理指定文件夹下 PDF 文档&#xff1a;定位关键词&#xff08;如“主要会计数据”&#xff09;出现的页码及下一页&#xff0c;提取其中的表格并保存为独立 Excel 文件。适用于财务报告、审计表格、统计报表等场景。 1️⃣ 第一步&#xff1a…

python3的返回值能返回多个吗?

在Python中&#xff0c;函数可以通过返回一个元组&#xff08;tuple&#xff09; 来间接实现返回多个值的效果。以下是具体说明&#xff1a; 实现方式&#xff1a;直接返回逗号分隔的值 Python会自动将这些值打包成一个元组&#xff1a; def multiple_return():a 1b "he…

UE5 Secondary Materials

首先放入材质A材质B放入Secondary Materials两个效果就能融合到一起了动态设置secondary material

AUTOSAR进阶图解==>AUTOSAR_SWS_FlashTest

AUTOSAR Flash Test模块详解与分析 基于AUTOSAR标准的Flash Test模块架构、功能与应用分析目录 1. Flash Test模块概述 1.1 模块作用与功能1.2 适用范围 2. Flash Test模块架构 2.1 模块位置2.2 组件关系 3. 状态管理 3.1 状态定义3.2 状态转换 4. 后台测试执行流程 4.1 测试间…

msf复现永恒之蓝

永恒之蓝&#xff08;EternalBlue&#xff09;是利用 Windows 系统的 SMB 协议漏洞&#xff08;MS17-010&#xff09;来获取系统最高权限的漏洞&#xff0c;利用 Metasploit 框架&#xff08;MSF&#xff09;复现该漏洞是一个复杂且具有一定风险的操作&#xff0c;必须在合法合…

格密码--LWE,DLWE和ss-LWE

格密码–LWE&#xff0c;DLWE和ss-LWE 0.数学符号数学符号含义备注Zq\mathbb{Z}_qZq​模qqq的整数集合&#xff0c;即{0,1,2,...,q−1}\{0,1,2,...,q-1\}{0,1,2,...,q−1}用于定义LWE、DLWE、ss-LWE等问题中矩阵和向量的元素取值范围&#xff0c;是基础整数环x∈RSx \in_R Sx∈…

【闭包】前端的“保护神”——闭包详解+底层原理

目录 一、闭包是什么&#xff1f;概念 二、闭包为什么存在&#xff1f;作用 1. 创建私有变量 2. 实现数据封装与信息隐藏 3. 模拟私有方法 4. 保存函数执行时的状态 5. 回调函数和事件处理 6. 模块化编程 7. 懒加载与延迟执行 三、闭包怎么用&#xff1f;实践业务场景 …

算法学习笔记:19.牛顿迭代法——从原理到实战,涵盖 LeetCode 与考研 408 例题

牛顿迭代法&#xff08;Newtons Method&#xff09;是一种强大的数值计算方法&#xff0c;由英国数学家艾萨克・牛顿提出。它通过不断迭代逼近方程的根&#xff0c;具有收敛速度快、适用范围广的特点&#xff0c;在科学计算、工程模拟、计算机图形学等领域有着广泛应用。牛顿迭…

小白学Python,操作文件和文件夹

目录 前言 一、操作文件路径 1.获取当前路径 2.创建文件夹 &#xff08;1&#xff09;mkdir()函数 &#xff08;2&#xff09;makedirs() 函数 3.拼接路径 4.跳转路径 5.判断相对路径和绝对路径 6.获取文件路径和文件名 二、操作文件和文件夹 1.查询文件大小 2.删除…

015_引用功能与信息溯源

引用功能与信息溯源 目录 引用功能概述支持的模型引用类型API使用方法引用格式应用场景最佳实践 引用功能概述 什么是引用功能 Claude的引用功能允许在回答基于文档的问题时提供详细的信息来源引用&#xff0c;帮助用户追踪和验证信息的准确性。这个功能特别适用于需要高可…