BERTopic 带有多个人物的数据集

1yjd4xko  于 4个月前  发布在  其他
关注(0)|答案(9)|浏览(89)

你好,
我进行了一个焦点小组访谈,基本上是由研究人员带领的一次讨论,大约有6个人参与。
如何准备数据以便BERTopic进行分析?
如果我简单地将数据作为句子列表进行准备,而不指定谁说了什么,那么一些上下文信息将会丢失。
我无法找到一种方法来添加关于不同人的信息,在我的案例中,他们谈论的是同一个主题,或者更准确地说,他们是对一组问题的集体回答。
谢谢!

xtfmy6hx

xtfmy6hx1#

你好,MaartenGr,

感谢你的快速回答,我会尝试你的建议。

仍有一些不清楚的地方:数据集应该是什么样子的?
根据我从文档中理解的内容,数据集应该是字符串列表。但是我该如何将每个字符串关联到一个说话者?
是否有这样的数据集示例?
它应该看起来像这样吗:
docs = [
'Speaker 1: 这是我想告诉的一些事情',
'Speaker 2: 这是我想告诉的其他事情',
'Speaker 3: 这是我想告诉的其他事情'
]
等等?

mbzjlibv

mbzjlibv2#

如果你遵循我提到的第二种方法,那确实是你可以做到的。对于其他所有方法,我会建议你遵循文档和教程。

iqxoj9l9

iqxoj9l93#

关于.merge_models的建议,我有一个问题。在这种情况下,我应该为每个说话者准备不同的数据集(即使他们在同一个对话中说话和讨论)。
例如:

# 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])

这样有意义吗?
我没有尝试过,因为我不希望在没有效果的情况下花费时间准备数据。

mwngjboj

mwngjboj4#

是的,它确实看起来像那样。这样,您可以跟踪发言者之间的主题,并在需要时将它们合并。

kx5bkwkv

kx5bkwkv5#

感谢您的确认。
我打算在完成后发布我的程序和结果。

flseospp

flseospp6#

你好,
我尝试了MaartenGr建议的所有四个选项。了解BERTopic库对我来说很有帮助,我对这个库非常着迷,感谢伟大的工作!
到目前为止,我已经得到了一些有希望的结果,但我无法使用这四种策略中的任何一种获得令人满意的结果。
我根据BERTopic的文档和各种教程微调了不同的超参数,所有四种策略都使用相同的参数。
我希望这份报告能帮助大家了解我在做什么,并能就如何改进分类提出一些有建设性的评论。最终,我想分享我的最终结果,这样其他BERTopic用户也可以从这项工作中受益。
以下是我尝试和取得的成果:

  1. 半监督主题建模
    按照documentation的步骤,我处理了我的录音文本并创建了一个将每句话分配给一个说话者的列表。
    这里是scriptvisualization以及主题列表:
0                   -1_thank_change_context_performance
1                   0_sensation_soothing_proximity_skin
2                         1_sounds_technical_group_come
3                    2_point_thinking_don know_like don
4                       3_layer_tones_clear like_design
5               4_emotions_space yeah_distance_contexts
6               5_relationship_depth_like touching_work
7                     6_happy_following_leave_feel like
8                   7_understand_say yes_good_like fits
9                    8_wish_report_mentioned_situations
10                9_mean direction_useful_use like_real
11                      10_yeah think_reference_ve_word
12                        11_case_piano_randomness_risk
13           12_working_exploring_continuous like_jenny
14    13_sentire_helped_movement communication_perce...
15                         14_yeah yeah_ok_yeah ok_true
16         15_want stop_mistake_case actually_emotional
17         16_particularly liked_mental_dislike_extreme
18    17_far away_case actually_saying_actually mistake
19        18_reason_theoretically_unfortunately_problem
20       19_research_don experience_work imagine_mental
  1. 在说话者名字前加上前缀
    原始录音文本的每一行开头都有说话者的名字,所以我使用了未处理的文本数据。
    这里是scriptvisualization以及合并后的主题列表:
0               -1_don_connection_sprecher5 like_moment
1            0_sound sprecher3_sound like_change_bubbly
2                 1_like sprecher3_brain_lighter_easier
3                  2_yeah yeah_ok sprecher1_says_second
4                    3_touching_skin_relationship_scary
5            4_report_maybe_performance_specific moment
6               5_using_restriction_parameter_christina
7     6_space_neutralising_complexity sprecher2_comp...
8                            7_wish_possible_thing_belt
9               8_happy_following_later_sprecher3 think
10                      9_able_technical_know don_leave
11    10_joy_confusion_quite strong_frustration spre...
12        11_feeling like_everybody_idea_don experience
13    12_experience sprecher1_directly_experience re...
14    13_sprecher4 created_started_reaction_feeling ...
15    14_perceive_body sprecher1_experience sprecher...
  1. 合并模型
    按照documentation的步骤,我使用说话者的名字作为键,将那个说话者的句子作为值创建了一个字典。然后我在每个说话者的句子上运行BERTopic,并将它们全部合并在一起。
    这里是scriptvisualization以及合并后的主题列表:
    合并后的主题名称:
0       -1_frustration_personal issues_like know_moment
1                        0_body_sentire_movement_person
2               1_totally_understand_performance_remind
3                   2_wish_mentioned_specific_direction
4                       3_questions_try_time yeah_start
5                       4_good_yeah just_yeah case_true
6                5_change_sounds_correctly mean_certain
7                        6_today_telling_mental_explain
8                               7_stop_didn_leave_going
9                       8_got_asking_moment_interactive
10                         4_yeah think_think_wireless_
11                         5_want_people_question_jenny
12      5_like yeah_creates like_yeah imagine_yeah yeah
13                                        6_bing_make__
14                        7_different_quite_cause_weird
15                                            8_help___
16                           9_away_somebody_doing_time
17                       5_frame_round_nice_like longer
18    6_closer_know sound_reaction emotional_coincid...
19                7_dancing_people_placed_people placed
  1. 基于类别的主题建模
    按照documentation的步骤,我创建了一个将每句话分配给一个说话者的列表,并将其作为类别传递。
    这里是scriptvisualization以及主题列表:
