BERTopic与Hugging Face Hub集成介绍
我们很高兴地宣布BERTopic Python库的重大更新,扩展了其功能,并进一步简化了主题建模爱好者和实践者的工作流程。BERTopic现在支持直接将训练好的主题模型推送到Hugging Face Hub,并从中拉取。这项新集成开启了轻松利用BERTopic在生产用例中强大功能的新可能性。
什么是主题建模?
主题建模是一种可以帮助发现一组文档中隐藏主题的方法。通过分析文档中的词语,我们可以找到模式和联系,从而揭示这些潜在主题。例如,一篇关于机器学习的文档更有可能使用“梯度”和“嵌入”等词语,而不是一篇关于烘焙面包的文档。
每篇文档通常以不同比例涵盖多个主题。通过检查词语统计数据,我们可以识别代表这些主题的相关词语簇。这使我们能够分析一组文档并确定它们所讨论的主题,以及每篇文档中主题的平衡。最近,新的主题建模方法已经超越了使用词语,转而使用更丰富的表示形式,例如通过基于Transformer的模型提供的表示形式。
什么是BERTopic?
BERTopic是一个最先进的Python库,它使用各种嵌入技术和c-TF-IDF来简化主题建模过程,从而创建密集的聚类,实现易于解释的主题,同时保留主题描述中的重要词语。
BERTopic库概述
虽然BERTopic易于上手,但它支持一系列高级主题建模方法,包括引导式、监督式、半监督式和手动主题建模。最近,BERTopic增加了对多模态主题模型的支持。BERTopic还拥有一套丰富的工具,用于生成可视化。
BERTopic为用户提供了一个强大的工具,可以在文本集合中发现重要主题,从而获得有价值的见解。借助BERTopic,用户可以轻松分析客户评论、探索研究论文或对新闻文章进行分类,使其成为任何希望从文本数据中提取有意义信息的人的必备工具。
使用Hugging Face Hub进行BERTopic模型管理
通过最新集成,BERTopic用户可以无缝地将训练好的主题模型推送到Hugging Face Hub并从中拉取。这项集成标志着简化BERTopic模型在不同环境中的部署和管理的一个重要里程碑。
训练BERTopic模型并将其推送到Hub只需几行代码即可完成
from bertopic import BERTopic
topic_model = BERTopic("english")
topics, probs = topic_model.fit_transform(docs)
topic_model.push_to_hf_hub('davanstrien/transformers_issues_topics')
然后,您可以用两行代码加载此模型,并将其用于对新数据进行预测。
from bertopic import BERTopic
topic_model = BERTopic.load("davanstrien/transformers_issues_topics")
通过利用Hugging Face Hub的强大功能,BERTopic用户可以轻松共享、版本控制和协作其主题模型。Hub充当中央存储库,允许用户存储和组织其模型,从而更容易地在生产中部署模型,与同事共享,甚至向更广泛的NLP社区展示。
您可以使用Hub上的libraries
过滤器来查找BERTopic模型。
一旦您找到了您感兴趣的BERTopic模型,您可以使用Hub推理小部件来试用该模型,看看它是否适合您的用例。
训练好主题模型后,您可以通过一行代码将其推送到Hugging Face Hub。将模型推送到Hub会自动为您的模型创建一个初始模型卡,其中包括主题概述。下面您可以看到一个基于ArXiv数据训练的模型所产生主题的示例。
点击此处查看所有主题概述。
主题ID | 主题关键词 | 主题频率 | 标签 |
---|---|---|---|
-1 | 语言 - 模型 - 模型 - 数据 - 基于 | 20 | -1_language_models_model_data |
0 | 对话 - 对话 - 回复 - 回复 - 意图 | 14247 | 0_dialogue_dialog_response_responses |
1 | 语音 - 自动语音识别 - 语音识别 - 识别 - 结束 | 1833 | 1_speech_asr_speech recognition_recognition |
2 | 微调 - 任务 - 提示 - 模型 - 语言 | 1369 | 2_tuning_tasks_prompt_models |
3 | 摘要 - 摘要 - 摘要 - 抽象 - 文档 | 1109 | 3_summarization_summaries_summary_abstractive |
4 | 问题 - 回答 - 问答 - 回答 - 问答 | 893 | 4_question_answer_qa_answering |
5 | 情感 - 情感分析 - 方面 - 分析 - 观点 | 837 | 5_sentiment_sentiment analysis_aspect_analysis |
6 | 临床 - 医疗 - 生物医学 - 笔记 - 患者 | 691 | 6_clinical_medical_biomedical_notes |
7 | 翻译 - 神经机器翻译 - 机器翻译 - 神经机器 - 神经机器翻译 | 586 | 7_translation_nmt_machine translation_neural machine |
8 | 生成 - 文本生成 - 文本 - 语言生成 - 自然语言生成 | 558 | 8_generation_text generation_text_language generation |
9 | 仇恨 - 仇恨言论 - 冒犯性 - 言论 - 检测 | 484 | 9_hate_hate speech_offensive_speech |
10 | 新闻 - 虚假 - 虚假新闻 - 立场 - 事实 | 455 | 10_news_fake_fake news_stance |
11 | 关系 - 关系提取 - 提取 - 关系 - 实体 | 450 | 11_relation_relation extraction_extraction_relations |
12 | 命名实体识别 - 命名 - 命名实体 - 实体 - 命名实体识别 | 376 | 12_ner_named_named entity_entity |
13 | 解析 - 解析器 - 依赖 - 语料库 - 解析器 | 370 | 13_parsing_parser_dependency_treebank |
14 | 事件 - 时间 - 事件 - 事件提取 - 提取 | 314 | 14_event_temporal_events_event extraction |
15 | 情感 - 情感 - 多模态 - 情感识别 - 情感的 | 300 | 15_emotion_emotions_multimodal_emotion recognition |
16 | 词 - 嵌入 - 词嵌入 - 嵌入 - 词 | 292 | 16_word_embeddings_word embeddings_embedding |
17 | 解释 - 解释 - 理由 - 理由 - 可解释性 | 212 | 17_explanations_explanation_rationales_rationale |
18 | 形态学 - 阿拉伯语 - 形态学 - 语言 - 屈折变化 | 204 | 18_morphological_arabic_morphology_languages |
19 | 主题 - 主题 - 主题模型 - 潜在狄利克雷分配 - 主题建模 | 200 | 19_topic_topics_topic models_lda |
20 | 偏见 - 性别 - 偏见 - 性别偏见 - 去偏见 | 195 | 20_bias_gender_biases_gender bias |
21 | 定律 - 频率 - 齐夫 - 词 - 长度 | 185 | 21_law_frequency_zipf_words |
22 | 法律 - 法院 - 法律 - 法律领域 - 案件 | 182 | 22_legal_court_law_legal domain |
23 | 对抗 - 攻击 - 攻击 - 对抗性示例 - 鲁棒性 | 181 | 23_adversarial_attacks_attack_adversarial examples |
24 | 常识 - 常识知识 - 推理 - 知识 - 常识推理 | 180 | 24_commonsense_commonsense knowledge_reasoning_knowledge |
25 | 量子 - 语义 - 微积分 - 组合 - 意义 | 171 | 25_quantum_semantics_calculus_compositional |
26 | 纠正 - 错误 - 错误纠正 - 语法 - 语法错误 | 161 | 26_correction_error_error correction_grammatical |
27 | 论证 - 论证 - 论证 - 论证性 - 挖掘 | 160 | 27_argument_arguments_argumentation_argumentative |
28 | 讽刺 - 幽默 - 讽刺的 - 检测 - 幽默的 | 157 | 28_sarcasm_humor_sarcastic_detection |
29 | 共指 - 消解 - 共指消解 - 提及 - 提及 | 156 | 29_coreference_resolution_coreference resolution_mentions |
30 | 词义 - 词义 - 词义消歧 - 词 - 消歧 | 153 | 30_sense_word sense_wsd_word |
31 | 知识 - 知识图谱 - 图谱 - 链接预测 - 实体 | 149 | 31_knowledge_knowledge graph_graph_link prediction |
32 | 解析 - 语义解析 - 抽象语义表示 - 语义 - 解析器 | 146 | 32_parsing_semantic parsing_amr_semantic |
33 | 跨语言 - 语言 - 跨 - 迁移 - 语言 | 146 | 33_cross lingual_lingual_cross_transfer |
34 | 机器翻译 - 翻译 - 质量评估 - 质量 - 机器翻译 | 139 | 34_mt_translation_qe_quality |
35 | SQL - 文本SQL - 查询 - Spider - 模式 | 138 | 35_sql_text sql_queries_spider |
36 | 分类 - 文本分类 - 标签 - 文本 - 标签 | 136 | 36_classification_text classification_label_text |
37 | 风格 - 风格迁移 - 迁移 - 文本风格 - 文本风格迁移 | 136 | 37_style_style transfer_transfer_text style |
38 | 问题 - 问题生成 - 问题 - 回答 - 生成 | 129 | 38_question_question generation_questions_answer |
39 | 作者身份 - 作者身份归属 - 归属 - 作者 - 作者 | 127 | 39_authorship_authorship attribution_attribution_author |
40 | 句子 - 句子嵌入 - 相似性 - 语义文本相似度 - 句子嵌入 | 123 | 40_sentence_sentence embeddings_similarity_sts |
41 | 代码 - 识别 - 切换 - 代码切换 - 代码切换 | 121 | 41_code_identification_switching_cs |
42 | 故事 - 故事 - 故事生成 - 生成 - 讲故事 | 118 | 42_story_stories_story generation_generation |
43 | 篇章 - 篇章关系 - 篇章关系 - 修辞结构理论 - 篇章解析 | 117 | 43_discourse_discourse relation_discourse relations_rst |
44 | 代码 - 编程 - 源代码 - 代码生成 - 编程语言 | 117 | 44_code_programming_source code_code generation |
45 | 释义 - 释义 - 释义生成 - 释义 - 生成 | 114 | 45_paraphrase_paraphrases_paraphrase generation_paraphrasing |
46 | 代理 - 游戏 - 环境 - 指令 - 代理 | 111 | 46_agent_games_environment_instructions |
47 | 新冠 - 新冠19 - 19 - 推文 - 流行病 | 108 | 47_covid_covid 19_19_tweets |
48 | 链接 - 实体链接 - 实体 - 实体链接 - 实体 | 107 | 48_linking_entity linking_entity_el |
49 | 诗歌 - 诗歌 - 歌词 - 诗歌 - 音乐 | 103 | 49_poetry_poems_lyrics_poem |
50 | 图像 - 字幕 - 字幕 - 视觉 - 字幕 | 100 | 50_image_captioning_captions_visual |
51 | 自然语言推理 - 蕴含 - 推理 - 自然语言推理 - 语言推理 | 96 | 51_nli_entailment_inference_natural language inference |
52 | 关键词 - 关键词 - 提取 - 文档 - 短语 | 95 | 52_keyphrase_keyphrases_extraction_document |
53 | 简化 - 文本简化 - 文本简化 - 句子 - 简化 | 95 | 53_simplification_text simplification_ts_sentence |
54 | 同理心 - 情感 - 情感的 - 同情 - 情感 | 95 | 54_empathetic_emotion_emotional_empathy |
55 | 抑郁症 - 心理 - 健康 - 心理健康 - 社交媒体 | 93 | 55_depression_mental_health_mental health |
56 | 分词 - 词分词 - 中文 - 中文分词 - 中文词 | 93 | 56_segmentation_word segmentation_chinese_chinese word segmentation |
57 | 引用 - 科学 - 论文 - 引用 - 学术 | 85 | 57_citation_scientific_papers_citations |
58 | 一致性 - 句法 - 动词 - 语法 - 主谓一致 | 85 | 58_agreement_syntactic_verb_grammatical |
59 | 隐喻 - 字面 - 比喻 - 隐喻 - 习语 | 83 | 59_metaphor_literal_figurative_metaphors |
60 | 语义角色标注 - 语义角色 - 角色标注 - 语义角色标注 - 角色 | 82 | 60_srl_semantic role_role labeling_semantic role labeling |
61 | 隐私 - 私人 - 联邦式 - 隐私保护 - 联邦学习 | 82 | 61_privacy_private_federated_privacy preserving |
62 | 变化 - 语义变化 - 时间 - 语义 - 词汇语义 | 82 | 62_change_semantic change_time_semantic |
63 | 双语 - 语言 - 跨语言 - 跨 - 嵌入 | 80 | 63_bilingual_lingual_cross lingual_cross |
64 | 政治 - 媒体 - 新闻 - 偏见 - 文章 | 77 | 64_political_media_news_bias |
65 | 医疗 - 问答 - 问题 - 问题 - 临床 | 75 | 65_medical_qa_question_questions |
66 | 数学 - 数学 - 数学词 - 应用题 - 问题 | 73 | 66_math_mathematical_math word_word problems |
67 | 金融 - 股票 - 市场 - 价格 - 新闻 | 69 | 67_financial_stock_market_price |
68 | 表格 - 表格 - 表格化 - 推理 - 问答 | 69 | 68_table_tables_tabular_reasoning |
69 | 可读性 - 复杂性 - 评估 - 特征 - 阅读 | 65 | 69_readability_complexity_assessment_features |
70 | 布局 - 文档 - 文档 - 文档理解 - 提取 | 64 | 70_layout_document_documents_document understanding |
71 | 大脑 - 认知 - 阅读 - 句法 - 语言 | 62 | 71_brain_cognitive_reading_syntactic |
72 | 手语 - 词汇 - 语言 - 手语 - 语言翻译 | 61 | 72_sign_gloss_language_signed |
73 | 视觉问答 - 视觉 - 视觉问题 - 视觉问答 - 问题 | 59 | 73_vqa_visual_visual question_visual question answering |
74 | 有偏见的 - 偏见 - 虚假的 - 自然语言处理 - 去偏见 | 57 | 74_biased_biases_spurious_nlp |
75 | 视觉 - 对话 - 多模态 - 图像 - 对话 | 55 | 75_visual_dialogue_multimodal_image |
76 | 翻译 - 机器翻译 - 机器 - 统计机器翻译 - 统计 | 54 | 76_translation_machine translation_machine_smt |
77 | 多模态 - 视觉 - 图像 - 翻译 - 机器翻译 | 52 | 77_multimodal_visual_image_translation |
78 | 地理 - 位置 - 地理定位 - 地理 - 位置 | 51 | 78_geographic_location_geolocation_geo |
79 | 推理 - 提示 - 大型语言模型 - 思维链 - 链 | 48 | 79_reasoning_prompting_llms_chain thought |
80 | 论文 - 评分 - 自动论文评分 - 论文评分 - 论文 | 45 | 80_essay_scoring_aes_essay scoring |
81 | 危机 - 灾难 - 交通 - 推文 - 灾难 | 45 | 81_crisis_disaster_traffic_tweets |
82 | 图谱 - 文本分类 - 文本 - 图卷积网络 - 分类 | 44 | 82_graph_text classification_text_gcn |
83 | 标注 - 工具 - 语言 - 资源 - XML | 43 | 83_annotation_tools_linguistic_resources |
84 | 实体对齐 - 对齐 - 知识图谱 - 实体 - 实体对齐 | 43 | 84_entity alignment_alignment_kgs_entity |
85 | 个性 - 特征 - 个性特征 - 评价性 - 文本 | 42 | 85_personality_traits_personality traits_evaluative |
86 | 阿尔茨海默病 - 阿尔茨海默病 - 阿尔茨海默病 - 疾病 - 语音 | 40 | 86_ad_alzheimer_alzheimer disease_disease |
87 | 分类学 - 上义词 - 分类学 - 上义词 - 上义词 | 39 | 87_taxonomy_hypernymy_taxonomies_hypernym |
88 | 主动学习 - 主动 - 主动学习 - 学习 - 不确定性 | 37 | 88_active learning_active_al_learning |
89 | 评论 - 摘要 - 摘要 - 评论 - 观点 | 36 | 89_reviews_summaries_summarization_review |
90 | 表情符号 - 表情符号 - 情感 - 消息 - 匿名 | 35 | 90_emoji_emojis_sentiment_message |
91 | 表格 - 表格文本 - 表格 - 表格文本生成 - 文本生成 | 35 | 91_table_table text_tables_table text generation |
92 | 领域 - 领域适应 - 适应 - 领域 - 来源 | 35 | 92_domain_domain adaptation_adaptation_domains |
93 | 对齐 - 词对齐 - 平行 - 对 - 对齐 | 34 | 93_alignment_word alignment_parallel_pairs |
94 | 印欧语系 - 语言 - 印欧语系 - 名称 - 家族 | 34 | 94_indo_languages_indo european_names |
95 | 专利 - 权利要求 - 权利要求生成 - 化学 - 技术 | 32 | 95_patent_claim_claim generation_chemical |
96 | 代理 - 涌现 - 通信 - 指称 - 游戏 | 32 | 96_agents_emergent_communication_referential |
97 | 图谱 - 抽象语义表示 - 图谱文本 - 图谱 - 文本生成 | 31 | 97_graph_amr_graph text_graphs |
98 | 道德 - 伦理 - 规范 - 价值观 - 社会 | 29 | 98_moral_ethical_norms_values |
99 | 首字母缩写 - 首字母缩写 - 缩写 - 缩写 - 消歧 | 27 | 99_acronym_acronyms_abbreviations_abbreviation |
100 | 类型化 - 实体类型化 - 实体 - 类型 - 类型 | 27 | 100_typing_entity typing_entity_type |
101 | 连贯性 - 语篇 - 语篇连贯性 - 连贯性建模 - 文本 | 26 | 101_coherence_discourse_discourse coherence_coherence modeling |
102 | 词性 - 标注器 - 标注 - 标注器 - 词性标注 | 25 | 102_pos_taggers_tagging_tagger |
103 | 药物 - 社交 - 社交媒体 - 媒体 - 健康 | 25 | 103_drug_social_social media_media |
104 | 性别 - 翻译 - 偏见 - 性别偏见 - 机器翻译 | 24 | 104_gender_translation_bias_gender bias |
105 | 工作 - 简历 - 技能 - 技能 - 软 | 21 | 105_job_resume_skills_skill |
由于改进后的保存程序,在大型数据集上训练会生成较小的模型尺寸。在下面的示例中,BERTopic模型在100,000个文档上进行训练,生成了一个约50MB的模型,保留了所有原始模型功能。对于推理,模型可以进一步缩小到仅约3MB!
这次集成的好处在生产用例中尤为显著。用户现在可以轻松地将BERTopic模型部署到现有的应用程序或系统中,确保其数据管道的无缝集成。这种简化的工作流程可实现更快的迭代和高效的模型更新,并确保不同环境之间的一致性。
safetensors:确保安全的模型管理
除了Hugging Face Hub集成,BERTopic现在支持使用safetensors库进行序列化。Safetensors是一种新的简单格式,用于安全地存储张量(而不是pickle),并且速度仍然很快(零拷贝)。我们很高兴看到越来越多的库利用safetensors进行安全序列化。您可以在这篇博客文章中阅读有关该库最近审计的更多信息。
使用BERTopic探索RLHF数据集的示例
为了说明BERTopic的一些强大功能,我们来看一个示例,了解如何使用它来监控用于训练聊天模型的数据集中的主题变化。
去年发布了几个人类反馈强化学习数据集。其中一个数据集是OpenAssistant对话数据集。该数据集是通过全球13,500多名志愿者的众包努力生成的。尽管该数据集已经有一些毒性、质量、幽默等方面的分数,但我们可能希望更好地了解该数据集中代表了哪些类型的对话。
BERTopic提供了一种更好地了解此数据集中主题的方法。在此示例中,我们在数据集的英语助手回复部分训练了一个模型。结果生成了一个包含75个主题的主题模型。
BERTopic为我们提供了多种可视化数据集的方式。我们可以在下面看到前8个主题及其相关词。我们可以看到,第二常见的主题主要由“回复词”组成,这在聊天模型中我们经常看到,即旨在“礼貌”和“乐于助人”的回复。我们还可以看到大量与编程或计算主题以及物理、食谱和宠物相关的主题。
databricks/databricks-dolly-15k是另一个可用于训练RLHF模型的数据集。创建此数据集的方法与OpenAssistant对话数据集截然不同,因为它是由Databricks的员工创建的,而不是通过志愿者众包的。也许我们可以使用我们训练好的BERTopic模型来比较这两个数据集中的主题?
新的BERTopic Hub集成意味着我们可以加载这个训练好的模型并将其应用于新的示例。
topic_model = BERTopic.load("davanstrien/chat_topics")
我们可以预测单个示例文本
example = "Stalemate is a drawn position. It doesn't matter who has captured more pieces or is in a winning position"
topic, prob = topic_model.transform(example)
我们可以获得有关预测主题的更多信息
topic_model.get_topic_info(topic)
数量 | 名称 | 表示 | |
---|---|---|---|
0 | 240 | 22_chess_chessboard_practice_strategy | ['国际象棋', '棋盘', '练习', '策略', '学习', '兵', '棋盘', '兵', '玩', '套'] |
我们可以看到这里预测的主题似乎是合理的。我们可能希望将其扩展到比较整个数据集的预测主题。
from datasets import load_dataset
dataset = load_dataset("databricks/databricks-dolly-15k")
dolly_docs = dataset['train']['response']
dolly_topics, dolly_probs = topic_model.transform(dolly_docs)
然后,我们可以比较两个数据集的主题分布。我们可以看到,根据我们的BERTopic模型,dolly数据集中的主题分布似乎更广。这可能是由于创建这两个数据集的不同方法造成的(我们可能需要在这两个数据集上重新训练一个BERTopic,以确保我们没有遗漏主题来确认这一点)。
两个数据集之间主题分布的比较
我们可能会在生产环境中使用主题模型来监控主题是否偏离预期分布过远。这可以作为一种信号,表明您的原始训练数据与您在生产中看到的对话类型之间存在漂移。您还可以决定在收集训练数据时使用主题建模,以确保您正在获取您可能特别关心的主题的示例。
开始使用BERTopic和Hugging Face Hub
您可以访问官方文档以获取快速入门指南,以帮助您使用BERTopic。
您可以在此处找到一个入门Colab笔记本,其中展示了如何训练BERTopic模型并将其推送到Hub。
Hub上已有的BERTopic模型示例
- MaartenGr/BERTopic_ArXiv:一个在1991年之后约30000篇ArXiv计算与语言文章(cs.CL)上训练的模型。
- MaartenGr/BERTopic_Wikipedia:一个在1000000个英文维基百科页面上训练的模型。
- davanstrien/imdb_bertopic:一个在IMDB数据集的无监督分割上训练的模型
您可以使用库过滤器在Hub上找到BERTopic模型的完整概述
我们邀请您探索这项新集成的可能性,并在Hub上分享您训练好的模型!