Spacy - nlp.pipe() 返回生成器

问题描述 投票:0回答:3

我在 Python 中使用 Spacy 进行 NLP。我正在尝试使用

nlp.pipe()
生成 Spacy 文档对象列表,然后我可以对其进行分析。奇怪的是,
nlp.pipe()
返回类
<generator object pipe at 0x7f28640fefa0>
的对象。我怎样才能让它按预期返回文档列表?

import Spacy
nlp = spacy.load('en_depent_web_md', disable=['tagging', 'parser'])
matches = ['one', 'two', 'three']
docs = nlp.pipe(matches)
docs
python nlp spacy
3个回答
12
投票

要迭代文档,只需执行

for item in docs

或者做

 list_of_docs = list(docs)

7
投票

nlp.pipe 故意返回一个生成器! 发电机非常棒。它们对内存更友好,因为它们允许您迭代一系列对象,但与列表不同,它们仅在需要时评估下一个对象,而不是一次全部评估。

SpaCy 会将这些字符串变成稀疏矩阵,而且它们会很大。事实上,spaCy 会将这些字符串转换为 Doc 对象,这些对象是大型 C 结构。如果你的语料库足够大,将其全部存储在一个变量中(例如,

docs = nlp([doc for doc in matches]
docs = list(nlp.pipe(matches)
)将是低效的,甚至是不可能的。如果您正在对大量数据进行训练,那么这不是一个好主意。

即使这实际上并非不可能,如果您使用生成器作为管道的一部分而不是仅仅将其转储到列表中,您可以更快地完成很酷的事情。如果您只想提取某些信息,例如,创建仅包含命名实体或数据中的地名的数据库列,则不需要将整个内容存储在列表中,然后执行嵌套for 循环将它们取出。

此外,Doc.spans 项(以及许多其他项)是生成器。类似类型的数据类型也出现在 gensim 中——NLP 的一半挑战是弄清楚如何以可扩展的方式完成这些工作,因此值得习惯更高效的容器。 (另外,您可以用它们做更酷的事情!)

官方 spaCy starter 在第 3 章中有一些关于扩展和性能的注释。


0
投票

您只需添加即可

docs = list(nlp.pipe(matches))
© www.soinside.com 2019 - 2024. All rights reserved.