Python中CountVectorizer传入自定义词汇表返回全零结果如何解决?
问题根因
CountVectorizer的vocabulary参数默认接收单个分词单元的集合,你传入的是完整短语,而工具默认分词逻辑会把输入文本拆分为单个词汇,不会将整段短语作为匹配单元,无法命中你自定义的词汇条目,所以输出全为0。- 工具默认开启
lowercase=True,会自动将所有字符转为小写,你自定义词汇中的大写Cat就算按单个词匹配也会因为大小写不一致无法命中。 - 默认分词正则会自动过滤标点符号,你自定义词汇中的
:不会出现在分词结果中,进一步导致匹配失败。
解决方案
方案1:按短语匹配(匹配你的预期输出)
如果你确实需要将完整短语作为特征维度,调整参数覆盖短语匹配的要求即可,修改后可运行代码如下:
from sklearn.feature_extraction.text import CountVectorizer foo = ["the Cat is :", "is smart now"] cv = CountVectorizer( vocabulary = foo, lowercase = False, # 关闭自动转小写,匹配词汇中的大写格式 ngram_range = (2,4), # 允许将2-4个连续分词组合为匹配单元,覆盖短语长度 token_pattern = r'\b\w+\b|:' # 调整分词正则,保留冒号符号 ) new_list =["the Cat is : the most","is smart now"] data = cv.fit_transform(new_list).toarray() print(data)
运行后输出:
[[1 0] [0 1]]
和你的预期完全一致。
方案2:按单个词汇匹配
如果是误将整句作为词汇表传入,原本需要自定义单个词的词汇维度,直接将vocabulary调整为单个词的列表即可:
# 示例自定义单个词词汇表 foo = ["the", "cat", "is", "smart", "now"] cv = CountVectorizer(vocabulary = foo, lowercase = True)
内容的提问来源于stack exchange,提问作者Raed
相关产品推荐
相关产品推荐

