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
相关产品推荐
相关产品推荐

