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

Sklearn ColumnTransformer处理完成后如何获取词汇表(vocabulary_)

如何从ColumnTransformer中获取各个TfidfVectorizer的词汇表?

我最近在用Scikit-learn的ColumnTransformer处理特征,里面嵌套了好几个TfidfVectorizer来处理文本特征,但直接访问vocabulary_属性时遇到了一堆错误,折腾了好半天,下面是我的场景和解决方法:

我的代码与问题

首先是我的特征处理代码:

features = df[["content", "numeric1", "numeric2"]]
results = df["label"]
features = features.to_numpy()
results = results.to_numpy()

# 创建转换器集合
transformerVectoriser = ColumnTransformer(transformers=[
    ('vector_char', TfidfVectorizer(analyzer='char', ngram_range=(2, 6), max_features = 2500, lowercase = True), 0),
    ('vector_word_1', TfidfVectorizer(analyzer='word', ngram_range=(1, 1), max_features = 10000, lowercase = True), 0),
    ('vector_word_2', TfidfVectorizer(analyzer='word', ngram_range=(2, 2), max_features = 4500, lowercase = True), 0),
    ('vector_word_3', TfidfVectorizer(analyzer='word', ngram_range=(3, 3), max_features = 750, lowercase = True), 0)
], remainder='passthrough' )
print(transformerVectoriser.vocabulary_)

执行后直接报错:AttributeError: 'ColumnTransformer' object has no attribute 'vocabulary_'

我还试了几种方法,都没成功:

  • 先执行features = transformerVectoriser.fit_transform(features),再打印features.vocabulary_,报错:AttributeError: vocabulary_ not found
  • 执行transformerVectoriser.fit(features)后,打印transformerVectoriser.transformers_[0].vocabulary_,报错:AttributeError: 'tuple' object has no attribute 'vocabulary_'
  • 执行transformed_features = transformerVectoriser.fit_transform(features)后,打印transformed_features.transformers_[0].vocabulary_,报错:AttributeError: transformers_ not found

正确的解决方法

其实问题很简单:ColumnTransformer本身是多个转换器的容器,它自己并没有vocabulary_属性,这个属性是属于每个单独的TfidfVectorizer实例的。我们需要先拿到对应的实例,再访问其vocabulary_。

方法1:用named_transformers_(推荐)

ColumnTransformer拟合数据后会生成named_transformers_属性,这是一个字典,键就是你定义transformers时给每个转换器起的名字(比如vector_char),值就是对应的TfidfVectorizer实例。

代码示例:

# 先拟合数据,必须先执行fit或fit_transform,vocabulary_才会生成
transformerVectoriser.fit(features)

# 通过名称获取每个vectorizer的词汇表
vocab_char = transformerVectoriser.named_transformers_['vector_char'].vocabulary_
vocab_word_1 = transformerVectoriser.named_transformers_['vector_word_1'].vocabulary_
vocab_word_2 = transformerVectoriser.named_transformers_['vector_word_2'].vocabulary_
vocab_word_3 = transformerVectoriser.named_transformers_['vector_word_3'].vocabulary_

# 可以按需打印或保存
print("字符2-6元组的词汇表:", vocab_char)

这种方法的好处是通过名称访问,即使后续调整了transformers的顺序,也不会出错,可读性更强。

方法2:用transformers_属性

如果你想用索引访问,transformers_属性里的每个元素是一个元组,结构是(转换器名称, 转换器实例, 处理的列),所以需要取元组的第二个元素:

transformerVectoriser.fit(features)

# 获取第一个转换器(vector_char)的词汇表
first_vocab = transformerVectoriser.transformers_[0][1].vocabulary_
# 获取第二个转换器(vector_word_1)的词汇表
second_vocab = transformerVectoriser.transformers_[1][1].vocabulary_

这个方法适合快速测试,但如果transformers的顺序变动,索引也需要调整,不如第一种方法稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:47:40