中文短文本怎么按主题聚类?用 TF-IDF 和 KMeans 检查分组

用 jieba、TF-IDF 和 KMeans 对无标签中文短句作主题探索,打印组内原句及中心高权重词。通过十二条人工样例检查分组,并说明真实语料如何校准和复核。

有一批没有类别标签的中文短句,想先观察它们可能有哪些主题,可以用 jieba 分词、TF-IDF 表示文本,再用 KMeans 分组。检查结果时同时看组里的原句和中心高权重词,随后再由人给主题命名。

下面十二条均是人工编写的演示句,词语特意重复以便观察分组,不代表某个产品功能或真实客户反馈。脚本已在 Windows、Python 3.11.15、scikit-learn 1.7.2、jieba 0.42.1 运行;没有测试真实数据集的主题质量。

中文短文本怎么按主题聚类?用 TF-IDF 和 KMeans 检查分组

确定这次探索的输入和 K

样例有配音、知识库、表格三组,所以用 n_clusters=3 演示。真实语料的主题数并不知道,不能因为本例用了3就照搬。KMeans 会按照指定数量划分数据,本身不会自动给簇命名,也不能证明分出来的组就是业务类别。

在新目录准备环境,随后把脚本保存为 cluster_demo.py:

python -m venv .venv
.venv\Scripts\python.exe -m pip install "scikit-learn==1.7.2" "jieba==0.42.1"

分词、构造向量并打印每一组

tokenizer 使用 jieba.lcut,所以把 token_pattern 设为 None,让自定义分词函数负责词边界。ngram_range=(1,2) 同时保留单词和相邻词组。停用词只删除本例中的常见连词、标点等;正式应用要检查它们是否影响业务含义。

random_state 固定初始化的随机源,n_init=10 表示运行多次不同初始化后按目标函数选择结果。官方文本聚类示例提醒稀疏高维文本的初始化可能不稳定,因此即使给了随机种子,仍应换种子复核结构是否稳定。

import jieba
from sklearn.cluster import KMeans
from sklearn.feature_extraction.text import TfidfVectorizer

texts = [
    "视频配音先上传视频,再选择配音声音。",
    "视频配音完成后核对音量和字幕。",
    "视频配音要先试听声音再导出视频。",
    "视频配音支持调整声音和语速。",
    "知识库检索需要导入文档并建立索引。",
    "知识库检索要核对文档来源和引用。",
    "知识库检索失败时检查文档索引。",
    "知识库检索结果必须包含文档片段。",
    "表格数据先核对日期和金额。",
    "表格数据要检查缺失值和异常金额。",
    "表格数据按月份汇总金额并导出。",
    "表格数据清洗后核对金额总计。",
]
jieba.add_word("知识库")
vectorizer = TfidfVectorizer(
    tokenizer=jieba.lcut, token_pattern=None,
    stop_words=["的", "和", ",", "。", "并", "先", "再", "要", "后", "需要"],
    ngram_range=(1, 2),
)
matrix = vectorizer.fit_transform(texts)
model = KMeans(n_clusters=3, random_state=42, n_init=10).fit(matrix)
terms = vectorizer.get_feature_names_out()
for cluster in range(3):
    members = [i for i, label in enumerate(model.labels_) if label == cluster]
    order = model.cluster_centers_[cluster].argsort()[::-1][:5]
    print("组", cluster, "记录", members, "高权重词", " / ".join(terms[order]))
    for i in members:
        print(" ", i, texts[i])
assert len(set(model.labels_)) == 3
assert all(len(set(model.labels_[start:start + 4])) == 1 for start in (0, 4, 8))

运行:

.venv\Scripts\python.exe cluster_demo.py

不要只看组号,要回读原句

在固定样例上,实际输出如下:

组 0 记录 [4, 5, 6, 7] 高权重词 知识库 / 知识库 检索 / 文档 / 检索 / 索引
  4 知识库检索需要导入文档并建立索引。
  5 知识库检索要核对文档来源和引用。
  6 知识库检索失败时检查文档索引。
  7 知识库检索结果必须包含文档片段。
组 1 记录 [8, 9, 10, 11] 高权重词 金额 / 表格 / 表格 数据 / 数据 / 核对
  8 表格数据先核对日期和金额。
  9 表格数据要检查缺失值和异常金额。
  10 表格数据按月份汇总金额并导出。
  11 表格数据清洗后核对金额总计。
组 2 记录 [0, 1, 2, 3] 高权重词 视频 / 配音 / 视频 配音 / 声音 / 配音 完成
  0 视频配音先上传视频,再选择配音声音。
  1 视频配音完成后核对音量和字幕。
  2 视频配音要先试听声音再导出视频。
  3 视频配音支持调整声音和语速。

0组包含编号4至7的知识库句,1组包含8至11的表格句,2组包含0至3的配音句。组号只是算法标识,换初始化或数据顺序后可能改变;检查时应比较成员和主题,而不是要求“知识库永远是0组”。

高权重词来自簇中心的特征权重,帮助说明这一组为何靠近,但不是自动生成的可靠主题名。先逐句核对组内是否有不同任务、版本冲突或否定句,再给组命名。脚本断言只证明人为样例的三组能够分开,不能用它声称真实分类准确率。

把样例换成真实反馈时怎么复核

  • 保留原始编号,去掉空文本,并单独处理完全重复句。大量复制句会让某类词的权重和组大小失真。
  • 先查看分词,补充完整的产品名和专业术语。停用词、单词/词组设置改变后,用同一批原句比较分组。
  • 尝试几个小的 K 值和随机种子,记录每组成员数量、代表句和混入的不同任务,避免只凭图好看或某一个分数定主题数。
  • 在复核表保存“记录编号、簇ID、人工主题、是否混组、原因”。需要稳定业务标签时,可由这一步产生候选标签规则,再另建带人工标签的分类数据。

空词表、样本数少于指定簇数、去重后独立文本很少都应先处理输入。中文同义表达、过短句和多主题段落容易让词面聚类失效;本例不会理解所有语义关系,也不会识别业务优先级。安装完依赖后脚本可离线运行,不下载大模型。

一条反馈同时说配音和字幕,应该怎么办?

KMeans 会给每条样本一个簇号。如果真实反馈经常同时谈多个主题,应先决定分析单位是否拆成有原文对应关系的短句,或采用允许多个标签的人工标注方案。不要把一次分组硬当成最终工单分类规则。

来源与接口依据

官方资料核对日期:2026年10月1日。本文用到的接口见:TF-IDF 分词与特征参数;KMeans 初始化与接口;官方文本聚类示例;jieba 官方分词项目。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30800.html

赞 (0)
AI小管家的头像AI小管家
中文关键词怎么提取?用 jieba 的 TF-IDF 加停用词并导出
上一篇 1天前
文本是什么语言?用 langid 批量识别并标记短句待复核
下一篇 1天前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部