spacy儲存和載入模型

xiaoxiaoqian0519發表於2021-01-01

儲存模型

儲存類別:Language,Doc,Vocab和StringStore等
儲存方法如下:

MethodExample
to_bytesdata = nlp.to_bytes()
from_bytesnlp.from_bytes(data)
to_disknlp.to_disk("/path")
from_disknlp.from_disk("/path")

序列化pipeline

可以分別處理不同的pipelines所對應的的不同的模型;

# serialize
byte_data = nlp.to_bytes()
lang = nlp.meta["lang"]
pipeline = nlp.meta["pipeline"]
#deserialize
nlp = spacy.blank(lang)
for pipe_name in pipeline:
	pipe = nlp.create_pipe(pipe_name)
	nlp.add_pipe(pipe)
nlp.from_bytes(bytes_data)

載入模型的流程:

  1. 載入模型提供的meta.json中包含的關於lang和pipeline的資訊;
  2. 初始化語言類,創造並且新增pipeline的元件;
  3. 載入二進位制data;

序列化Doc

處理大量的資料時,可能需要在機器之間來回傳遞分析結果,因此可以使用Doc.to_array或者使用DocBin類;

import spacy
from spacy.tokens import DocBin

doc_bin = DocBin(attrs=['LEMMA', 'ENT_IOB', 'ENT_TYPE'], store_user_data=True)
nlp = spacy.load("en_core_web_sm")
for doc in nlp.pipe(texts):
	doc_bin.add(doc)
bytes_data = doc_bin.to_bytes()

nlp = spacy.blank("en")
doc_bin = DocBin().from_bytes(bytes_data)
docs = list(doc_bin.get_docs(nlp.vocab))

使用Pickle

  • Pickle載入單個
import Pickle
doc = nlp(text)
doc_data = pickle.dumps(doc)
  • Pickle載入多個
import Pickle
doc1 = nlp(text1)
doc2 = nlp(text2)
doc_data = pickle.dumps([doc1,doc2])

載入、儲存、修改模型

載入新訓練

利用Language.to_disk()

nlp.to_disk('/path')

生成模型包

手動生成meta.json檔案:

{
	"name": "example_model",
	"lang": ,
	"version": 
	....
}

利用命令列生成package:

$ python -m spacy package /path

這樣就可以生成一個模型包

搭建模型包

搭建python包的方法:

$ python setup.py sdist

這樣就可以建立一個.tar.gz在目標路徑下/dist,然後再通過pipe install進行安裝:

$ pip install /path/...tar.gz

載入自定義的模型包

利用spacy.load()來載入模型:

nlp = spacy.load("/path/model")

如果想載入二進位制資料,需要創造Language類並且呼叫from_disk函式

nlp = spacy.blank("en").from_disk("/path/model")

相關文章