如何使用KMeans对字符串列表聚类 实现名称按特征相似度分组
针对标签列表数据做KMeans聚类的落地方案
核心处理思路
你遇到的核心问题是集合型离散特征的向量化转换,针对这种每个样本对应一组独立标签的场景,最优方案是用多标签二值化编码,整体流程如下:
- 第一步:对每个样本的特征标签列表做二值化编码,把每个独立标签转换为一个维度,对应值为1(样本含该标签)或0(样本不含该标签)
- 第二步:(可选)如果标签维度极高,可通过PCA等方法做降维,降低后续KMeans的计算开销
- 第三步:把编码后的数值矩阵输入KMeans模型完成聚类
- 第四步:将聚类结果匹配回原名称列输出分组
具体实现代码
第一步:依赖导入与示例数据加载
import pandas as pd from sklearn.preprocessing import MultiLabelBinarizer from sklearn.cluster import KMeans # 示例数据集 df = pd.DataFrame({ "name":['lion','leopard','racoon','possum'], "features":[ ['mane', 'teeth', 'tail', 'carnivore'], ['spots', 'teeth', 'tail', 'carnivore'], ['stripes', 'teeth', 'omnivore', 'small'], ['teeth', 'omnivore', 'small'] ] })
第二步:特征向量化
# 初始化多标签二值化器 mlb = MultiLabelBinarizer() # 把特征列表转换为二值化矩阵 feature_matrix = mlb.fit_transform(df['features']) # 可查看生成的维度对应的标签,方便验证 print("所有标签列表:", mlb.classes_)
这里输出的二值化矩阵和标签是完全对应的,比如lion对应的向量会在mane、teeth、tail、carnivore这几个维度为1,其余为0。
第三步:KMeans聚类
# 初始化KMeans,预期分2类,所以n_clusters设为2 kmeans = KMeans(n_clusters=2, random_state=42) # 训练并获取聚类结果 df['cluster'] = kmeans.fit_predict(feature_matrix)
第四步:输出聚类结果
直接查看最终的分组:
print(df[['name', 'cluster']])
输出结果会符合你的预期:lion、leopard属于同一簇,racoon、possum属于同一簇。
方案说明
- 为什么不用TF-IDF/Word2Vec等其他向量化方法?你当前的特征是独立的分类标签,没有上下文语义、也没有词频差异,二值化编码是最轻量化、最贴合业务特征的转换方式,计算的距离完全匹配你之前手动统计共有元素的相似度逻辑。
- 如果后续你的特征变成有语义的长文本,再考虑更换为TF-IDF或词向量方案即可。
内容的提问来源于stack exchange,提问作者hselbie
相关产品推荐
相关产品推荐

