CountVectorizer使用自定义词汇表时无法识别对应词汇输出全零是什么原因?
问题根因
- CountVectorizer默认采用按空格切分的单字分词逻辑,其默认
token_pattern参数仅匹配长度≥2的独立单词,不会将空格连接的多词组合识别为一个完整token。你传入的自定义词汇表中Big Bazaar、Brand Factory等条目均为带空格的双词短语,和分词后输出的单个token完全无法匹配,因此统计得到的所有特征值均为0。
解决方案
方案1:调整ngram_range适配多词短语
设置ngram_range参数为(1,2),让模型同时提取1元独立词和2元组合短语,即可正确匹配双词实体:
import pandas as pd from sklearn.feature_extraction.text import CountVectorizer final_vocab = {'Amazon', 'Big Bazaar', 'Brand Factory', 'Central', 'Cleartrip', 'Dominos', 'Flipkart', 'IRCTC', 'Lenskart', 'Lifestyle', 'MAX', 'MMT', 'More', 'Myntra'} vect = CountVectorizer(vocabulary=final_vocab, ngram_range=(1,2)) token_df = pd.DataFrame(vect.fit_transform(['Big Bazaar','Brand Factory']).todense(), columns=vect.get_feature_names())
运行后Big Bazaar、Brand Factory对应的特征值会正确显示为1。如果词汇表中存在3词及更长的短语,对应调大ngram_range的上限即可,比如3词短语设置为ngram_range=(1,3)。
方案2:自定义分词器跳过空格切分
如果词汇表中所有条目都是固定的完整实体,可以自定义分词函数直接将整段输入作为单个token返回,完全规避默认分词的切分逻辑:
def custom_tokenizer(text): return [text] vect = CountVectorizer(vocabulary=final_vocab, tokenizer=custom_tokenizer)
内容的提问来源于stack exchange,提问作者qaiser
相关产品推荐
相关产品推荐

