【问题标题】:How to merge spacy Vocab instances?如何合并spacy Vocab实例?
【发布时间】:2020-08-01 19:32:13
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: spacy


    【解决方案1】:

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

    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)
    

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

    【讨论】:

    • 谢谢。很久以前,我在 github 上为此创建了一个问题:github.com/explosion/spaCy/issues/4411 你认为那里显示的方法,通过多个 from_disk 加载将词汇合并到同一个词汇中的方法应该可以正常工作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2022-10-13
    • 2021-03-27
    • 1970-01-01
    • 2012-09-23
    • 2018-12-18
    • 2011-04-27
    相关资源
    最近更新 更多