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

时间:2018-10-14 01:09:55

标签: python-3.x nlp 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返回生成器对象。所以当我这样做时:

for tweet in spacy_tweets:
    print(tweet)

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

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

我希望它能在生成器中打印Doc对象或tweet的文本,但不会那样做。相反,它将单独打印每个字符。

我是否遇到这种错误,还是需要做些什么才能从生成器对象中检索Doc对象,以便可以使用spaCy属性进行定形等?

1 个答案:

答案 0 :(得分:1)

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

nlp.pipe用于并行化,这意味着它同时处理tweet。因此,您应该传递tweets列表,而不是给nlp.pipe命令一个单独的tweet作为参数。

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

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

希望有帮助!