使用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
相关产品推荐
相关产品推荐

