在这里有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属性进行定形等?
答案 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_)
希望有帮助!