内联 Python 如何至少在 Perl 中将过滤器对象从 Python 转换为数组或迭代器

问题描述

我在 Perl 中将 spacy 与 Inline::Python 一起使用,最终得到了过滤器对象,但我完全不知道如何使用它,首先,以及如何将其转换为数组,其次。我试过 grep、map、join,但什么都没有,仍然是一个过滤器对象。我不能使用列表,因为数据流太重要了。 这是我的一段代码

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

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))

END_OF_PYTHON

您有任何想法或其他解决方案,例如 IPC::Run 我不知道。

解决方法

我不知道 Inline::Python 增加了多少开销,但这里完全是矫枉过正。

use IPC::Run qw( run );

my $in = ...;

utf8::encode($in);

run [ "lemmatizer.py" ],\$in,\$out
   or die($?);

utf8::decode($out);
my @lemmas = split /\n/,$out;

您甚至可以避免一次性将整个响应加载到内存中。

use IPC::Run qw( run );

my $in = ...;

utf8::encode($in);

run([ "lemmatizer.py" ],'<','>',new_chunker,sub {
      my $lemma = shift;
      utf8::decode($lemma);
      ...
   },)
   or die($?);

在 Python 方面,只需从 STDIN 读取直到 EOF 并从 UTF-8 解码以获取输入,然后通过将使用 UTF-8 编码的每个引理作为单独的行写入来发送输出。