Spacy - nlp.pipe() returns 生成器

Spacy - nlp.pipe() returns generator

我在 Python 中使用 Spacy for NLP。我正在尝试使用 nlp.pipe() 生成一个 Spacy 文档对象列表,然后我可以对其进行分析。奇怪的是,nlp.pipe() return 是 class <generator object pipe at 0x7f28640fefa0> 的对象。如何按预期将其添加到 return 文档列表?

import Spacy
nlp = spacy.load('en_depent_web_md', disable=['tagging', 'parser'])
matches = ['one', 'two', 'three']
docs = nlp.pipe(matches)
docs

要遍历文档,只需执行

for item in docs

或做

 list_of_docs = list(docs)

您只需添加


docs = list(nlp.pipe(matches))

nlp.pipe returns 故意的发电机! Generators 很棒。它们对内存更友好,因为它们允许您迭代一系列对象,但与列表不同的是,它们只在需要时评估下一个对象,而不是一次评估所有对象。

SpaCy 将把这些字符串变成稀疏矩阵,而且它们会很大。事实上,spaCy 将把这些字符串转换成 Doc 对象,它们是 honkin 的大 c 结构。如果你的语料库足够大,将它全部存储在一个变量中(例如,docs = nlp([doc for doc in matches]docs = list(nlp.pipe(matches))将是低效的,甚至是不可能的。如果您正在训练任何大量数据,这将不是一个好主意。

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

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

The official spaCy starter 在第 3 章中有一些关于缩放和性能的注释。