如何解决内联 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 举报,一经查实,本站将立刻删除。