调用Spacy作为CountVectorizer分词器报str不可调用错误如何解决
问题根源
你遇到的报错完全来自CountVectorizer的tokenizer参数传值错误:该参数要求传入可调用的函数对象,你传入了字符串'spacy',sklearn在执行分词逻辑时尝试调用这个字符串作为函数,就触发了'str' object is not callable的报错。你之前的怀疑方向是对的,这就是问题的核心原因。
解决方法
你需要先自行定义spacy_tokenizer分词函数,再将该函数对象传入参数,步骤如下:
- 先下载spacy对应的英文预训练模型,执行命令:
python -m spacy download en_core_web_sm - 在你的代码中添加模型加载和分词函数定义的逻辑:
import spacy # 加载spacy英文模型,禁用不需要的管道组件提升运行速度 nlp = spacy.load("en_core_web_sm", disable=["parser", "ner", "tagger"]) def spacy_tokenizer(text): doc = nlp(text) # 过滤标点、空白符,返回词形还原后的分词结果,可根据需求调整逻辑 return [token.lemma_.strip() for token in doc if not token.is_punct and not token.is_space]
- 把
CountVectorizer的初始化语句改回参考代码的写法即可:vectorizer = CountVectorizer(tokenizer = spacy_tokenizer, ngram_range=(1,1))
额外注意事项
- 如果你需要过滤停用词,可以在
spacy_tokenizer的列表推导判断条件中添加and not token.is_stop - 请确保你的
X_train中所有元素都是纯字符串类型,不存在NaN、浮点数等其他类型的值,否则后续还会触发其他类型报错 - 如果你的spacy版本为2.x,可将模型名替换为
en_core_web_sm对应2.x的版本,或直接升级spacy到3.x稳定版本即可
内容的提问来源于stack exchange,提问作者dorito
相关产品推荐
相关产品推荐

