使用space ==2.3.0,我通过API提供响应,因此需要持久化管道和自定义令牌,以便在服务器关闭和备份时状态保持不变。我发现通过nlp.to_disk()或nlp.vocab.to_disk()(https://spacy.io/usage/saving-loading)字元没有被写出来,因此当我重新加载API服务器时,我的预测会改变。
的例子:
nlp = spacy.load("en_core_web_lg")
print(len(nlp.vocab)) # 478
nlp.vocab["add"]
print(len(nlp.vocab)) # 479
# save to disk
nlp.to_disk(dir)
# reload from disk
nlp = nlp.from_disk(dir)
print(len(nlp.vocab)) # 478 - 'add' is lost
我已经尝试了上面使用Vocab().to_disk()的目录相同,我得到了相同的结果。是否有一种方法可以将所有自定义词汇持久化到磁盘,以便在以后的状态下重新加载?
这是从v2.2到v2.3的更改,以改进模型大小和模型加载时间。这些词位文件主要包含大量易于派生的信息(is_alpha
,prefix
,suffix
等),并且需要大量的额外加载时间。
不可衍生的特征cluster
,norm
和prob
已被移动到单独的lookups
表中,因此它们与模型一起保存。唯一没有保留的不可导函数是is_stop
。
一般来说,最好将词汇表看作是处理过程中以前见过的字符串的缓存,而记号是否在词汇表中并不是特别有意义的信息。is_oov
的含义从"没有集群"变为"没有集群"。To "没有向量"
是的,在我的搜索中,我偶然发现在v2.3 (https://github.com/explosion/spaCy/pull/5238)中删除了lexeme .bin。
通过利用DocBin()并添加每个token Doc()对象,我能够绕过使用to_disk()方法而不让整个词汇表持久化。这可能不是最好的方法,但它是有效的。
标记化过程:
tokens = []
for tkn in nlp(text):
tokens.append(tkn)
持久化进程函数:
from spacy.tokens import DocBin
doc_bin = DocBin(attrs=["LEMMA", "ENT_IOB", "ENT_TYPE"], store_user_data=True)
unique_tokens = set(tokens)
for t in unique_tokens:
doc_bin.add(t.doc)
_directory = f"{directory}"
_bytes = doc_bin.to_bytes()
with open(_directory, "wb") as f:
f.write(_bytes)
加载持久化文件函数:
from pathlib import Path
nlp = spacy.load("en_core_web_lg")
_directory = f"{directory}"
doc_bin = DocBin(attrs=["LEMMA", "ENT_IOB", "ENT_TYPE"], store_user_data=True)
token_file = Path(_directory)
if not token_file.exists():
return nlp
else:
data = Path(_directory).read_bytes()
doc_bin = doc_bin.from_bytes(data)
_ = list(doc_bin.get_docs(nlp.vocab))
return nlp