single pass文本聚类python实现
时间: 2023-06-12 12:03:51 浏览: 244
单遍文本聚类是一种简单而有效的文本聚类技术。它的基本思想是将文本逐个逐个地读入,然后根据某些相似度度量方法将其分配到不同的簇中。在这个过程中,每个文本只会被分配到一个簇中,因此被称为“单遍”聚类。
下面是一个 Python 实现单遍文本聚类的示例代码:
```python
import math
# 定义相似度度量函数(这里使用余弦相似度)
def cosine_similarity(v1, v2):
dot_product = sum(v1[i] * v2[i] for i in range(len(v1)))
magnitude_v1 = math.sqrt(sum(v1[i] ** 2 for i in range(len(v1))))
magnitude_v2 = math.sqrt(sum(v2[i] ** 2 for i in range(len(v2))))
return dot_product / (magnitude_v1 * magnitude_v2)
# 定义单遍聚类函数
def single_pass_clustering(docs, threshold):
clusters = [] # 存储簇的列表
for doc in docs:
# 计算当前文本与已有簇的相似度
max_similarity = -1
best_cluster = None
for cluster in clusters:
similarity = cosine_similarity(doc, cluster["centroid"])
if similarity > max_similarity:
max_similarity = similarity
best_cluster = cluster
# 如果最大相似度小于阈值,则将当前文本作为新的簇
if max_similarity < threshold:
clusters.append({
"centroid": doc,
"docs": [doc]
})
# 否则将当前文本加入最相似的簇中,并更新簇的质心
else:
best_cluster["docs"].append(doc)
for i in range(len(doc)):
best_cluster["centroid"][i] = (best_cluster["centroid"][i] * len(best_cluster["docs"]) + doc[i]) / (len(best_cluster["docs"]) + 1)
return clusters
```
在这个实现中,我们首先定义了一个余弦相似度函数 `cosine_similarity`,然后实现了一个单遍聚类函数 `single_pass_clustering`。这个函数接受两个参数:文本列表 `docs` 和相似度阈值 `threshold`,并返回一个簇的列表。
在函数内部,我们遍历每个文本,计算其与已有簇的相似度,并将其分配到最相似的簇中。如果最大相似度小于阈值,则将当前文本作为新的簇;否则将当前文本加入最相似的簇中,并更新簇的质心。最后返回所有簇的列表。
使用这个实现,我们可以对一个文本列表进行聚类:
```python
docs = [
[1, 1, 1],
[2, 2, 2],
[10, 10, 10],
[11, 11, 11],
[20, 20, 20],
[21, 21, 21]
]
clusters = single_pass_clustering(docs, 0.5)
for i, cluster in enumerate(clusters):
print(f"Cluster {i}: {len(cluster['docs'])} docs")
print(cluster['centroid'])
print(cluster['docs'])
```
这个示例代码中使用了一个简单的文本列表 `docs`,其中每个文本是一个三元素列表。我们调用 `single_pass_clustering` 函数对这个文本列表进行聚类,并将相似度阈值设为 0.5。
运行这个代码片段,我们可以看到每个簇的信息:簇的编号、簇的大小、簇的质心和簇的文本列表。
阅读全文