对下载的文档(文档存储在./data路径下),利用K-Means聚类算法进行聚类。 要求如下: ◼ 将下载的500个中文/英文文档(文档存储在./data路径下)聚为20个类,并显示聚类之后所形成的三个最大 的类,及每个类中代表性的文档(即,离类中心最近的五个文档)。距离计算公式,可采用余弦距离,也可用欧式距离。请给出详细的代码注释
时间: 2024-02-23 09:59:52 浏览: 61
利用K-Means聚类算法进行文档聚类(python代码+中英文文档)
5星 · 资源好评率100%
好的,我会为您解答。首先,我们需要安装必要的库,如sklearn、numpy、pandas、jieba等,可以使用以下命令进行安装:
```python
!pip install sklearn numpy pandas jieba
```
接着,我们可以读取文档数据并进行预处理,可以使用jieba库对文档进行分词,并将分词结果保存到列表中。
```python
import os
import jieba
data_path = './data'
texts = []
for filename in os.listdir(data_path):
with open(os.path.join(data_path, filename), 'r', encoding='utf-8') as f:
text = f.read()
words = list(jieba.cut(text))
texts.append(' '.join(words))
```
接下来,我们需要将文档转换成向量形式,这里我们使用TfidfVectorizer类来实现,它可以将文本转换成词频矩阵,然后计算TF-IDF值。同时,我们还需要使用KMeans类来进行聚类操作。
```python
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
vectorizer = TfidfVectorizer(max_features=5000)
X = vectorizer.fit_transform(texts)
kmeans = KMeans(n_clusters=20, random_state=0)
kmeans.fit(X)
```
接下来,我们可以将聚类结果进行可视化,可以使用pandas和matplotlib库来实现。我们可以将每个文档的聚类标签添加到数据框中,并统计每个聚类中文档的数量。
```python
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'text': texts})
df['label'] = kmeans.labels_
counts = df['label'].value_counts()
top_3 = counts[:3]
print('Top 3 clusters:', top_3)
plt.figure(figsize=(10, 5))
plt.bar(counts.index, counts.values)
plt.xlabel('Cluster')
plt.ylabel('Count')
plt.show()
```
最后,我们可以输出每个聚类中离聚类中心最近的5个文档。
```python
def get_representative_documents(df, cluster_id, n=5):
cluster = df[df['label'] == cluster_id]
centroids = kmeans.cluster_centers_[cluster_id]
distances = [cosine_similarity(X[i], centroids) for i in cluster.index]
cluster['distance'] = distances
return cluster.sort_values('distance')[:n]['text'].tolist()
for i in top_3.index:
print('Cluster', i)
print(get_representative_documents(df, i))
```
其中,get_representative_documents函数可以获取某个聚类中离聚类中心最近的n个文档。这里我们使用余弦相似度来计算距离。
阅读全文