spacy - 如何合并spacy Vocab实例?
问题描述
当处理数以百万计的文档并将它们保存为空文档以备后用(更多处理、可视化、提取特征)时,一种明显的扩展解决方案是并行/分布式处理。这意味着每个并行进程都有自己的词汇,这些词汇可能会随着时间的推移而扩展。
保存文档时,显然不想将词汇与文档一起保存。所以 to_disk 可能是最好的选择。为了使用 from_disk 加载文档,我们需要一个词汇表,其中包含从处理文档时的时间点开始的所有内容,或者稍后以及来自正确过程的所有内容。
我认为保留多个词汇并在每个文档中存储该词汇的 id 有点丑陋和笨拙。一个更好的解决方案是在所有流程完成后从每个流程的最终词汇创建一个超级词汇。然后,该词汇可以与任何已处理的文档一起使用。
所以问题是:是否已经有一种方法可以将一堆词汇合并成一个包含所有这些词汇的词汇?
解决方案
这是一个从一组词汇中创建一个新的“合并”词汇实例的函数:
import spacy
def merge_vocabs(*vocabs):
merged = spacy.vocab.Vocab()
# Inherit some attributes from the first vocab
# This assumes they are the same across vocabs
merged.lex_attr_getters = vocabs[0].lex_attr_getters
merged.morphology = vocabs[0].morphology
merged.lookups = vocabs[0].lookups
merged.lookups_extra = vocabs[0].lookups_extra
# Copy strings and vectors from all vocabs to merged
for vocab in vocabs:
for string in vocab.strings:
string_id = merged.strings.add(string)
try:
# Copy vector if exists
vector = vocab.vectors[string_id]
merged.set_vector(string_id, vector)
except KeyError:
pass
return merged
vocab = merge_vocabs(vocab1, vocab2)
这还没有经过实战测试,但到目前为止它对我有用。
推荐阅读
- c++ - 在 Linux 中通过串行端口进行通信很困难
- java - 为嵌套关系配置多段 @RepositoryRestResource 路径
- python - 拆分包含许多时间步长的 CSV 行
- python - SymPy 符号函数采用多个参数
- javascript - 在 create-react-app --template typescript 之后 TypeScript React 应用程序未呈现
- c# - 如果在堆栈展开期间抛出异常会发生什么?
- java - Java CertificateFactory.generateCertPath(inputStream) 未按预期工作
- typescript - 离子 | “TypeError: this.platform.is 不是运行单元测试时的函数
- java - 范围和访问权限问题
- html - HTML contenteditable 属性是否需要 =true 才能工作?为什么即使它不是布尔属性,它也能在没有它的情况下工作?