を使用する場合に直面する問題の1つscipy.cluster.vq.kmeans
は、その関数がユークリッド距離を使用して近さを測定することです。クラスタリングによって問題を解決可能なものにまとめるにk-means
は、文字列を数値ベクトルに変換し、ユークリッド距離を妥当な近さの尺度として使用して正当化できる方法を見つける必要があります。
それは...難しいようです。おそらく、代わりにレーベンシュタイン距離を探していますか?
非ユークリッド距離メトリック(レーベンシュタイン距離など)で機能するK-meansアルゴリズムのバリエーションがあることに注意してください。K-medoids
(別名PAM)は、たとえば、任意の距離メトリックを持つデータに適用できます。
たとえば、のPycluster
実装とレーベンシュタイン距離の実装を使用すると、k-medoids
nltk
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']