支持@micans 对Affinity Propagation的推荐。
来自论文:L Frey、Brendan J. 和 Delbert Dueck。“通过在数据点之间传递消息进行聚类。” 科学315.5814 (2007): 972-976。.
通过许多软件包非常容易使用。它适用于任何可以定义成对相似性的东西。您可以通过将 Levenshtein 距离乘以 -1 得到。
我使用您问题的第一段作为输入,整理了一个简单的示例。在 Python 3 中:
import numpy as np
from sklearn.cluster import AffinityPropagation
import distance
words = "YOUR WORDS HERE".split(" ") #Replace this line
words = np.asarray(words) #So that indexing with a list will work
lev_similarity = -1*np.array([[distance.levenshtein(w1,w2) for w1 in words] for w2 in words])
affprop = AffinityPropagation(affinity="precomputed", damping=0.5)
affprop.fit(lev_similarity)
for cluster_id in np.unique(affprop.labels_):
exemplar = words[affprop.cluster_centers_indices_[cluster_id]]
cluster = np.unique(words[np.nonzero(affprop.labels_==cluster_id)])
cluster_str = ", ".join(cluster)
print(" - *%s:* %s" % (exemplar, cluster_str))
输出是(以斜体表示的示例,位于它们作为示例的集群的左侧):
- 有:机会,编辑,手,有,高
- 以下:以下
- 问题:问题
- I: I, a, at, etc, in, list, of
- 可能:可能
- 集群:集群
- word: for, and, for, long, need, should, very, word, words
- 类似的:类似的
- 文史丹:文史丹
- 距离:距离
- 的:那个,那个,这,到,与
- 相同:示例,列表,名称,相同,例如,姓氏
- 算法:算法,算法
- 出现:出现,出现
在50 个随机名字的列表上运行它:
- 黛安:迪安娜、黛安、迪翁、杰拉德、伊琳娜、莉塞特、明娜、妮基、瑞奇
- 贾尼:克莱尔、贾尼、杰森、Jc、基米、朗、马库斯、马克西玛、兰迪、劳尔
- Verline:命运、凯莉、玛丽莲、梅赛德斯、斯特林、Verline
- 格伦:埃莉诺、格伦、格温达
- 阿曼迪纳:阿曼迪纳,奥古斯丁
- 希拉:艾哈迈德、埃斯特拉、米丽莎、希拉、特蕾莎、温内尔
- 劳伦:秋,海蒂,劳伦,劳伦
- 阿尔贝托:阿尔贝塔、阿尔贝托、罗伯特
- 绝杀:艾米、多琳、欧拉、约瑟夫、洛瑞、洛瑞、波特
对我来说看起来很棒(这很有趣)。