代码之家  ›  专栏  ›  技术社区  ›  Oct

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

  •  2
  • Oct  · 技术社区  · 6 年前

    在这里,我加载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对象或tweet的文本,但它没有这样做。取而代之的是,它单独打印每个字符。

    1 回复  |  直到 6 年前
        1
  •  1
  •   gdaras    6 年前

    管道用于并行化,这意味着它同时处理tweet。因此,您应该传递tweets列表,而不是将单个tweet作为参数传递给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_)
    

    希望有帮助!