基于TF-IDF和KMeans的文本聚类分析

本代码使用Python实现文本聚类分析,利用TF-IDF方法提取文本特征,并使用KMeans算法进行聚类,输出每个文本所属的簇标签和特征矩阵,并获取每一类的关键词。

代码实现

import jieba
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
import csv

# 读取文本文件,每行为一个文本数据
with open('es.csv', 'r', encoding='gbk') as f:
    texts = f.readlines()

# 对每个文本进行分词,保存为字符串列表
text_list = []
stopwords = set(open('stopwords.txt', 'r', encoding='utf-8').read().split('
'))
for text in texts:
    words = jieba.cut(text.strip())
    words = [word for word in words if word not in stopwords]
    text_list.append(' '.join(words))

# 保存分词结果
with open('F.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    for text in text_list:
        writer.writerow([text])

# 对文本数据进行tf-idf处理
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(text_list)

# 保存去停用词结果
with open('T.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    for row in X.toarray():
        writer.writerow(row)

# 使用KMeans聚类
kmeans = KMeans(n_clusters=5, random_state=0)
kmeans.fit(X)

# 输出每个文本所属的簇标签和特征矩阵
#labels = kmeans.labels_
#print('每个文本所属的簇标签:', labels)
# 输出每个文本所属的簇标签和特征矩阵
labels = kmeans.labels_
for i, text in enumerate(texts):
    print('第'+str(labels[i])+'类'+ ':' +text.strip())
print('特征矩阵:
', X.toarray())
print(X)
np.savetxt('jz.txt', X.toarray(),fmt='%.8f')

#保存聚类结果
with open('result.txt', 'w', encoding='utf-8') as f:
    for i, text in enumerate(texts):
        f.write('第'+str(labels[i])+'类' + ':' + text.strip() + '
')

### 获取每一类的关键词

怎么看每类的关键词内容:可以通过以下步骤来获取每一类的关键词:

1. 获取每一类的中心点(即聚类中心)的特征向量。
2. 对每一类的特征向量进行排序,取出前几个权重较大的特征词。
3. 输出每一类的关键词。

以下是代码示例:

```python
# 获取每一类的中心点的特征向量
centers = kmeans.cluster_centers_

# 对每一类的特征向量进行排序,取出前几个权重较大的特征词
num_keywords = 5 # 每一类取前5个关键词
keywords_list = []
for i in range(kmeans.n_clusters):
    center = centers[i]
    sorted_indices = np.argsort(center)[::-1] # 降序排序
    keywords = [vectorizer.get_feature_names()[index] for index in sorted_indices[:num_keywords]]
    keywords_list.append(keywords)

# 输出每一类的关键词
for i, keywords in enumerate(keywords_list):
    print('第{}类的关键词:{}'.format(i, ','.join(keywords)))

代码说明

  1. 首先读取文本文件,并使用jieba库进行分词,去除停用词。
  2. 使用TfidfVectorizer类对文本数据进行TF-IDF处理,生成特征矩阵X。
  3. 使用KMeans类对特征矩阵进行聚类,并输出每个文本所属的簇标签和特征矩阵。
  4. 获取每一类的中心点的特征向量,并对特征向量进行排序,取出前几个权重较大的特征词,即为该类的关键词。

注意事项

  • 停用词库可以根据具体需求进行调整。
  • 聚类数量n_clusters需要根据实际情况进行调整。
  • 关键词数量num_keywords可以根据实际需求进行调整。

总结

本代码实现了基于TF-IDF和KMeans的文本聚类分析,并能够获取每一类的关键词。用户可以根据实际需求进行调整,例如修改停用词库、聚类数量、关键词数量等。

示例数据:

es.csv
文本1
文本2
文本3
...
stopwords.txt
的
地
得
...

原文地址: https://www.cveoy.top/t/topic/noVj 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录