在 spacy 中保存和加载 nlp 结果

Save and load nlp results in spacy

我想使用 SpaCy 分析许多小文本,我想存储 nlp 结果以供进一步使用以节省处理时间。我在 Storing and Loading spaCy Documents Containing Word Vectors 找到了代码,但出现错误,而且我找不到修复方法。我是 python.

的新手

在下面的代码中,我将 nlp 结果存储到一个文件中并尝试再次读取它。我可以写第一个文件,但找不到第二个文件 (vocab)。我还收到两个错误:未定义 DocVocab

我们欢迎任何修复此方法或其他方法以达到相同结果的想法。

谢谢!

import spacy
nlp = spacy.load('en_core_web_md')
doc = nlp("He eats a green apple")
for token in doc:
    print(token.text, token.lemma_, token.pos_, token.tag_, token.dep_,
            token.shape_, token.is_alpha, token.is_stop)

NLP_FName = "E:\SaveTest.nlp"
doc.to_disk(NLP_FName)
Vocab_FName = "E:\SaveTest.voc"
doc.vocab.to_disk(Vocab_FName)

#To read the data again:
idoc = Doc(Vocab()).from_disk(NLP_FName)
idoc.vocab.from_disk(Vocab_FName)

for token in idoc:
    print(token.text, token.lemma_, token.pos_, token.tag_, token.dep_,
            token.shape_, token.is_alpha, token.is_stop)

我试过你的代码,我在下面的代码中修复了一些小问题。

请注意,SaveTest.nlp 是一个包含您的文档信息的二进制文件,
SaveTest.voc 是一个包含所有 spacy 模型词汇信息(向量、字符串等)的文件夹。

我所做的更改:

  1. spacy.tokens
  2. 导入 Doc class
  3. spacy.vocab
  4. 导入 Vocab class
  5. 使用以下命令下载 en_core_web_md 模型:
python -m spacy download en_core_web_md

请注意,spacy 对于每种语言都有多个模型,通常您必须先下载它(通常是 smmdlg 模型)。阅读更多相关信息 here

代码:

import spacy
from spacy.tokens import Doc
from spacy.vocab import Vocab

nlp = spacy.load('en_core_web_md')
doc = nlp("He eats a green apple")
for token in doc:
    print(token.text, token.lemma_, token.pos_, token.tag_, token.dep_,
          token.shape_, token.is_alpha, token.is_stop)

NLP_FName = "E:\SaveTest.nlp"
doc.to_disk(NLP_FName)
Vocab_FName = "E:\SaveTest.voc"
doc.vocab.to_disk(Vocab_FName)

#To read the data again:
idoc = Doc(Vocab()).from_disk(NLP_FName)
idoc.vocab.from_disk(Vocab_FName)

for token in idoc:
    print(token.text, token.lemma_, token.pos_, token.tag_, token.dep_,
          token.shape_, token.is_alpha, token.is_stop)

让我知道这是否对您有帮助,如果没有,请将您的错误消息添加到您的原始问题中,以便我提供帮助。

执行此操作的有效方法是使用 DocBin 代替:https://spacy.io/usage/saving-loading#docs

改编自文档的示例(您可以使用 doc_bin.to/from_disk 而不是 to/from_bytes):

import spacy
from spacy.tokens import DocBin

doc_bin = DocBin()
texts = ["Some text", "Lots of texts...", "..."]
nlp = spacy.load("en_core_web_sm")
for doc in nlp.pipe(texts):
    doc_bin.add(doc)

bytes_data = doc_bin.to_bytes()

# Deserialize later, e.g. in a new process
nlp = spacy.blank("en")
doc_bin = DocBin().from_bytes(bytes_data)
docs = list(doc_bin.get_docs(nlp.vocab))