基于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) 个簇。其基本流程包括:
- 随机初始化 (k) 个簇中心。
- 根据样本到簇中心的距离,将样本分配到最近的簇。
- 重新计算每个簇的中心。
- 重复上述过程,直到簇中心收敛。
1.3 任务目标
通过 TF-IDF 提取中文文本特征,使用 KMeans 进行聚类,从而实现文本分类。
二、项目流程
- 数据预处理
- 构建 TF-IDF 特征矩阵
- 使用 KMeans 进行聚类
- 可视化聚类结果
- 评价与改进
三、代码实现
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:与运动比赛相关的文本。
五、优化与改进
- 改进分词效果:使用自定义词典,优化
jieba
分词。 - 调整超参数:通过肘部法则、轮廓系数等方法选择最佳聚类数。
- 丰富数据集:增加更多样本,提高模型泛化能力。
- 使用深度学习模型:如 Bert 提取特征,结合 KMeans 进一步优化聚类效果。
六、总结
本文通过 TF-IDF + KMeans 聚类构建了一个中文文本分类模型,并演示了从数据预处理到聚类可视化的完整流程。无监督学习方法适用于无标签数据的分类任务,为实际问题提供了一种高效的解决方案。
学习收获
- 掌握了 TF-IDF 的特征提取方法。
- 理解了 KMeans 聚类算法及其应用。
- 学会了用 Python 实现中文文本的无监督分类。
希望本文对你构建自己的文本分类模型有所帮助!
评论已关闭