Python中SpaCy词形还原用numpy.vectorize无性能提升问题求助
问题描述
作为Python新手,每日需下载并处理超300万条推文,主要用SpaCy做文本分析,现有流程可正常运行但词形还原环节速度较慢。尝试用numpy.vectorize优化后,性能毫无提升。
原非向量化代码
def lem2(stringa): return " ".join([token.lemma_ for token in nlp(stringa) ]) try: df[text_lem] = df[text_clean].apply(lambda x: lem(x) ) except Exception as ee: printg("ERROR: %s" % str(ee))
尝试的向量化代码
def lem3(numpy_array: np.array) -> np.array: return " ".join([token.lemma_ for token in nlp(numpy_array) ]) aaa = df2['text_clean'].to_numpy() applyall = np.vectorize( lem3 ) df2['text_lem'] = applyall( aaa )
为什么numpy.vectorize没提升性能
- numpy.vectorize并非真正的向量化:它只是Python循环的包装器,底层还是逐条遍历数组元素调用函数,本质和
df.apply()没有区别,不会带来性能提升。 - 参数传递错误:
lem3函数接收的是numpy数组,但SpaCy的nlp()只能处理单条字符串,实际执行时还是逐个传入字符串调用nlp(),完全没用到批量处理的优势。
优化方案
1. 用SpaCy的批量处理(最有效)
SpaCy的nlp.pipe()方法支持批量处理文本,内部会优化批次和进程调度,比逐条调用nlp()效率高很多:
def batch_lemmatize(texts): lemmas = [] # batch_size根据内存调整,n_process=-1启用所有CPU核心 for doc in nlp.pipe(texts, batch_size=1000, n_process=-1): lemma_str = " ".join([token.lemma_ for token in doc]) lemmas.append(lemma_str) return lemmas df['text_lem'] = batch_lemmatize(df['text_clean'])
2. 禁用SpaCy不需要的管道
SpaCy默认加载的词性标注、依存句法等管道如果用不到,可以禁用,减少计算开销:
# 加载模型时只保留词形还原相关管道 nlp = spacy.load("en_core_web_sm", disable=["tagger", "parser", "ner"])
3. 轻量工具替换(追求极致速度)
如果SpaCy的速度仍不满足需求,可以用更轻量的nltk WordNetLemmatizer(准确性略低于SpaCy,但速度更快):
from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize import nltk nltk.download('wordnet') nltk.download('punkt') lemmatizer = WordNetLemmatizer() def lemmatize_text(text): tokens = word_tokenize(text) return " ".join([lemmatizer.lemmatize(token) for token in tokens]) df['text_lem'] = df['text_clean'].apply(lemmatize_text)
内容的提问来源于stack exchange,提问作者Paxi
相关产品推荐
相关产品推荐

