如何使用Spacy(NLP. -Pipe)在大型数据集上修复缓慢的性能进行预处理



我对Spacy 2.1有一个问题,在这种情况下,需要很长时间才能用英语和德语进行一些文本,以便我可以在与机器翻译相关的项目中使用它们。在使用Regex进行了简短清洁后,我使用Spacy的NLP. -Pipe((函数来执行一些过程(lemmatization,用语音的部分标记每个单词,以及在德语中分配化合物(我开发我自己((,但是问题是它需要很长时间,我想知道是否有更好的使用方法可以加快事情的速度。

我使用的数据集很大:由英文和德语的项目Gutenberg电子书组成,以及两种语言的语言和整个Wikipedia数据库的选择。我正在大学的HPC网格上运行此代码,在那里我可以为每项工作分配多达40个CPU内核和250GB RAM,或者选择的NVIDIA GPU,最多可达RTX 2080 TI。无论我尝试哪种组合,似乎都需要几天才能超越每个文本的lemmatization阶段。

我尝试使用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)]

我希望管道比现在要快得多(而不是花多天才能完成第一步。

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

最新更新