使用Spacy分词器结合TfidfVectorizer遇卡顿及token_pattern提示问题
问题分析与解决办法
关于token_pattern的提示
这个提示不是错误,只是告诉你:因为你指定了自定义的tokenizer参数,TfidfVectorizer默认的token_pattern规则就不会生效了,完全可以忽略它。
终端卡住的核心原因及解决
你现在的问题主要是分词效率太低导致程序卡死,问题出在Spacy的使用方式上:
- 默认加载的Spacy模型太重:如果用的是
en_core_web_sm这类完整模型,它自带了词性标注、依存分析等一堆你不需要的管道,这些会拖慢分词速度。 - 没有批量处理优化:直接在tokenizer里逐个调用
nlp(doc),对于大量文本来说效率极低。
具体优化步骤
- 禁用Spacy不需要的管道
初始化nlp对象时,只保留分词功能,关掉其他没用的组件:import spacy nlp = spacy.load("en_core_web_sm", disable=["tagger", "parser", "ner"]) - 优化tokenizer函数
配合轻量模型使用你的原有逻辑即可,效率会大幅提升:def spacy_tokenizer(doc): return [t.text for t in nlp(doc) if not t.is_punct and not t.is_space and t.is_alpha] - 极端情况可换用更轻量的分词方式
如果数据量极大,甚至可以不用Spacy,直接用正则实现相同过滤逻辑:import re def simple_tokenizer(doc): # 匹配所有字母组成的词,自动过滤标点和空格 return re.findall(r'[A-Za-z]+', doc) vectorizer = TfidfVectorizer(tokenizer=simple_tokenizer)
内容的提问来源于stack exchange,提问作者Nachonacho Nachonacho
相关产品推荐
相关产品推荐

