如果使用scipy.cluster.vq.kmeans,您将面临的一个问题是该函数使用欧几里得距离来测量接近度。要将您的问题固定为可通过k-means 聚类解决的问题,您必须找到一种将字符串转换为数值向量的方法,并能够证明使用欧几里得距离作为接近度的合理衡量标准。
这似乎……很难。也许您正在寻找Levenshtein distance?
请注意,variants of the K-means algorithm 可以使用非欧几里得距离度量(例如 Levenshtein 距离)。 K-medoids(又名 PAM),例如,can be applied to data with an arbitrary distance metric。
例如,使用Pycluster's实现k-medoids,和nltk's实现Levenshtein距离,
import nltk.metrics.distance as distance
import Pycluster as PC
words = ['apple', 'Doppler', 'applaud', 'append', 'barker',
'baker', 'bismark', 'park', 'stake', 'steak', 'teak', 'sleek']
dist = [distance.edit_distance(words[i], words[j])
for i in range(1, len(words))
for j in range(0, i)]
labels, error, nfound = PC.kmedoids(dist, nclusters=3)
cluster = dict()
for word, label in zip(words, labels):
cluster.setdefault(label, []).append(word)
for label, grp in cluster.items():
print(grp)
产生类似的结果
['apple', 'Doppler', 'applaud', 'append']
['stake', 'steak', 'teak', 'sleek']
['barker', 'baker', 'bismark', 'park']