Goal
我对使用 zero-shot topic modeling 拟合 BERTopic 模型很感兴趣。我希望文档可以被分配到多个建议的主题中。我已经修补了几个 BERTopic 函数,以便实现这一点,但想听听作者的意见,看看是否正确或有其他替代方案。
当前的实现在模型构建过程中基于指定的余弦相似度阈值将文档分配给最多一个建议的主题。如果特定文档的阈值达到要求,它将被分配给与其具有最高相似度的主题。
My Approach
我的第一个更改是 _zeroshot_topic_modeling
函数。我计算每个文档与超过指定阈值的主题之间的相似度。接下来,如果一个文档有多个匹配项,根据需要创建该文档(及其嵌入)的副本(保持副本在文档列表中的相邻位置)。因为这个函数无法访问我的文档之外的 BERTopic,所以我设置了一个示例变量,以便根据需要创建我的文档和嵌入的副本。
在 _combine_zeroshot_topics
步骤中,偶尔会出现合并后的主题被设置为 np.ndarray
而不是 list
的问题,这会导致后面出现问题。修复这个问题是我的第二个补丁。
接下来的步骤是 reduce_topics
。在这里,多个零样本主题实际上可能被合并,导致新主题有时会有重复的文档。我在 documents.Topic = new_topics
之前修补了 _reduce_to_n_topics
以删除基于我提供的外部文档 ID 通过示例变量在主题内部的重复文档。我只保留唯一的 (topic_id, external_document_ID)
对。那个带有外部文档 ID 的示例变量更新为一个(可能是)减少的 ID 列表,我在 BERTopic 之外使用它来更新我的文档和嵌入列表。
下一个步骤是 reduce_outliers
,其中 documents
是经过拟合后的扩展文档列表(可能有重复项)。我认为这里没有重复文档的风险,因为任何重新分类的离群值只复制了一份。
最后一个步骤是使用 update_topics
中的更新后的文档列表和主题 ID。因为没有主题的重新组织,我认为这里没有重复文档的风险。
在完成所有这些之后,我还有后处理过程来确定原始文档的每个主题列表。
Questions
考虑到我最初的目标,这种方法是否有明显的缺陷或改进的建议?我知道有一些与每个文档多个主题相关的 other methods,例如 Topic Distributions 或者在使用 transform
对我的文档进行拟合后对我的文档使用概率的方法,但我一直没有成功获得任何有用的分布,而且只有在拟合时才返回概率矩阵。
我想到的一个替代方案是在拟合后根据阈值和概率更新 topic_model.topics_
,相应地更新我的文档和嵌入,然后保留 reduce_topics
补丁以避免重复。这样做的好处是,一个文档不仅可以分配给建议的主题,还可以分配给那些来自聚类的主题。缺点是需要额外指定一个阈值。
大家有什么想法吗?
1条答案
按热度按时间ctrmrzij1#
一个非常有趣的解决问题的方法!感谢分享如此详尽的过程描述。
请记住我最初的目标,这种方法是否存在明显的缺陷,或者有什么改进的建议?我知道有一些与每个文档的多个主题相关的内容,例如 #814 或在完成所有步骤后转换我的文档所返回的概率,但我没有太多运气得到任何有用的分布,而且只有在拟合时才会返回概率矩阵。
有趣的是,我认为这可能比你的实现更容易解决。如果我没有弄错的话,你实际上是在文档和零样本主题之间运行余弦相似度,并在超过某个阈值时将单个文档分配给多个零样本主题。
虽然你的方法似乎有效,但如果你们能把 BERTopic 的
.fit
和.transform
看作是两个独立的过程会更容易:.fit
主要用于推导 主题表示。它旨在为主题创建合理的(不管那是什么意思)表示,其主要输出是这些表示,如标签和单词。.transform
与此相反,用于创建 主题分配 ,其中文档实际上被分配到各自的主题。只要你在
.fit
期间对 主题表示 满意,无论文档是否正确分配给一个或多个主题,都没有必要经过你的流程。相反,你需要主要关注 主题分配 ,使用类似.approximate_distribution
的方法,因为你提到这种方法不会给你一个有用的分布。我的第一个问题当然是为什么?既然它确实返回了一个概率矩阵,为什么不对你有用呢?既然它确实返回了一个概率矩阵,为什么不对你有用呢?
话虽如此,你也可以直接保存模型并加载模型。这样做的后果是底层的降维和聚类模型被移除。现在,每当你运行
.transform
时,它将使用主题和文档嵌入之间的余弦相似度生成与你手动创建的相同相似度矩阵。你可以使用该输出使用你为零样本主题建模指定的相同阈值将单个文档分配给多个主题。上述是一个隐藏的小技巧,我希望在未来几个月里有时间创建一个变量
.transform
,让你可以选择预测方法,例如:希望这有所帮助!