使用 Kmeans 聚类单词
Clustering words with Kmeans
如何使用 Kmeans 对术语(1-2 个词)进行聚类。我读了一篇研究论文,其中他们使用 K 均值通过 Levenshtein 距离对相似的术语进行聚类。请通过显示示例代码来帮助我。
谢谢
注意:在研究论文中,他们使用 Levenshtein 距离计算了相似度矩阵并将其用于聚类。
def get_levenshtein_distance(word1, word2):
word2 = word2.lower()
word1 = word1.lower()
matrix = [[0 for x in range(len(word2) + 1)] for x in range(len(word1) + 1)]
for x in range(len(word1) + 1):
matrix[x][0] = x
for y in range(len(word2) + 1):
matrix[0][y] = y
print(matrix)
from nltk.metrics import distance
import scipy.spatial as spatial
import numpy as np
from scipy.cluster.vq import kmeans
# sample vocabulary list
words = ['test', 'text', 'best', 'fast', 'context', 'boost', 'faster', 'border']
# similarity matrix
word_vectors = np.array([
[
distance.edit_distance(w, _w)
for _w in words
]
for w in words
], dtype=np.float)
centroids, _ = kmeans(word_vectors, k_or_guess=3)
word_clusters = np.argmin([
[spatial.distance.euclidean(wv, cv) for cv in centroids]
for wv in word_vectors
], 1)
for k in range(centroids.shape[0]):
print('k =', k)
print([word for i, word in enumerate(words) if word_clusters[i] == k])
结果为:
k = 0
['faster', 'border']
k = 1
['test', 'text', 'best', 'fast', 'boost']
k = 2
['context']
备注:
- 原始词汇作为功能列表。与其他单词的距离度量列表用作任何短语或单词的特征向量。
- 每个聚类都是在这样的特征中制作的space。因此,两个单词之间的距离不再是它们的 Levenshtein 距离,而是它们在 space 中的距离。这就是为什么我们使用其他措施,例如
spatial.distance.euclidean
.
- Kmean 在此特征中生成质心 space,如果聚类质心最接近单词(在所有其他质心中),则每个单词都被视为聚类的成员。
np.argmin([...], 1)
正在为每个单词寻找这样的分配。
- 其他聚类算法也可以在 word-feature space 上进行测试。 (scikit-learn中的一些聚类算法列表:https://scikit-learn.org/stable/modules/clustering.html)
矩阵在 (m,n) 单元格中初始化,测量一个词的 m-character 前缀与另一个词的 n-prefix 之间的 Levenshtein 距离。矩阵可以从左上角到右下角填充。
如何使用 Kmeans 对术语(1-2 个词)进行聚类。我读了一篇研究论文,其中他们使用 K 均值通过 Levenshtein 距离对相似的术语进行聚类。请通过显示示例代码来帮助我。
谢谢
注意:在研究论文中,他们使用 Levenshtein 距离计算了相似度矩阵并将其用于聚类。
def get_levenshtein_distance(word1, word2):
word2 = word2.lower()
word1 = word1.lower()
matrix = [[0 for x in range(len(word2) + 1)] for x in range(len(word1) + 1)]
for x in range(len(word1) + 1):
matrix[x][0] = x
for y in range(len(word2) + 1):
matrix[0][y] = y
print(matrix)
from nltk.metrics import distance
import scipy.spatial as spatial
import numpy as np
from scipy.cluster.vq import kmeans
# sample vocabulary list
words = ['test', 'text', 'best', 'fast', 'context', 'boost', 'faster', 'border']
# similarity matrix
word_vectors = np.array([
[
distance.edit_distance(w, _w)
for _w in words
]
for w in words
], dtype=np.float)
centroids, _ = kmeans(word_vectors, k_or_guess=3)
word_clusters = np.argmin([
[spatial.distance.euclidean(wv, cv) for cv in centroids]
for wv in word_vectors
], 1)
for k in range(centroids.shape[0]):
print('k =', k)
print([word for i, word in enumerate(words) if word_clusters[i] == k])
结果为:
k = 0
['faster', 'border']
k = 1
['test', 'text', 'best', 'fast', 'boost']
k = 2
['context']
备注:
- 原始词汇作为功能列表。与其他单词的距离度量列表用作任何短语或单词的特征向量。
- 每个聚类都是在这样的特征中制作的space。因此,两个单词之间的距离不再是它们的 Levenshtein 距离,而是它们在 space 中的距离。这就是为什么我们使用其他措施,例如
spatial.distance.euclidean
. - Kmean 在此特征中生成质心 space,如果聚类质心最接近单词(在所有其他质心中),则每个单词都被视为聚类的成员。
np.argmin([...], 1)
正在为每个单词寻找这样的分配。 - 其他聚类算法也可以在 word-feature space 上进行测试。 (scikit-learn中的一些聚类算法列表:https://scikit-learn.org/stable/modules/clustering.html)
矩阵在 (m,n) 单元格中初始化,测量一个词的 m-character 前缀与另一个词的 n-prefix 之间的 Levenshtein 距离。矩阵可以从左上角到右下角填充。