基于TF-IDF和KMeans的文本聚类分析
基于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)))
代码说明
- 首先读取文本文件,并使用jieba库进行分词,去除停用词。
- 使用TfidfVectorizer类对文本数据进行TF-IDF处理,生成特征矩阵X。
- 使用KMeans类对特征矩阵进行聚类,并输出每个文本所属的簇标签和特征矩阵。
- 获取每一类的中心点的特征向量,并对特征向量进行排序,取出前几个权重较大的特征词,即为该类的关键词。
注意事项
- 停用词库可以根据具体需求进行调整。
- 聚类数量n_clusters需要根据实际情况进行调整。
- 关键词数量num_keywords可以根据实际需求进行调整。
总结
本代码实现了基于TF-IDF和KMeans的文本聚类分析,并能够获取每一类的关键词。用户可以根据实际需求进行调整,例如修改停用词库、聚类数量、关键词数量等。
示例数据:
es.csv
文本1
文本2
文本3
...
stopwords.txt
的
地
得
...
原文地址: https://www.cveoy.top/t/topic/noVj 著作权归作者所有。请勿转载和采集!