我想使用 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)
我尝试了你的代码,遇到了一些小问题,我在下面的代码中修复了这些问题。
请注意,
SaveTest.nlp
是一个二进制文件,其中包含您的文档信息和SaveTest.voc
是一个包含所有 spacy 模型词汇信息(向量、字符串等)的文件夹。
我所做的改变:
Doc
导入
spacy.tokens
Vocab
导入
spacy.vocab
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)
请告诉我这是否对您有帮助,如果没有,请将您的错误消息添加到您原来的问题中,以便我可以提供帮助。
执行此操作的有效方法是使用
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))
很难得到答案,但我尝试了你的代码,它对 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'