【问题标题】:How do I use generator objects in spaCy?如何在 spaCy 中使用生成器对象?
【发布时间】:2019-03-18 19:32:49
【问题描述】:

在这里第一次体验 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

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

for tweet in spacy_tweets:
    print(tweet)

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

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

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

我是在接近这个错误还是我需要做些什么才能从生成器对象中检索 Doc 对象,以便我可以使用 spaCy 属性进行词形还原等?

【问题讨论】:

  • 你能解释一下你所说的“文档对象”是什么意思吗?在我看来,您要么想访问对象的各个字段,要么只检索文本,对吧?

标签: python-3.x nlp spacy


【解决方案1】:

我认为您错误地使用了 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_)

希望对你有帮助!

【讨论】:

  • 这成功了!因此,如果我正确理解发生了什么,当我将单个文本样本传递给 nlp.pipe() 时,它会为每个文本返回一个生成器对象,当我通过循环传递该生成器时,它会打印每个字符。当我将文本样本列表传递给 nlp.pipe() 时,它会生成一个包含所有文本的生成器对象,当我循环它时,它会打印每个标记。现在似乎很明显,我正在输入它。感谢您的帮助!
猜你喜欢
  • 2019-10-18
  • 1970-01-01
  • 2019-11-07
  • 2022-07-04
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 2012-03-24
  • 2020-03-31
相关资源
最近更新 更多