如何使用spaCy(nlp.pipe)修复大型数据集上的慢速性能进行预处理

时间:2019-06-30 17:37:46

标签: python python-multiprocessing spacy joblib

我遇到了spaCy 2.1的问题,因为它需要花费很长时间来预处理英语和德语的一些文本,以便可以在与机器翻译相关的项目中使用它们。在使用正则表达式进行了简短的清理之后,我使用spaCy的nlp.pipe()函数执行一些过程(去词性化,用词性标记每个单词,以及用德语拆分复合词[由我自己开发]),但是问题是这要花费很长时间,我想知道是否有更好的使用方法可以加快处理速度。

我正在使用的数据集非常大:包括英语和德语的Project Gutenberg电子书,以及精选的两种语言的新闻报道和两种语言的整个Wikipedia数据库。我正在大学的HPC网格上运行此代码,在这里我可以为每个作业分配多达40个CPU内核和250GB RAM,或为RTX 2080 Ti配备多个NVIDIA GPU。无论我尝试哪种组合,似乎都需要花费多天的时间才能完成每个文本的词素化阶段。

我尝试使用joblib通过尝试更多地使用多个内核以及使用多处理来完成相同的事情来帮助加快处理速度。似乎都没有那么大的影响。我也尝试过调整批量大小无济于事。


    clean_en_texts_step1 = [cleaning(doc) for doc in NLP_EN.pipe(en_texts, batch_size=100)]
    clean_en_texts = [tag_pos(doc) for doc in NLP_EN.pipe(clean_en_texts_step1, batch_size=100)]
    clean_de_texts_step1 = [cleaning(doc) for doc in NLP_DE.pipe(de_texts, batch_size=100)]  
    compound_split = [split_compound_pipe(doc) for doc in NLP_DE.pipe(clean_de_texts_step1, batch_size=100)]        
    clean_de_texts = [tag_pos(doc) for doc in NLP_DE.pipe(compound_split, batch_size=100)]

我希望管道的速度比以前快得多(而不是花几天的时间来完成第一步。

1 个答案:

答案 0 :(得分:0)

我建议在https://spacy.io/usage/examples#multi-processingnlp.pipe顶部使用多重处理。不幸的是,由于python的GIL和多线程问题,nlp.pipe(n_threads=xxx) n_threads已被弃用(https://spacy.io/api/language#pipe)。