对下载的文档(文档存储在./data路径下),利用K-Means聚类算法进行聚类。 要求如下: ◼ 将下载的500个中文/英文文档(文档存储在./data路径下)聚为20个类,并显示聚类之后所形成的三个最大 的类,及每个类中代表性的文档(即,离类中心最近的五个文档)。距离计算公式,可采用余弦距离,也可用欧式距离。请给出详细的代码注释
时间: 2024-02-24 12:55:08 浏览: 78
利用K-Means聚类算法进行文档聚类(python代码+中英文文档)
5星 · 资源好评率100%
好的,我会为您解答这个问题。为了实现这个要求,我们需要进行以下步骤:
1.读取文档
我们需要读取./data路径下的500个文档,可以使用Python的os模块和pandas库来实现。
```python
import os
import pandas as pd
# 读取文件
data = []
for file in os.listdir('./data'):
with open('./data/'+file, 'r', encoding='utf-8') as f:
text = f.read()
data.append(text)
# 转换为DataFrame格式
df = pd.DataFrame({'text': data})
```
2.文本向量化
我们需要将文本转换为向量表示,这里我们采用TF-IDF向量化方法。可以使用sklearn库中的TfidfVectorizer来实现。
```python
from sklearn.feature_extraction.text import TfidfVectorizer
# 定义向量化函数
def tfidfVectorizer(data):
tfidf_vectorizer = TfidfVectorizer(max_df=0.8, max_features=200000,
min_df=0.2, use_idf=True, ngram_range=(1,3))
tfidf_matrix = tfidf_vectorizer.fit_transform(data)
return tfidf_matrix, tfidf_vectorizer
# 对文本进行向量化
tfidf_matrix, tfidf_vectorizer = tfidfVectorizer(df['text'])
```
3.聚类
我们需要使用KMeans算法对向量化后的文本进行聚类。可以使用sklearn库中的KMeans来实现。
```python
from sklearn.cluster import KMeans
# 定义聚类函数
def kmeansCluster(tfidf_matrix, num_clusters):
km = KMeans(n_clusters=num_clusters)
km.fit(tfidf_matrix)
clusters = km.labels_.tolist()
return km, clusters
# 进行聚类
num_clusters = 20
km, clusters = kmeansCluster(tfidf_matrix, num_clusters)
```
4.可视化
我们需要对聚类结果进行可视化,可以使用matplotlib库来实现。
```python
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
import numpy as np
# PCA降维
pca = PCA(n_components=2)
tfidf_matrix_pca = pca.fit_transform(tfidf_matrix.toarray())
# 绘制散点图
plt.figure(figsize=(8, 8))
markers = ['o', 's', '^', 'x', '*', 'D', 'p', 'h', '+', '.', 'v', '<', '>', '1', '2', '3', '4', '8', 's', 'd']
for i, cluster in enumerate(np.unique(clusters)):
plt.scatter(x=tfidf_matrix_pca[clusters == cluster, 0],
y=tfidf_matrix_pca[clusters == cluster, 1],
s=30, marker=markers[i], label='cluster {}'.format(cluster))
plt.legend()
plt.show()
```
5.输出结果
我们需要输出聚类结果,包括每个类中的文档和代表性的文档。可以使用sklearn库中的pairwise_distances函数来计算文档之间的距离,然后选取距离中心最近的五个文档作为代表性文档。
```python
from sklearn.metrics.pairwise import pairwise_distances
# 输出聚类结果
df['cluster'] = clusters
for i in range(num_clusters):
print('Cluster {}:'.format(i))
cluster = df.loc[df['cluster'] == i]
center = km.cluster_centers_[i]
distances = pairwise_distances(tfidf_vectorizer.transform(cluster['text']).toarray(), center.reshape(1,-1), metric='cosine')
nearest_docs = np.argsort(distances.flatten())[:5]
for j in nearest_docs:
print(' {}'.format(cluster.iloc[j]['text']))
print('\n')
# 输出三个最大的类
largest_clusters = df.groupby('cluster').size().nlargest(3).index.values
print('The three largest clusters are: {}'.format(largest_clusters))
```
综上所述,这就是使用K-Means聚类算法进行文本聚类的完整代码注释。
阅读全文