nlp - 将多个 spacy textcat_multilabel 模型组合成一个 textcat_multilabel 模型

问题:我有数百万条记录需要使用一堆 spacy textcat_multilabel 模型进行转换。

// sudo code 

for model in models:
    nlp = spacy.load(model)
    for groups_of_records in records: // millions of records
        new_data = nlp.pipe(groups_of_records) // data is getting processed bulk
        // process data 
        bulk_create_records(new_data)

我当前的循环如下:

  1. 加载模型
  2. 使用模型循环记录/转换数据/保存

可以想象,我处理的记录越多,包含的模型越多,整个过程所需的时间就越长。这个想法是制作一个模型,只处理我的数据一次,而不是 (n * num_of_models)

问题:有没有办法将多个从同一个 spacy 配置创建的 textcat_multilabel 模型组合成一个 textcat_multilabel 模型?

回答1

仅组合模型没有基本功能,但有几种方法可以做到这一点。

一种是将所有组件源到同一个 pipeline 中。这很容易做到,请参阅 https://github.com/explosion/projects/tree/v3/tutorials/ner_double 示例。缺点是这可能不会为您节省太多处理时间,因为单独训练的模型仍然有自己的 tok2vec 层。

您可以结合您的训练数据并训练一个大模型。但是,如果您的模型实际上是分开的,那几乎肯定会导致准确性降低。

如果速度是首要考虑因素,您可以在冻结 tok2vec 的同时分别训练每个文本猫。这将导致准确性降低,尽管可能还不错,并且它允许您将 textcat 模型组合在同一个 pipeline 中,同时删除一堆 tok2vec 处理。 (这可能是我列出的在实现复杂性、速度优势和牺牲精度之间取得最佳平衡的方法。)

我认为尚未经过测试的一件事是,您可以尝试通过手动为配置中的每个组件指定标签来使用单独的标签集同时训练单独的 textcat 模型。我不完全确定这会奏效,但你可以试试。

相似文章