推荐@mican进行亲和力传播。
摘自本文:L Frey,Brendan J.和Delbert Dueck。“通过在数据点之间传递消息进行集群。” 科学 315.5814(2007):972-976。。
通过许多软件包,它超级易于使用。它适用于任何您可以定义成对相似性的事物。您可以通过将Levenshtein距离乘以-1来获得。
我使用您问题的第一段作为输入,整理了一个简单的示例。在Python 3中:
import numpy as np
import sklearn.cluster
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 = sklearn.cluster.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:我在清单中
- 可能:可能
- 集群:集群
- 单词:长期需要,应该非常单词
- 类似:类似
- Levenshtein: Levenshtein
- 距离:距离
- 的:那个,这个,到,与
- 相同:示例,列表,名称,相同,此类,姓
- 算法:算法,算法
- 出现:出现,出现
在50个随机名字的列表上运行它:
- 黛安(Diane):黛安娜(Diana),黛安(Diane),黛安(Dionne),杰拉尔德(Gerald),伊琳娜(Irina),利塞特(Lisette),明娜(Minna),尼克(Nicki),里基
- 贾尼(Jani):克莱尔(Clair),贾尼(Jani),杰森(Jason),Jc,基米(Kimi),朗(Lang),马库斯(Marcus),马克西(Maxima),兰迪(Randi),劳尔(Raul)
- Verline:命运,Kellye,Marylin,梅赛德斯,斯特林,Verline
- 格伦:埃莱诺(Elenor),格伦(Glenn),格温达(Gwenda)
- Armandina: Armandina,Augustina
- Shiela: Ahmed,Estella,Milissa,Shiela,Thresa,Wynell
- 劳伦(Laureen):秋天,海德(Haydee),劳伦(Laureen),劳伦(Lauren)
- 阿尔贝托:阿尔伯塔,阿尔贝托,罗伯特
- 知识: Ammie,Doreen,Eura,Josef,Lore,Lori,Porter
对我来说看起来很棒(这很有趣)。