问题描述
我在 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 编码的每个引理作为单独的行写入来发送输出。