作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
虽然我看到了很多与此相关的问题,但我并没有真正得到答案,可能是因为我是使用 nltk 集群的新手。我确实需要对聚类新手进行基本解释,特别是关于 NLTK K 均值聚类的向量表示以及如何使用它。我有一个单词列表,例如 [cat、dog、kitten、puppy 等] 和另外两个单词列表,例如 [carnivore、herbivore、pet 等] 和 [mammal、domestic etc]。我希望能够使用第一个作为均值或质心,基于第一个单词列表对最后两个单词列表进行聚类。我试过了,我收到了这样的断言错误:
clusterer = cluster.KMeansClusterer(2, euclidean_distance, initial_means=means)
File "C:\Python27\lib\site-packages\nltk\cluster\kmeans.py", line 64, in __init__
assert not initial_means or len(initial_means) == num_means
AND
print clusterer.cluster(vectors, True)
File "C:\Python27\lib\site-packages\nltk\cluster\util.py", line 55, in cluster
self.cluster_vectorspace(vectors, trace)
File "C:\Python27\lib\site-packages\nltk\cluster\kmeans.py", line 82, in cluster_vectorspace
self._cluster_vectorspace(vectors, trace)
File "C:\Python27\lib\site-packages\nltk\cluster\kmeans.py", line 113, in _cluster_vectorspace
index = self.classify_vectorspace(vector)
File "C:\Python27\lib\site-packages\nltk\cluster\kmeans.py", line 137, in classify_vectorspace
dist = self._distance(vector, mean)
File "C:\Python27\lib\site-packages\nltk\cluster\util.py", line 118, in euclidean_distance
diff = u - v
TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray'
我认为向量表示中有一些我的意思。向量表示的基本示例和示例代码将受到高度赞赏。任何使用 nltk 或纯 python 的解决方案都将受到赞赏。预先感谢您的友好回复
最佳答案
如果我正确理解你的问题,这样的事情应该有效。 kmeans的难点在于找到聚类中心,如果你已经找到了中心或者知道你想要什么中心,你可以:为每个点找到到每个聚类中心的距离,并将该点分配给最近的聚类中心。
(顺便说一句 sklearn 是一个非常适合集群和机器学习的软件包。)
在您的示例中,它应该如下所示:
# levenstein function is not my implementation; I copied it from the
# link above
def levenshtein(s1, s2):
if len(s1) < len(s2):
return levenshtein(s2, s1)
# len(s1) >= len(s2)
if len(s2) == 0:
return len(s1)
previous_row = xrange(len(s2) + 1)
for i, c1 in enumerate(s1):
current_row = [i + 1]
for j, c2 in enumerate(s2):
insertions = previous_row[j + 1] + 1 # j+1 instead of j since previous_row and current_row are one character longer
deletions = current_row[j] + 1 # than s2
substitutions = previous_row[j] + (c1 != c2)
current_row.append(min(insertions, deletions, substitutions))
previous_row = current_row
return previous_row[-1]
def get_closest_lev(cluster_center_words, my_word):
closest_center = None
smallest_distance = float('inf')
for word in cluster_center_words:
ld = levenshtein(word, my_word)
if ld < smallest_distance:
smallest_distance = ld
closest_center = word
return closest_center
def get_clusters(cluster_center_words, other_words):
cluster_dict = {}
for word in cluster_center_words:
cluster_dict[word] = []
for my_word in other_words:
closest_center = get_closest_lev(cluster_center_words, my_word)
cluster_dict[closest_center].append(my_word)
return cluster_dict
示例:
cluster_center_words = ['dog', 'cat']
other_words = ['dogg', 'kat', 'frog', 'car']
结果:
>>> get_clusters(cluster_center_words, other_words)
{'dog': ['dogg', 'frog'], 'cat': ['kat', 'car']}
关于python - nltk k-means 聚类或纯 python 的 k-means,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17486918/
我是一名优秀的程序员,十分优秀!