gpt4 book ai didi

python - 在 Perl 中使用 Spacy 和 Inline::Python 对多 MB 的原始文本进行词形还原。为什么这么慢?

转载 作者:行者123 更新时间:2023-12-04 14:58:38 25 4
gpt4 key购买 nike

我从事 NLP 工作,我需要从 10MB 到 300MB 的原始输入文本文件中对大量标记进行词形还原,我决定使用 Inline::Pythonspacy做这个任务。问题是它非常慢。在此之后,我创建了词袋,将其放入余弦相似度模块中,以对过去几年的文本进行分类。有没有一种方法可以处理得更快、多处理、多线程,或者是通往 Python 的管道很慢?我有 i9、64GB RAM、RTX 2080TI 和通过 nvme 连接的 SSD。

这是一段用法语对一些文本内容进行词形还原和过滤停用词的代码:

use Inline Python => <<'END_OF_PYTHON';

import spacy
from spacy.lang.fr.stop_words import STOP_WORDS as fr_stop
nlp = spacy.load('fr_core_news_md')
nlp.max_length = 40000000

def lemmatizer(words):
doc = nlp(words)
return list(filter(lambda x: x not in list(fr_stop), list(map(lambda token: token.lemma_ , doc))))

END_OF_PYTHON

不幸的是,Perl 中没有好的法语词形还原器,而词形还原使我将文本文件分类到好类别中的准确性提高了 5%。如果没有它你已经有 90% 的好结果,这很重要。在这段代码中,在此之后我只使用了 Perl 中的函数 lemmatizer。我不会每次都重新加载法语的 nlp spacy 模块(我想?)

我考虑过为每个文件创建一个线程。我有 15 个大文本文件要进行词形还原。近年来每个类别一个文件。但是 imo,I/O 是问题所在。你有什么想法吗?我无法显示更多代码,因为有 1500 行。我需要 1000 秒来处理最小类别的自动分类(当年的 50/60 个文件)。最大的比最小的大 10 倍。

最佳答案

您可以尝试许多速度改进:

  1. 使用 yield(实际上是 yield from )而不是在返回之前在内存中构建列表。另外,我认为您不需要根据 map 的结果创建列表:
def lemmatizer(words):
doc = nlp(words)
yield from filter(lambda x: x not in list(fr_stop), map(lambda token: token.lemma_, doc))
  1. 使用集合而不是列表进行包含检查:
fr_stop = set(fr_stop)
def lemmatizer(words):
doc = nlp(words)
yield from filter(lambda x: x not in fr_stop, map(lambda token: token.lemma_ , doc))

这些应该有助于减少处理时间和内存压力。

关于python - 在 Perl 中使用 Spacy 和 Inline::Python 对多 MB 的原始文本进行词形还原。为什么这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67397321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com