# each dataset is made of a list of sentences spoken by one person
speaker_1 = pd.read_csv("fg_01_speaker_1.csv")
speaker_2 = pd.read_csv("fg_01_speaker_2.csv")
speaker_3 = pd.read_csv("fg_01_speaker_3.csv")
# Create topic models
umap_model = UMAP(n_neighbors=15, n_components=5, min_dist=0.0, metric='cosine', random_state=42)
topic_model_1 = BERTopic(umap_model=umap_model, min_topic_size=20).fit(speaker_1)
topic_model_2 = BERTopic(umap_model=umap_model, min_topic_size=20).fit(speaker_2)
topic_model_3 = BERTopic(umap_model=umap_model, min_topic_size=20).fit(speaker_3)
# Combine all models into one
merged_model = BERTopic.merge_models([topic_model_1, topic_model_2, topic_model_3])
9条答案
按热度按时间xtfmy6hx1#
你好,MaartenGr,
感谢你的快速回答,我会尝试你的建议。
仍有一些不清楚的地方:数据集应该是什么样子的?
根据我从文档中理解的内容,数据集应该是字符串列表。但是我该如何将每个字符串关联到一个说话者?
是否有这样的数据集示例?
它应该看起来像这样吗:
docs = [
'Speaker 1: 这是我想告诉的一些事情',
'Speaker 2: 这是我想告诉的其他事情',
'Speaker 3: 这是我想告诉的其他事情'
]
等等?
mbzjlibv2#
如果你遵循我提到的第二种方法,那确实是你可以做到的。对于其他所有方法,我会建议你遵循文档和教程。
iqxoj9l93#
关于
.merge_models
的建议,我有一个问题。在这种情况下,我应该为每个说话者准备不同的数据集(即使他们在同一个对话中说话和讨论)。例如:
这样有意义吗?
我没有尝试过,因为我不希望在没有效果的情况下花费时间准备数据。
mwngjboj4#
是的,它确实看起来像那样。这样,您可以跟踪发言者之间的主题,并在需要时将它们合并。
kx5bkwkv5#
感谢您的确认。
我打算在完成后发布我的程序和结果。
flseospp6#
你好,
我尝试了MaartenGr建议的所有四个选项。了解BERTopic库对我来说很有帮助,我对这个库非常着迷,感谢伟大的工作!
到目前为止,我已经得到了一些有希望的结果,但我无法使用这四种策略中的任何一种获得令人满意的结果。
我根据BERTopic的文档和各种教程微调了不同的超参数,所有四种策略都使用相同的参数。
我希望这份报告能帮助大家了解我在做什么,并能就如何改进分类提出一些有建设性的评论。最终,我想分享我的最终结果,这样其他BERTopic用户也可以从这项工作中受益。
以下是我尝试和取得的成果:
按照documentation的步骤,我处理了我的录音文本并创建了一个将每句话分配给一个说话者的列表。
这里是script和visualization以及主题列表:
原始录音文本的每一行开头都有说话者的名字,所以我使用了未处理的文本数据。
这里是script、visualization以及合并后的主题列表:
按照documentation的步骤,我使用说话者的名字作为键,将那个说话者的句子作为值创建了一个字典。然后我在每个说话者的句子上运行BERTopic,并将它们全部合并在一起。
这里是script、visualization以及合并后的主题列表:
合并后的主题名称:
按照documentation的步骤,我创建了一个将每句话分配给一个说话者的列表,并将其作为类别传递。
这里是script、visualization以及主题列表:
我还尝试了zero shot strategy,因为我已经有了一些预定义的主题。
这里是script、visualization以及主题列表:
在所有策略中,我注意到了一些问题:
wf82jlnq7#
一些词汇,如“变化”、“上下文”和“表现”或“运动”,最终出现在未分类的主题(-1)中,尽管它们可能是相关主题 - 当然比其他有时用于分类主题的作品更相关(好吧,是的,确实如此,不幸的是,实际名称)。我该如何防止这种情况?
-1表示的词汇仍然可能出现在其他主题中。-1并不意味着要解释它们,因为它们本质上只是随意组合在一起的文档。这些随机文档的子集仍可能是聚类,但总体上它们通常不是。
有些主题使用不相关的词汇(好吧,是的,确实如此,不幸的是),如何避免这种情况?
您可以使用
KeyBERTInspired
或MaximalMarginalRelevance
来实现这一点。请参阅最佳实践:https://maartengr.github.io/BERTopic/getting_started/best_practices/best_practices.html在策略1、3和4中,演讲者并未被考虑在分类中,为什么?在策略2中,演讲者被包含在分类中,尽管这并不是很有帮助。
许多策略仍然关注构建主题,然后观察演讲者如何以不同的方式讨论这些主题。因此,它并非关于实际的分类,而仅仅是表示。
vddsk6oq8#
一些词汇,如“变化”、“上下文”和“表现”或“运动”,尽管它们可能是相关主题,但最终出现在未分类的主题(-1)中。当然,与其他有时用于分类主题的作品相比,这些主题的相关性更高(好吧,是的,确实如此,不幸的是,这是实际名称)。我该如何防止这种情况?
-1表示的词汇仍然可能出现在其他主题中。-1并不意味着要解释它们,因为它们本质上只是随意组合在一起的文档。这些随机文档的子集仍可能是聚类,但总体上它们通常不是。
好的,谢谢你的解释。
有些主题使用不相关的词汇(好吧,是的,确实如此),如何避免这种情况?
你可以使用
KeyBERTInspired
或MaximalMarginalRelevance
来实现这一点。请参阅最佳实践:https://maartengr.github.io/BERTopic/getting_started/best_practices/best_practices.html我已经尝试了这两种策略,并从该页面中找到了示例。也许我需要尝试调整这些方法的参数。
在策略1、3和4中,说话者没有被考虑在分类中,为什么?在策略2中,说话者被包含在分类中,尽管这并没有太大帮助。
许多策略仍然关注构建主题,然后观察说话者如何就这些主题进行不同的讨论。所以它并不是关于实际的分类,而仅仅是表示。
好的,了解了。
fquxozlt9#
有几种方法可以解决这个问题。首先,你可以使用 semi-supervised topic modeling 将用户的信息注入到主题中。其次,你也可以直接在文档前加上要嵌入的人的名字。第三,使用
.merge_models
可以为每个用户创建一个主题模型并将它们合并。第四,你可以使用 class-based topic modeling 来建模类别(用户)。可能还有一些遗漏的地方,但正如你所看到的,有很多方法在某种程度上可以处理这样的分析。