DataWhale AI夏令营 Task2笔记
首先学习理解了一遍代码:
原始代码从商品识别、情感分类、主题聚类三个阶段解决问题。
本质上是一条从原始文本到商业洞察的自动化流水线,它的核心任务是把看似杂乱无序的带货视频和评论数据,转化为企业可以直接拿来用的决策参考。整个过程分成三个大阶段,每个阶段都像是一个独立的车间,前一个车间的输出是后一个车间的原材料,环环相扣。
第一阶段是商品识别。在这一步,机器要解决的问题是:这条视频到底在卖什么?它先拿视频描述和标签拼成一段“文字画像”,然后用中文分词工具把这段话拆成一个个关键词,再用TF-IDF算法挑出最有代表性的词,最后用线性分类器比对已知商品,猜出这条视频对应的商品名称。这一步是整个流程的地基,如果商品识别错了,后面的分析就全跑偏了。
第二阶段是情感与意图分类。当机器知道视频在卖什么之后,它要读懂用户在评论区里到底表达了什么。这一步分四件事:判断用户是夸还是骂(情感倾向),是否在描述使用场景(用户场景),是否在提问(用户疑问),是否在提建议(用户建议)。机器用同样的方法——分词、向量化、训练分类器——给每条评论打上标签。这些标签就像一个个路标,告诉企业用户到底在意什么。
第三阶段是主题聚类。有了情感标签和意图标签,机器还要把相似的评论聚成一堆,再提炼出每堆评论的关键词,形成“用户最关心的话题”。比如,正面评论可能聚出“性价比高”“物流快”,负面评论可能聚出“质量差”“客服慢”。这一步机器用了KMeans聚类算法,把评论分成若干组,然后从每组里挑出权重最高的10个词作为主题词。这些主题词就是企业最想听的“用户心声”。
主要优化点
商品识别优化:
使用更强大的文本表示方法(如BERT或Sentence-BERT)替代TF-IDF
增加特征工程(如视频描述长度、标签数量等)
情感分类优化:
使用预训练语言模型(如RoBERTa)进行细粒度情感分析
对类别不平衡问题进行处理(如过采样/欠采样)
聚类优化:
动态选择最佳聚类数量(基于轮廓系数)
使用更先进的聚类算法(如DBSCAN或HDBSCAN)
改进主题词提取方法(如使用TF-IDF加权或关键词提取算法)
其他优化:
更好的数据预处理(如去除停用词、词形还原等)
使用集成方法
增加交叉验证
部分优化代码:
数据预处理:
def preprocess_text(text):if not isinstance(text, str):return ""# 去除特殊字符和标点text = re.sub(r'[^\w\s]', '', text)# 分词words = jieba.lcut(text)# 去除停用词(可根据实际情况扩充)stopwords = set(['的', '了', '和', '是', '我', '你', '在', '有', '这', '那'])words = [word for word in words if word not in stopwords]return ' '.join(words)
分类任务优化
for col in ['sentiment_category', 'user_scenario', 'user_question', 'user_suggestion']:# 只在有标注的数据上训练train_idx = ~comments_data[col].isnull()# 计算类别权重处理不平衡classes = comments_data[train_idx][col]sample_weights = compute_sample_weight('balanced', classes)# 使用更大的特征空间和更好的模型predictor = make_pipeline(TfidfVectorizer(tokenizer=jieba.lcut, max_features=1000, ngram_range=(1, 2)),LinearSVC(class_weight='balanced'))predictor.fit(comments_data[train_idx]["comment_text"],classes,**{'linearsvc__sample_weight': sample_weights})# 预测所有评论comments_data[col] = predictor.predict(comments_data["comment_text"])
聚类优化函数
def optimized_clustering(texts, min_clusters=5, max_clusters=8):best_score = -1best_n = min_clustersbest_labels = Nonebest_model = None# 向量化vectorizer = TfidfVectorizer(tokenizer=jieba.lcut, max_features=500)X = vectorizer.fit_transform(texts)# 尝试不同的聚类数量for n in range(min_clusters, max_clusters + 1):model = KMeans(n_clusters=n, random_state=42)labels = model.fit_predict(X)# 计算轮廓系数(仅在样本量不太大时)if len(texts) < 10000:score = silhouette_score(X, labels)if score > best_score:best_score = scorebest_n = nbest_labels = labelsbest_model = model# 如果没有计算轮廓系数(数据量大),使用默认值if best_model is None:best_n = 5best_model = KMeans(n_clusters=best_n, random_state=42)best_labels = best_model.fit_predict(X)# 提取主题词top_n_words = 10feature_names = vectorizer.get_feature_names_out()cluster_centers = best_model.cluster_centers_cluster_themes = []for i in range(best_n):top_feature_indices = cluster_centers[i].argsort()[::-1][:top_n_words]top_words = [feature_names[idx] for idx in top_feature_indices]cluster_themes.append(' '.join(top_words))return best_labels, cluster_themes
得分情况:
成功上分。