0            -1_movement_frame_performance_different
1                   0_sounds_audible_soothing_inside
2                     1_yeah yeah_quick_clear_course
3              2_information_complexity_explore_able
4                  3_body_sentire_sensation_perceive
5         4_like touch_relationship_technology_shift
6                          5_idea_jam_like think_try
7     6_yeah think_possible_think kind_theoretically
8                    7_joy_enjoyed_don really_strong
9             8_computer_imagine use_practise_design
10               9_relation_ve_interact_feeling like
11                   10_bring_leave_christina_moving
12        11_far away_composing_situation yeah_robin
13        12_group_acknowledge_everybody_quite quite
14           13_bracelets_contemporary_contexts_idea
15                    14_didn_end_couple_wanted stop
16        15_randomness_word_extreme_specific moment
  1. 零样本主题建模
    我还尝试了zero shot strategy,因为我已经有了一些预定义的主题。
    这里是scriptvisualization以及主题列表:
get_topic_info Names:  
0                                          Sound
1                                          Touch
2                                        Feeling
3                                     Perception
4      -1_sprecher3_sprecher5_dancing_connection
5                0_sprecher3_create_risk_totally
6            1_sprecher3_explained_example_quick
7              2_sprecher2_sprecher5_frame_group
8        3_sprecher2_sprecher3_practise_creating
9     4_sprecher5_sprecher2_research_frustration
10          5_sprecher2_sprecher3_sprecher5_body

在所有策略中,我注意到了一些问题:

  • 有些词(如'change','context'和'performance')或'movement'出现在未分类的主题(-1)中,尽管它们可能是相关的主题——当然比其他有时被用于分类主题的工作(好吧,是的,真的,是的,不幸的是,实际名称)更相关。我怎么能防止这种情况发生?
  • 一些主题使用了不相关的词(好吧,是的,真的,是的,不幸的是),如何避免这种情况?
  • 在策略1、3和4中,说话者没有被考虑在分类中,为什么?在策略2中,说话者被包括在分类中,尽管它并不十分有用。
  • 我希望有两种分类方式:一种是按说话者分组主题,另一种是按采访分组主题。对于第二种情况(按采访分组主题),我认为我可以很好地利用策略1、3、4:这些结果必须加以改进,但它们已经足够好可以开始了。要按说话者分组主题,我想我可以像在策略3之前那样使用策略1、3或4并对其进行单独的运行。
wf82jlnq

wf82jlnq7#

一些词汇,如“变化”、“上下文”和“表现”或“运动”,最终出现在未分类的主题(-1)中,尽管它们可能是相关主题 - 当然比其他有时用于分类主题的作品更相关(好吧,是的,确实如此,不幸的是,实际名称)。我该如何防止这种情况?

-1表示的词汇仍然可能出现在其他主题中。-1并不意味着要解释它们,因为它们本质上只是随意组合在一起的文档。这些随机文档的子集仍可能是聚类,但总体上它们通常不是。

有些主题使用不相关的词汇(好吧,是的,确实如此,不幸的是),如何避免这种情况?

您可以使用KeyBERTInspiredMaximalMarginalRelevance来实现这一点。请参阅最佳实践:https://maartengr.github.io/BERTopic/getting_started/best_practices/best_practices.html

在策略1、3和4中,演讲者并未被考虑在分类中,为什么?在策略2中,演讲者被包含在分类中,尽管这并不是很有帮助。

许多策略仍然关注构建主题,然后观察演讲者如何以不同的方式讨论这些主题。因此,它并非关于实际的分类,而仅仅是表示。

vddsk6oq

vddsk6oq8#

一些词汇,如“变化”、“上下文”和“表现”或“运动”,尽管它们可能是相关主题,但最终出现在未分类的主题(-1)中。当然,与其他有时用于分类主题的作品相比,这些主题的相关性更高(好吧,是的,确实如此,不幸的是,这是实际名称)。我该如何防止这种情况?

-1表示的词汇仍然可能出现在其他主题中。-1并不意味着要解释它们,因为它们本质上只是随意组合在一起的文档。这些随机文档的子集仍可能是聚类,但总体上它们通常不是。

好的,谢谢你的解释。

有些主题使用不相关的词汇(好吧,是的,确实如此),如何避免这种情况?
你可以使用KeyBERTInspiredMaximalMarginalRelevance来实现这一点。请参阅最佳实践:https://maartengr.github.io/BERTopic/getting_started/best_practices/best_practices.html
我已经尝试了这两种策略,并从该页面中找到了示例。也许我需要尝试调整这些方法的参数。

在策略1、3和4中,说话者没有被考虑在分类中,为什么?在策略2中,说话者被包含在分类中,尽管这并没有太大帮助。
许多策略仍然关注构建主题,然后观察说话者如何就这些主题进行不同的讨论。所以它并不是关于实际的分类,而仅仅是表示。
好的,了解了。

fquxozlt

fquxozlt9#

有几种方法可以解决这个问题。首先,你可以使用 semi-supervised topic modeling 将用户的信息注入到主题中。其次,你也可以直接在文档前加上要嵌入的人的名字。第三,使用 .merge_models 可以为每个用户创建一个主题模型并将它们合并。第四,你可以使用 class-based topic modeling 来建模类别(用户)。
可能还有一些遗漏的地方,但正如你所看到的,有很多方法在某种程度上可以处理这样的分析。

相关问题