我如何在 spaCy 中使用生成器对象?

How do I use generator objects in spaCy?

在这里第一次体验 NLP。我有大约 50 万条推文。我正在尝试使用 spacy 删除停用词、词形还原等,然后将处理后的文本传递给分类模型。由于数据的大小,我需要多处理才能以合理的速度执行此操作,但是一旦有了生成器对象,我就不知道如何处理它。

这里我加载spacy并通过标准管道传递数据:

nlp = spacy.load('en')

tweets = ['This is a dummy tweet for stack overflow',
         'What do we do with generator objects?']
spacy_tweets = []
for tweet in tweets:
    doc_tweet = nlp.pipe(tweet, batch_size = 10, n_threads = 3)
    spacy_tweets.append(doc_tweet)

现在我想获取 spaCy 创建的 Doc 对象,然后用这样的方式处理文本:

def spacy_tokenizer(tweet):
    tweet = [tok.lemma_.lower().strip() if tok.lemma_ != "-PRON-" else tok.lower_ for tok in tweet]
    tweet = [tok for tok in tweet if (tok not in stopwords and tok not in punctuations)] 
    return tweet

但这不起作用,因为在使用 .pipe() 方法时 spaCy returns 生成器对象。所以当我这样做时:

for tweet in spacy_tweets:
    print(tweet)

它打印生成器。好的,我明白了。但是当我这样做时:

for tweet in spacy_tweets[0]:
    print(tweet)

我希望它能在生成器中打印 Doc 对象或推文的文本,但它并没有这样做。相反,它会单独打印每个字符。

我是不是处理错了,或者我需要做些什么才能从生成器对象中检索 Doc 对象,以便我可以使用 spaCy 属性进行词形还原等?

我认为您错误地使用了 nlp.pipe 命令。

nlp.pipe 用于并行化,这意味着它同时处理推文。因此,与其将一条推文作为参数提供给 nlp.pipe 命令,不如传递推文列表。

以下代码似乎可以实现您的目标:

import spacy
nlp = spacy.load('en')

tweets = ['This is a dummy tweet for stack overflow',
         'What do we do with generator objects?']
spacy_tweets = nlp.pipe(tweets, batch_size = 10, n_threads = 3)

for tweet in spacy_tweets:
    for token in tweet:
        print(token.text, token.pos_)

希望对您有所帮助!