Skip to content

BERTopic 主题生成过程详解(含大模型数据选择策略)

BERTopic 是一种基于 语义嵌入 + 聚类 + 关键词提取 的先进主题建模方法,其核心流程包括 **文本嵌入 → 降维 → 聚类 → 主题表示 **,并支持使用大模型(如 ChatGPT)优化主题描述。

关键改进点:

  • 大模型生成主题时,仅输入代表性较高的文档(而非全部文档),以提高效率并保持主题质量。
  • 代表性文档能代表整个簇,因为它们在语义上与簇中心高度一致,减少了噪声干扰。

1. 文本嵌入(Text Embedding)

目标:将文本转换为高维语义向量,使相似内容的文档在向量空间中靠近。

方法

  • 使用 Sentence-BERT、MPNet 等预训练模型计算文档嵌入(如 768 维向量)。

示例

  • "新冠疫苗的副作用" → [0.23, -0.56, ..., 0.78]
  • "接种疫苗后的反应" → [0.25, -0.52, ..., 0.75](语义相近,向量相似)

2. 降维(UMAP)

目标:降低向量维度,便于后续聚类。

方法

  • 使用 UMAP 将高维向量压缩至 2-5 维,保留语义结构。

关键参数

  • n_neighbors=15(控制局部/全局结构平衡)
  • min_dist=0.0(允许点重叠,适合紧密聚类)
  • metric='cosine'(基于文本相似性降维)

效果

  • 768 维 → [0.34, -0.12](2D 坐标)

3. 聚类(HDBSCAN)

目标:自动发现主题簇,无需预设主题数量。

方法

  • 使用 HDBSCAN(基于密度的层次聚类)识别高密度区域:
    • min_cluster_size=20(主题最小文档数)
    • cluster_selection_method='eom'(选择稳定性高的簇)
  • 噪声处理:无法归类的文档标记为 -1(可后续分析)。

输出

  • 簇 0(疫苗相关):[doc1, doc2, ...]
  • 簇 1(选举相关):[doc5, doc6, ...]
  • 噪声(未归类):[doc3, doc7, ...]

4. 主题表示(Topic Representation)

目标:为每个簇生成可解释的关键词或描述。

(1) 默认方法:c-TF-IDF

原理:计算每个主题内词汇的 class-based TF-IDF,提取区分度高的词。

示例输出

  • 主题 0: ["疫苗", "接种", "副作用", "Pfizer"]
  • 主题 1: ["选举", "投票", "候选人"]

(2) 大模型增强(如 ChatGPT)

关键策略:仅输入代表性较高的文档,而非全部文档!

为什么选择代表性文档?

  • 计算效率:大模型(如 GPT-4)的上下文窗口有限(如 128K tokens),直接输入数万篇文档不现实。采样 100-500 篇代表性文档可大幅降低计算成本。
  • 减少噪声干扰:主题簇中可能存在离群文档(语义偏离核心主题),输入全部文档会导致大模型混淆。代表性文档更贴近簇中心,能准确反映主题核心语义。
  • 语义一致性:通过向量相似度筛选(如选择最靠近簇中心的文档),确保输入内容高度相关。

如何选择代表性文档?

  • 方法 1:基于嵌入相似度

    • 计算所有文档与簇中心的余弦相似度,选择 Top-N 最接近的文档。
    python
    from sklearn.metrics.pairwise import cosine_similarity
    cluster_center = np.mean(cluster_embeddings, axis=0)  # 计算簇中心向量
    similarities = cosine_similarity(embeddings, [cluster_center])
    top_docs_indices = np.argsort(similarities, axis=0)[-100:]  # 选最相似的100篇
  • 方法 2:K-Means 子聚类

    • 对簇内文档再做 K-Means 聚类(如 5 个子簇),从每个子簇选 1-2 篇代表文档,确保覆盖多样性。

大模型 Prompt 示例

python
prompt = f"""
请根据以下文档,生成该主题的 5 个核心关键词和 1 句简要描述:
文档列表:
"新冠疫苗的临床试验显示有效率超过90%。"
"接种辉瑞疫苗后报告了轻微副作用。"
...
"Moderna 疫苗对变种病毒仍有效。"
要求:
关键词简洁且覆盖主要子主题
描述不超过 20 字
输出格式:
{{
  "keywords": ["词1", "词2", ...],
  "description": "概括性描述"
}}
"""

示例输出

json
{
  "keywords": [
    "新冠疫苗",
    "临床试验",
    "辉瑞",
    "副作用",
    "Moderna"
  ],
  "description": "讨论新冠疫苗的有效性及副作用报告。"
}

5. 主题优化(Post-processing)

目标:提升主题质量。

方法

  • 自动合并相似主题(nr_topics="auto"
  • 手动调整(merge_topics()reduce_topics()
  • 噪声文档分配:将 -1 文档分配给最近主题,或归类为“其他”。

6. 总结:为什么代表性文档能代表整个簇?

原因说明
语义接近簇中心代表性文档的嵌入向量与簇中心最相似,能准确反映主题核心语义。
减少噪声干扰离群文档(如无关内容)会被过滤,避免误导大模型。
计算高效仅需处理少量文档(100-500 篇),而非数万篇,适合实际应用。
覆盖多样性通过子聚类或均匀采样,确保不同角度的内容均被涵盖。

7. 完整流程图示

mermaid
graph TD
    A[原始文本] --> B[文本嵌入]
    B --> C[UMAP 降维]
    C --> D[HDBSCAN 聚类]
    D --> E{选择代表性文档}
    E --> F[c-TF-IDF 或 LLM 生成主题]
    F --> G[优化与合并]
    G --> H[最终主题模型]

通过这种策略,BERTopic 既能利用大模型的语义理解能力,又能高效处理大规模数据,确保主题的 准确性可解释性

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer