You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OCTIS运行CTM主题模型时BoW与上下文嵌入大小不一致报错如何解决

报错原因
  • CTM模型自带的预处理逻辑默认会自动过滤掉词袋(BoW)表示中词汇数为0的空文档,而OCTIS官方提供的BBC_news等四个预置数据集,预先生成的上下文嵌入是包含这些空文档的。模型过滤空文档后,BoW的样本量比预存嵌入的样本量少,二者长度不匹配就会触发该报错。
  • 你的代码存在冗余逻辑:同一个数据集下,每次更换主题数都重复加载数据集、重复触发模型预处理流程,多次重复处理可能出现索引错位,也会导致二者长度不匹配。
可行解决方法
  • 调整代码逻辑减少重复处理:同一个数据集只加载一次,预处理完成后复用该结果训练不同主题数的模型,避免重复处理导致的索引异常。
  • 关闭模型自动空文档过滤:实例化CTM时传入参数remove_empty_documents=False,关闭默认的空文档过滤逻辑,BoW不会被自动裁剪,就可以和预存的嵌入长度对齐。如果担心空文档影响模型效果,可以在加载数据集后手动同步过滤空文档和对应位置的嵌入,再传入模型训练。
  • 手动对齐样本长度:加载数据集后先遍历所有文档,筛选掉长度为0的空文档,同时删除对应索引位置的上下文嵌入,保证二者样本量严格一致后再传入模型。

修改后参考代码

import octis
from octis.dataset.dataset import Dataset
from octis.models.CTM import CTM

datasets = ['BBC_news', '20NewsGroup', 'DBLP','M10']
num_topics = [i for i in range(5,101,5)]
ALGORITHM = CTM

def create_topic_dict(algorithm):
    run_dict = dict()
    for data in datasets:
        # 同一个数据集仅加载一次
        dataset = Dataset()
        dataset.fetch_dataset(data)
        data_dict = dict()
        for top in num_topics:    
            # 关闭自动空文档过滤
            model = algorithm(num_topics=top, remove_empty_documents=False)
            trained_model = model.train_model(dataset)
            data_dict[top] = trained_model
        run_dict[data] = data_dict
    return run_dict

topic_dict = dict()

内容的提问来源于stack exchange,提问作者Emil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:18:02