基于TF-IDF+KMeans聚类算法构建中文文本分类模型

基于 TF-IDF + KMeans 聚类算法构建中文文本分类模型

文本分类是自然语言处理(NLP)领域的重要任务之一,而结合 TF-IDF 和 KMeans 聚类算法可以快速构建无监督的文本分类模型。本文将详细讲解如何通过 TF-IDF 提取文本特征,使用 KMeans 聚类文本,并对结果进行可视化。


一、背景知识

1.1 什么是 TF-IDF?

TF-IDF(Term Frequency-Inverse Document Frequency) 是一种评估单词在文档集合中重要程度的统计方法。其核心思想是:

  • 词频(TF):单词在当前文档中出现的频率。
  • 逆文档频率(IDF):单词在所有文档中出现的稀有程度。

TF-IDF 的公式为:

\[ \text{TF-IDF}(t, d) = \text{TF}(t, d) \times \text{IDF}(t) \]

1.2 什么是 KMeans 聚类?

KMeans 聚类 是一种无监督学习算法,用于将数据点分为 (k) 个簇。其基本流程包括:

  1. 随机初始化 (k) 个簇中心。
  2. 根据样本到簇中心的距离,将样本分配到最近的簇。
  3. 重新计算每个簇的中心。
  4. 重复上述过程,直到簇中心收敛。

1.3 任务目标

通过 TF-IDF 提取中文文本特征,使用 KMeans 进行聚类,从而实现文本分类。


二、项目流程

  1. 数据预处理
  2. 构建 TF-IDF 特征矩阵
  3. 使用 KMeans 进行聚类
  4. 可视化聚类结果
  5. 评价与改进

三、代码实现

3.1 环境准备

安装依赖

pip install sklearn pandas jieba matplotlib

导入库

import pandas as pd
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from wordcloud import WordCloud

3.2 数据预处理

示例数据

我们使用一个包含中文文本的数据集:

data = [
    "我喜欢看科幻小说",
    "编程是我的兴趣之一",
    "足球比赛非常精彩",
    "Python 是一门强大的编程语言",
    "人工智能正在改变世界",
    "我最喜欢的运动是篮球",
    "机器学习和深度学习是 AI 的核心",
    "NBA 比赛非常刺激",
    "大数据和云计算正在兴起",
    "小说中的人物非常有趣"
]

df = pd.DataFrame(data, columns=["content"])

分词处理

使用 jieba 对文本进行分词:

def chinese_tokenizer(text):
    return " ".join(jieba.cut(text))

df['tokenized'] = df['content'].apply(chinese_tokenizer)
print(df.head())

3.3 构建 TF-IDF 特征矩阵

使用 TfidfVectorizer 转换文本为 TF-IDF 特征矩阵:

tfidf = TfidfVectorizer()
tfidf_matrix = tfidf.fit_transform(df['tokenized'])

print(f"TF-IDF 矩阵形状: {tfidf_matrix.shape}")

3.4 KMeans 聚类

模型训练

设定聚类数 (k=3)

kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(tfidf_matrix)

# 将聚类结果添加到数据集中
df['cluster'] = kmeans.labels_
print(df)

确定最佳聚类数

使用 肘部法则 找到最优 (k)

inertia = []
for k in range(1, 10):
    km = KMeans(n_clusters=k, random_state=42)
    km.fit(tfidf_matrix)
    inertia.append(km.inertia_)

plt.plot(range(1, 10), inertia, marker='o')
plt.title('肘部法则')
plt.xlabel('聚类数 (k)')
plt.ylabel('SSE')
plt.show()

3.5 可视化结果

词云展示每个簇的关键词

for i in range(3):
    cluster_texts = df[df['cluster'] == i]['tokenized'].str.cat(sep=" ")
    wordcloud = WordCloud(font_path="simhei.ttf", background_color="white").generate(cluster_texts)
    
    plt.figure()
    plt.imshow(wordcloud, interpolation="bilinear")
    plt.axis("off")
    plt.title(f"Cluster {i} WordCloud")
    plt.show()

聚类结果分布

使用降维方法(如 PCA)可视化聚类分布:

from sklearn.decomposition import PCA

# 降维至 2D
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(tfidf_matrix.toarray())

# 可视化
plt.figure(figsize=(8, 6))
for i in range(3):
    cluster_data = reduced_data[df['cluster'] == i]
    plt.scatter(cluster_data[:, 0], cluster_data[:, 1], label=f"Cluster {i}")

plt.legend()
plt.title("KMeans Clustering")
plt.show()

四、结果分析

4.1 模型输出

在上面的代码中,每条文本被分配到了一个聚类,示例输出如下:

              content                tokenized  cluster
0          我喜欢看科幻小说             我 喜欢 看 科幻 小说       0
1          编程是我的兴趣之一             编程 是 我 的 兴趣 之一       1
2          足球比赛非常精彩             足球 比赛 非常 精彩       2
...

4.2 聚类效果分析

从聚类结果可以看出:

  • Cluster 0:与小说相关的文本。
  • Cluster 1:与编程和 AI 相关的文本。
  • Cluster 2:与运动比赛相关的文本。

五、优化与改进

  1. 改进分词效果:使用自定义词典,优化 jieba 分词。
  2. 调整超参数:通过肘部法则、轮廓系数等方法选择最佳聚类数。
  3. 丰富数据集:增加更多样本,提高模型泛化能力。
  4. 使用深度学习模型:如 Bert 提取特征,结合 KMeans 进一步优化聚类效果。

六、总结

本文通过 TF-IDF + KMeans 聚类构建了一个中文文本分类模型,并演示了从数据预处理到聚类可视化的完整流程。无监督学习方法适用于无标签数据的分类任务,为实际问题提供了一种高效的解决方案。

学习收获

  • 掌握了 TF-IDF 的特征提取方法。
  • 理解了 KMeans 聚类算法及其应用。
  • 学会了用 Python 实现中文文本的无监督分类。

希望本文对你构建自己的文本分类模型有所帮助!

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日