优化Spacy与CSV导出代码:parsetext方法提速需求
优化Spacy + Pandas文本处理代码的实用建议
嘿,我来帮你优化这段用Spacy和Pandas处理文本的代码,尤其是针对parsetext(df)方法耗时2-3秒的问题,给你几个实打实的提速和整体优化方案:
核心提速优化点
1. 避免重复加载Spacy模型
你现在把nlp = spacy.load("en_core_web_sm")放在parsetext函数里,每次调用函数都会重新加载一次模型——这是非常浪费资源的操作!模型加载本身就需要时间,把它移到函数外面,全局初始化一次就够了。
2. 用Spacy批量处理代替逐行调用
Spacy的nlp.pipe()专门用来批量处理文本,性能比逐行调用nlp()高很多,还能通过n_process参数开启多线程(建议设置为CPU核心数,比如n_process=2或4),充分利用硬件资源。
3. 替换低效的iterrows()
Pandas的iterrows()是出了名的慢,完全可以结合nlp.pipe直接批量处理整个文本列,或者用apply方法,效率会提升一大截。
4. 简化停用词过滤逻辑
不用逐词判断word.is_stop==False,可以用更简洁的列表推导式,代码更简洁的同时也能提升一点效率。
整体代码优化细节
- 填充空值可以一次性处理多列,不用分开写两次
fillna,让代码更紧凑 - 导出CSV时,用
pathlib代替sys.path[0]拼接路径,更优雅且跨平台 - 给函数添加明确的参数和返回值,让代码更灵活、可读性更强
- 可以添加简单的类型提示,方便后续维护
优化后的代码示例
import sys import pandas as pd import spacy from pathlib import Path # 全局初始化Spacy模型,只加载一次 nlp = spacy.load("en_core_web_sm") def parsetext(df, text_col: str = "Column1Text") -> pd.DataFrame: # 用nlp.pipe批量处理文本,开启多线程 docs = nlp.pipe(df[text_col].astype(str), n_process=2) # 批量过滤停用词,生成tokens列 df["Tokens"] = [ [token for token in doc if not token.is_stop] for doc in docs ] df["Processed"] = 0 return df def main(): # 处理输入路径 input_path = sys.argv[1] df = pd.read_excel(input_path, sheet_name='Sheet1', header=None) df.columns = ["Column1Text","Column2Text","C3","C4","C5","C6","C7"] # 一次性填充多列空值 df[["Column1Text", "Column2Text"]] = df[["Column1Text", "Column2Text"]].fillna('') # 调用处理函数 df = parsetext(df) # 用pathlib生成输出路径 output_path = Path(sys.path[0]) / "parsed_file.csv" df[['Column1Text', 'Column2Text','Tokens','Processed']].to_csv( output_path, index=None, header=True ) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者user177577
相关产品推荐
相关产品推荐

