搭配正则的sklearn.Pipeline预处理海量文本性能是否优于spacy?
我需要在spacy和sklearn中选择合适框架处理大规模文本语料库。我通过测试衡量了二者性能,但结果与预期不符。此外我对相关框架使用经验尚浅,无法确定测试完全有效,恳请获得相关指导。
- 测试代码
- 测试结果
我正在开展需预处理3500万条Reddit评论的项目,文本体量极大,因此需要选择效率最高的实现框架。
目前我考虑两种方案:一是搭载多个自定义组件的spacy nlp.pipe,二是集成大量基于正则的数据转换器的sklearn.Pipeline。原本我认为(1) spacy是面向文本处理优化的框架、(2) Python中正则运行速度较慢,因此spacy方案是更优选择,但我希望在正式开发前通过测试验证这一假设。
我编写了简易测试脚本实现性能对比。初看脚本代码量较大,实则结构高度模块化,大多由简单类构成,可直接跳转到脚本末尾的if __name__ ...部分查看整体逻辑。
该脚本分别定义了我认为功能大致等价的两套流水线:一套基于spacy实现,一套基于sklearn实现,二者均仅实现两个功能:(1) 移除标点、(2) 移除类似这种格式的行内代码。两套流水线均继承自负责执行测试的基类。脚本以dask.dataframe(用于并行计算)加载来自r/LanguageTechnology板块的约7500条评论样本,分别用两套流水线重复执行100次相同的预处理操作,对结果取平均值。
需要说明的是,我实际使用的流水线需要实现的功能远不止移除标点和行内代码,选择这两类转换仅用于测试,保证测试简单直接、聚焦核心性能差异。
测试得到的耗时(单位:秒)如下,可查看结果可视化图:
| pipeline(流水线类型) | mean(平均耗时/秒) | standard dev(耗时标准差) |
|---|---|---|
spacy | 13.49772 | 1.182763 |
sklearn | 6.853291 | 0.127701 |
结果显示spacy速度要慢得多,这与我的预期完全相反,导致我无法得出确定结论。
结合正则的sklearn.Pipeline真的是更高效的大规模文本预处理方案吗?还是我的测试设计、流水线搭建方式存在问题?后者可能性很高,因为脚本中用到的几乎所有工具对我来说都比较新:dask.dataframe、搭载自定义组件的spacy、搭载自定义转换器的sklearn.Pipeline。因此很可能存在比如spacy使用方式错误、脚本对比逻辑不公平(并非同类对比)等问题。
鉴于上述不确定性,我诚挚希望熟悉这些框架的开发者提供相关建议,也恳请大家帮忙检查我的代码,确认我对各工具的使用方式是否正确。
欢迎大家提出任何相关建议,非常感谢!
内容的提问来源于stack exchange,提问作者themagicalkamja

