You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

聚类分析中DataFrame内词令牌列表的合理处理方案咨询

针对你的聚类编码问题的解答

1. 0-1编码会丢失embeddings中的语义吗?

  • 是的,完全会丢失语义信息。0-1编码属于词袋模型范畴,只记录每个token是否在样本中出现,既不考虑token的顺序、上下文关系,也无法体现语义相似度——比如“番茄”和“西红柿”在这种编码里是完全独立的两列,没有任何关联。
  • 而embeddings(比如Word2Vec、BERT向量)是将token映射到连续低维空间,能捕捉语义相似性、上下文依赖等关键信息,这些在0-1编码里都无法体现。
  • 如果你的聚类目标只关注「样本包含哪些token」,0-1编码可以满足需求;但如果需要考虑语义关联(比如把用了“番茄”和“西红柿”的样本归为一类),建议直接用token embeddings的聚合特征(比如对每个样本的所有token向量取均值或最大值)来构建聚类特征。

2. 如何正确实现列表型属性的0-1编码?

你提到用MultiLabelBinarizer时没保留列表结构,应该是操作环节出了问题。下面是完整的实现流程:

准备工作

假设你的DataFrame名为df,结构示例如下:

import pandas as pd
from sklearn.preprocessing import MultiLabelBinarizer

# 示例数据
df = pd.DataFrame({
    "ingredient_tokens": [["面粉", "鸡蛋"], ["牛奶", "面粉"], ["鸡蛋"]],
    "steps_tokens": [["搅拌", "和面"], ["加热", "搅拌"], ["打匀"]]
})

对单层列表列编码(比如ingredient_tokens)

# 初始化编码器
mlb_ing = MultiLabelBinarizer()
# 对列表列进行编码,得到0-1数组
encoded_ing = mlb_ing.fit_transform(df["ingredient_tokens"])
# 转为DataFrame,列名为所有唯一token
ing_encoded_df = pd.DataFrame(encoded_ing, columns=mlb_ing.classes_)
# 合并到原DataFrame,保留原列表列
df = pd.concat([df, ing_encoded_df], axis=1)

处理后原ingredient_tokens列表列会被保留,同时新增每个token对应的0-1特征列。

对嵌套列表列编码(比如steps_tokens是列表的列表)

如果你的列表是嵌套结构,需要先扁平化:

# 扁平化steps_tokens:把每个样本的子列表合并成单层列表
df["steps_flat"] = df["steps_tokens"].apply(lambda x: [token for sublist in x for token in sublist])
# 编码扁平化后的列
mlb_steps = MultiLabelBinarizer()
encoded_steps = mlb_steps.fit_transform(df["steps_flat"])
steps_encoded_df = pd.DataFrame(encoded_steps, columns=mlb_steps.classes_)
# 合并到原DataFrame
df = pd.concat([df, steps_encoded_df], axis=1)

优化建议:减少特征维度

如果token数量过多导致特征爆炸,可先过滤低频token:

from collections import Counter

# 统计所有ingredient token的出现次数
all_ing_tokens = [t for sublist in df["ingredient_tokens"] for t in sublist]
token_counts = Counter(all_ing_tokens)
# 只保留出现次数≥3的token(阈值可根据数据调整)
high_freq_tokens = [t for t, cnt in token_counts.items() if cnt >=3]
# 过滤样本中的低频token
df["ingredient_filtered"] = df["ingredient_tokens"].apply(lambda x: [t for t in x if t in high_freq_tokens])
# 再对过滤后的列进行编码

内容的提问来源于stack exchange,提问作者Linda Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:43:41