微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决内联 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 编码的每个引理作为单独的行写入来发送输出。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。