在Perl中使用Spacy和Inline::Python将多MB的原始文本元素化。为什么这么慢?
我在一个NLP上工作,需要将大量的令牌从10MB到300MB的原始输入文本文件进行逻辑化,我决定使用在Perl中使用Spacy和Inline::Python将多MB的原始文本元素化。为什么这么慢?,python,performance,perl,nlp,spacy,Python,Performance,Perl,Nlp,Spacy,我在一个NLP上工作,需要将大量的令牌从10MB到300MB的原始输入文本文件进行逻辑化,我决定使用Inline::Python和spacy来完成这项任务。问题是速度很慢。在这之后,我创建了一袋单词,放入一个余弦相似性模块,对过去几年的文本进行分类。有没有一种处理速度更快、多处理、多线程的方法,或者是Python的管道速度较慢?我有i9,64GB RAM,RTX 2080TI和SSD通过nvme连接 下面是一段用法语对一些文本内容进行语法化并过滤停止词的代码: 使用内联Python=>您可以尝试
Inline::Python
和spacy
来完成这项任务。问题是速度很慢。在这之后,我创建了一袋单词,放入一个余弦相似性模块,对过去几年的文本进行分类。有没有一种处理速度更快、多处理、多线程的方法,或者是Python的管道速度较慢?我有i9,64GB RAM,RTX 2080TI和SSD通过nvme连接
下面是一段用法语对一些文本内容进行语法化并过滤停止词的代码:
使用内联Python=>您可以尝试一些速度改进:
使用产生(实际上)而不是在返回列表之前在内存中构造列表。另外,我认为您不需要根据map
的结果创建列表:
使用集合而不是列表进行包含检查:
这些应该有助于减少处理时间和内存压力。向I/O绑定任务添加并行性只会使其速度变慢,除非您有带有单独数据总线的并行磁盘。我对Inline::Python
了解不够,无法确定是否有简单的方法来解决此问题,但是显式地构建一个引理的列表会导致所有东西都存储在内存中。你能把它重构成一个生成器,一次生成一个令牌,然后释放内存吗?这是一个好主意,但很愚蠢的问题,当我有一个python函数过滤器的生成器时,如何取回我的柠檬化单词?用Perl?这是我第一次将Python与Perl混合使用。老实说,这很难理解。我知道perl中有生成器。我应该使用它们吗?你们有多少实际文本,以文字或MB表示?在450到500兆之间,你们这些家伙,我会用收益率尝试你们的解决方案,然后返回给你们。但是在任何情况下,多线程或多处理都是解决方案?请首先尝试单线程性能,以了解您是否与多线程绑定(那么性能将不会随着内核数的增加而线性增加。另外,如果你喜欢这个答案,请接受。我做到了。如何将生成器对象转换为字符串?我是否也应该使用perl生成器?为什么会出现这个问题?你可能想参考一些类似问题的答案,比如
def lemmatizer(words):
doc = nlp(words)
yield from filter(lambda x: x not in list(fr_stop), map(lambda token: token.lemma_, doc))
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))