在 spacy 中保存并加载 NLP 结果

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

我想使用 SpaCy 分析许多小文本,并且我想存储 nlp 结果以供进一步使用以节省处理时间。我在 Storing and Loading spaCy Documents Containing Word Vectors 找到了代码,但出现错误,并且找不到如何修复它。我对 python 还很陌生。

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

Doc
Vocab
未定义。

任何修复此问题或其他方法以达到相同结果的想法都非常受欢迎。

谢谢!

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)
python spacy
3个回答
3
投票

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

请注意,

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

我所做的改变:

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

请注意,spacy 每种语言都有多个模型,通常您必须先下载它(通常是

sm
md
lg
模型)。阅读更多相关信息这里

代码:

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)

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


3
投票

执行此操作的有效方法是使用

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))

0
投票

很难得到答案,但我尝试了你的代码,它对 DocBins 不起作用。我在下面粘贴了导入部分的代码

import spacy
from spacy.tokens import DocBin
from LanguageIdentifier import predict

import fitz
import glob
import os

from datetime import datetime

import logging

#English-Accuracy: en_core_web_trf
#French-Accuracy: fr_dep_news_trf
#German-Accuracy: de_dep_news_trf
#Multi Language-Accuracy: xx_sent_ud_sm

#DocBins
FRdoc_bin = DocBin (store_user_data=True,attrs=['ENT_TYPE','LEMMA','LIKE_EMAIL','LIKE_URL','LIKE_NUM','ORTH','POS'])
ENdoc_bin = DocBin (store_user_data=True,attrs=['ENT_TYPE','LEMMA','LIKE_EMAIL','LIKE_URL','LIKE_NUM','ORTH','POS'])
DEdoc_bin = DocBin (store_user_data=True,attrs=['ENT_TYPE','LEMMA','LIKE_EMAIL','LIKE_URL','LIKE_NUM','ORTH','POS'])
MULTIdoc_bin = DocBin (store_user_data=True,attrs=['ENT_TYPE','LEMMA','LIKE_EMAIL','LIKE_URL','LIKE_NUM','ORTH','POS'])


#NLP modules
frNLP = spacy.load('fr_dep_news_trf')
enNLP = spacy.load('en_core_web_trf') 
deNLP = spacy.load('de_dep_news_trf')
multiNLP = spacy.load('xx_sent_ud_sm')

ErroredFiles =[]

def processNLP(text):
    
    lang = predict(text) 
    if 'fr' in lang:
        doc = frNLP(text)
        FRdoc_bin.add(doc)
        return
    elif 'de' in lang:
        DEdoc_bin.add(deNLP(text))
        return
    elif 'en' in lang:        
        ENdoc_bin.add(enNLP(text))
        return
    else:
        MULTIdoc_bin.add(multiNLP(text))
        return


def get_text_from_pdf(Path):
    text = ''
    content = fitz.open(Path)
    for page in content:
        if page.number == 1:
            text = page.get_text()[212:]
        else:
            text = text + page.get_text()
    return text


FolderPath = r'C:\[Redacted]\DataSource\*\*.pdf'
PDFfiles = glob.glob(FolderPath)
counter = 0

for file in PDFfiles:    
    counter = counter +1
    try:
        textPDF = get_text_from_pdf(file)
        processNLP(textPDF)
        
    except Exception as e:        
        ErroredFiles.append(file)
        logging.error('Error with file '+ file)
        logging.error('Error message: '+ str(e))
        MULTIdoc_bin.add(multiNLP(textPDF))
    
    if(counter == 10):  #For testing purposes only
        break


CreatedModelPath = r'C:\[Redacted]\Results' + datetime.strftime(datetime.now(),"%Y%m%d%H%M%S") 
os.mkdir(CreatedModelPath)

FRdoc_bin.to_disk(CreatedModelPath+r'\FRdocBin'+'.nlp')
FRdoc_bin.vocab.to_disk(CreatedModelPath+r'\FRdocBin'+'.voc')


ENdoc_bin.to_disk(CreatedModelPath+r'\ENdocBin'+'.nlp')
DEdoc_bin.to_disk(CreatedModelPath+r'\DEdocBin'+'.nlp')
MULTIdoc_bin.to_disk(CreatedModelPath+'\MULTIdocBin'+'.nlp')

我得到的错误:

Traceback (most recent call last):

  File "C:\[Redacted]\ProcessingEngine.py", line 117, in <module>
    FRdoc_bin.vocab.to_disk(CreatedModelPath+r'\FRdocBin'+'.voc')

AttributeError: 'DocBin' object has no attribute 'vocab'
© www.soinside.com 2019 - 2024. All rights reserved.