一、带逐行详细注释的完整代码

# 注释:该代码的核心功能是先对亚马逊评论的Embedding向量做KMeans聚类(分成3类),
# 再用T-SNE将高维向量降维到2维,最后通过散点图可视化不同聚类类别的分布,
# 核心目的是发现评论的语义聚类规律(无需人工标注,纯数据驱动分类)

# 导入pandas库,用于读取CSV数据集(包含Embedding向量)和数据处理
import pandas as pd
# 导入numpy库,用于数值计算(矩阵构建、维度处理)
import numpy as np
# 导入ast库,用于将字符串格式的Embedding向量转为Python列表
import ast
# 导入matplotlib.pyplot库,用于绘制散点图可视化聚类结果
import matplotlib.pyplot as plt
# 导入matplotlib核心库,用于配置颜色映射
import matplotlib
# 从sklearn的流形学习模块导入TSNE类,用于高维向量降维
from sklearn.manifold import TSNE
# 从sklearn的聚类模块导入KMeans类,用于对Embedding向量做无监督聚类
from sklearn.cluster import KMeans

# 设置matplotlib的字体为“SimHei(黑体)”,解决中文标签显示为方块的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号“-”显示为方块的问题(绘图时坐标轴可能出现负号)
plt.rcParams['axes.unicode_minus'] = False

# 读取第一步生成的包含Embedding向量的CSV文件(路径需与之前一致)
df = pd.read_csv('datas/embedding_output_1k.csv')

# 新增embedding_vec列:将字符串格式的Embedding向量(如"[0.123,0.456,...]")转为Python列表
# ast.literal_eval()是安全的字符串解析方法,避免eval()的安全风险
df['embedding_vec'] = df['embedding'].apply(ast.literal_eval)

# 注释:T-SNE是非线性降维算法,能将1536维高维向量映射到2D/3D空间,方便可视化;
# nunique()用于统计某列不同值的个数,例如[1,1,1]的nunique()为1,确保所有向量维度一致

# 校验所有embedding_vec的长度是否相同(必须一致才能构建矩阵做聚类/降维)
# df['embedding_vec'].apply(len)计算每条向量的长度,nunique()==1表示所有向量维度相同(均为1536)
if df['embedding_vec'].apply(len).nunique() == 1:
    # 将所有Embedding向量列表垂直堆叠为二维numpy矩阵(形状:1000行 × 1536列)
    # 这是sklearn聚类/降维算法的标准输入格式(必须是矩阵而非列表)
    matrix = np.vstack(df['embedding_vec'].values)

    # 初始化KMeans聚类模型实例,配置核心参数
    # 3:聚类数量(将评论分为3类);init='k-means++':智能初始化聚类中心,避免局部最优
    # random_state=43:随机种子,保证每次聚类结果一致(可复现);n_init=10:运行10次KMeans取最优结果
    km = KMeans(3, init='k-means++', random_state=43, n_init=10)
    # 用1536维的Embedding矩阵训练KMeans模型(核心:计算聚类中心,给每条数据分配类别)
    km.fit(matrix)

    # 新增Kmeans_Label列:存放每条评论的聚类标签(0/1/2,对应3个类别)
    # km.labels_是模型训练后生成的类别标签,长度与数据集行数一致
    df['Kmeans_Label'] = km.labels_  # 把所有类别存放到新字段:0,1,2

    # 创建T-SNE降维模型实例,参数与上一节一致
    # n_components=2:降维到2维;perplexity=15:困惑度(控制近邻数量);random_state=42:固定随机种子
    # init='random':随机初始化;learning_rate=200:降维学习率
    tsne = TSNE(n_components=2, perplexity=15, random_state=42, init='random', learning_rate=200)

    # 对1536维的Embedding矩阵执行T-SNE降维,得到2维矩阵(形状:1000行 × 2列)
    matrix_2d = tsne.fit_transform(matrix)

    # 打印降维后的2维矩阵(每行是一条评论的2维坐标,如[5.6, -8.9]),验证降维成功
    print(matrix_2d)

    # ===================== 可视化聚类结果 =====================
    # 定义3种颜色,对应3个聚类类别(0→红,1→绿,2→蓝)
    colors = ["red", "green", "blue"]

    # 提取2维矩阵的第一列作为x轴坐标(所有评论的横向位置)
    x = matrix_2d[:, 0]
    # 提取2维矩阵的第二列作为y轴坐标(所有评论的纵向位置)
    y = matrix_2d[:, 1]

    # 获取聚类标签作为颜色索引(0/1/2直接对应colors列表的索引)
    colors_indices = df['Kmeans_Label'].values

    # 将自定义颜色列表转为matplotlib可识别的颜色映射对象
    color_map = matplotlib.colors.ListedColormap(colors)

    # 绘制散点图:x/y为降维后的坐标,c为聚类标签对应的颜色索引,cmap为颜色映射
    # 每个点代表一条评论,颜色区分聚类类别,位置反映语义相似度(同类别点大概率聚集)
    plt.scatter(x=x, y=y, c=colors_indices, cmap=color_map)

    # 设置图表标题(显示中文需提前配置字体)
    plt.title('使用聚类和T-SNE降维后的亚马逊评论')

    # 显示绘制好的散点图(弹出窗口展示结果)
    plt.show()

