首页 > 解决方案 > 如何合并spacy Vocab实例?

问题描述

当处理数以百万计的文档并将它们保存为空文档以备后用(更多处理、可视化、提取特征)时,一种明显的扩展解决方案是并行/分布式处理。这意味着每个并行进程都有自己的词汇,这些词汇可能会随着时间的推移而扩展。

保存文档时,显然不想将词汇与文档一起保存。所以 to_disk 可能是最好的选择。为了使用 from_disk 加载文档,我们需要一个词汇表,其中包含从处理文档时的时间点开始的所有内容,或者稍后以及来自正确过程的所有内容。

我认为保留多个词汇并在每个文档中存储该词汇的 id 有点丑陋和笨拙。一个更好的解决方案是在所有流程完成后从每个流程的最终词汇创建一个超级词汇。然后,该词汇可以与任何已处理的文档一起使用。

所以问题是:是否已经有一种方法可以将一堆词汇合并成一个包含所有这些词汇的词汇?

标签: spacy

解决方案


这是一个从一组词汇中创建一个新的“合并”词汇实例的函数:

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)

这还没有经过实战测试,但到目前为止它对我有用。


推荐阅读