带 Spacy 管道的多线程 NLP

Multi-Threaded NLP with Spacy pipe

我正在尝试将 Spacy NLP(自然语言处理)管道应用于维基百科转储等大型文本文件。这是我基于 Spacy 的 documentation 示例的代码:

from spacy.en import English

input = open("big_file.txt")
big_text= input.read()
input.close()

nlp= English()    

out = nlp.pipe([unicode(big_text, errors='ignore')], n_threads=-1)
doc = out.next() 

Spacy 一次应用所有 nlp 操作,如 POS 标记、词形还原等。它就像 NLP 的管道,一步处理你需要的一切。应用管道方法应该通过对管道的昂贵部分进行多线程处理来使过程更快。但我没有看到速度有很大提高,我的 CPU 使用率约为 25%(4 个核心中只有一个在工作)。我还尝试分块读取文件并增加输入文本的批次:

out = nlp.pipe([part1, part2, ..., part4], n_threads=-1)

但还是一样的表现。有什么办法可以加快这个过程吗?我怀疑应该启用 OpenMP 功能来编译 Spacy 以利用多线程功能。但是 Windows 上没有关于如何操作的说明。

我想出了问题所在。 OpenMP 是用于为 spacy pipe() 方法实现多线程的包。默认情况下,MSVC 编译器禁用此选项。在我用 openmp 支持编译源代码后,它工作得很好。我还制作了一个 pull request 以在下一个版本中启用它。因此,对于 0.100.7(最新版本)之后的版本,使用 pipe() 的多线程应该可以在 Windows 上正常工作。