二、核心知识点详解

1. 核心概念梳理
概念通俗解释关键说明
KMeans聚类一种无监督学习算法,将相似的数据自动归为若干类别(“簇”)1. 核心逻辑:先指定类别数k(本文k=3),迭代计算k个聚类中心,将每个数据分配到最近的中心所属类别
2. 无监督:无需人工标注“哪些评论是一类”,纯靠Embedding向量的语义相似度分类
3. 关键参数:k(类别数)、init(初始化方式)、n_init(运行次数)
聚类标签(Label)KMeans模型给每条数据分配的类别编号(本文是0/1/2)1. 标签无实际语义(如0不代表“好评”,仅代表“语义相似的一类评论”)
2. 同标签的评论Embedding向量距离更近,语义更相似
T-SNE+KMeans组合先聚类再降维可视化的经典流程1. 为什么先聚类再降维:聚类基于原始高维向量(1536维),结果更准确;降维仅用于可视化
2. 核心价值:用聚类发现隐藏的语义类别,用T-SNE把类别分布直观展示在二维平面
无监督学习无需人工标注标签的机器学习方法1. 与“有监督学习(如分类、回归)”的区别:无标签、纯靠数据本身的特征聚类
2. 适用场景:探索数据的隐藏规律(如不知道评论有哪些类别,想自动发现)
2. 所用库的详细说明(新增/重点库)
库名/模块核心作用本代码中关键用法补充说明
sklearn.cluster.KMeans实现KMeans聚类算法1. KMeans(3, init='k-means++', random_state=43, n_init=10):创建聚类模型
2. km.fit(matrix):用高维矩阵训练模型
3. km.labels_:获取每条数据的聚类标签
1. init='k-means++':比随机初始化更优,避免聚类中心落在异常点
2. n_init=10:运行10次KMeans,选择聚类效果最好的结果(降低局部最优风险)
3. 类别数k需手动指定(本文k=3,可根据业务调整为5/8等)
numpy矩阵操作np.vstack():将列表形式的Embedding向量转为二维矩阵KMeans和T-SNE均要求输入为numpy矩阵,而非Python列表
ast字符串解析ast.literal_eval():将字符串向量转为列表读取CSV后Embedding向量默认是字符串,必须转换才能参与数值计算
matplotlib可视化plt.scatter():绘制聚类结果散点图颜色直接对应聚类标签,直观展示类别分布
3. Print函数与绘图说明
(1)Print函数说明
代码输出内容作用
print(matrix_2d)二维矩阵(如[[ 3.21 -5.43], [ 1.89 7.65], ...])1. 验证T-SNE降维成功,输出每条评论的2维坐标
2. 可通过矩阵形状(print(matrix_2d.shape))验证是否为(1000,2),确保降维到2维
(2)绘图函数与可视化结果说明
代码作用预期可视化效果(图例说明)
plt.scatter(x=x, y=y, c=colors_indices, cmap=color_map)绘制聚类散点图聚类+T-SNE可视化效果图(示意)
核心特征:
1. 红色/绿色/蓝色点分别代表3个聚类类别;
2. 同颜色点大概率聚集在一起(说明同类别评论语义相似);
3. 不同颜色点基本分离(说明聚类效果好,类别间语义差异明显);
4. 若某颜色点分散在多个区域,说明k值(3)可能不合适,需调整
plt.title('使用聚类和T-SNE降维后的亚马逊评论')设置图表标题标题清晰说明可视化的核心方法(聚类+T-SNE)和数据来源(亚马逊评论)
plt.show()显示图表弹出独立窗口展示散点图,可保存/缩放,直观观察聚类分布
4. KMeans关键参数解析(小白必懂)
参数取值(本文)通俗解释为什么这么设置
n_clusters3聚类的类别数(把评论分成3类)入门级设置,方便可视化;实际业务中可通过“肘部法则”确定最优k值
init‘k-means++’聚类中心的初始化方式避免随机初始化导致聚类中心落在异常点,提升聚类效果
random_state43随机种子固定种子后,每次运行代码的聚类结果完全一致,便于复现和调试
n_init10运行KMeans的次数运行10次后取最优结果,降低“局部最优解”的风险(单次运行可能结果不好)

三、总结

  1. 核心目标:通过KMeans对1536维的评论Embedding向量做无监督聚类(3类),再用T-SNE降维到2维,可视化不同聚类类别的语义分布;
  2. 关键步骤:读取向量数据→转换向量格式→构建高维矩阵→KMeans聚类(生成标签)→T-SNE降维→绘制颜色区分聚类的散点图;
  3. 核心注意点:
    • KMeans的类别数k需手动指定,实际应用中可通过“肘部法则”选择最优k;
    • 先聚类(高维)再降维(可视化)是最优流程,避免降维后聚类导致信息丢失;
    • 聚类标签无直接语义,需结合评论文本分析每个类别的实际含义(如0类是“口感相关评论”,1类是“价格相关评论”)。

运行结果


[[ 11.009294   15.715658 ]
 [ 11.535578  -37.481087 ]
 [-35.892113   45.436775 ]
 ...
 [ 49.90143    19.138323 ]
 [-17.05342   -51.86057  ]
 [ -7.1301866 -44.626617 ]]

进程已结束,退出代码为 0

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