nltk k-means集群或纯python的k-means

nltk k-means集群或纯python的k-means,python,nltk,Python,Nltk,虽然我已经看到了很多与此相关的问题,但我没有真正得到答案,可能是因为我是nltk集群的新手。 我真的需要一个聚类新手的基本解释,特别是关于NLTK K-均值聚类的向量表示以及如何使用它。我有一个单词列表,比如[猫、狗、小猫、小狗等],还有另外两个单词列表,比如[食肉动物、草食动物、宠物等]和[哺乳动物、家养动物等]。我希望能够使用第一个作为手段或质心,基于第一个单词对最后两个单词列表进行聚类。我已经试过了,我收到的断言错误如下: clusterer = cluster.KMeansCluster

虽然我已经看到了很多与此相关的问题,但我没有真正得到答案,可能是因为我是nltk集群的新手。 我真的需要一个聚类新手的基本解释,特别是关于NLTK K-均值聚类的向量表示以及如何使用它。我有一个单词列表,比如[猫、狗、小猫、小狗等],还有另外两个单词列表,比如[食肉动物、草食动物、宠物等]和[哺乳动物、家养动物等]。我希望能够使用第一个作为手段或质心,基于第一个单词对最后两个单词列表进行聚类。我已经试过了,我收到的断言错误如下:

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的难点在于找到簇中心,如果您已经找到了中心或知道您想要的中心,您可以:为每个点找到到每个簇中心的距离,并将该点指定给最近的簇中心

(作为旁注,对于集群和机器学习来说,这是一个很好的软件包。)

在您的示例中,它应该如下所示:

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'

结果:

>>> get_clusters(cluster_center_words, other_words)
{'dog': ['dogg', 'frog'], 'cat': ['kat', 'car']}

你介意指出一些与此相关的问题/答案吗?:)如果你在比较字符串,难道你不应该使用汉明距离或列文斯坦距离而不是欧几里德距离吗?@akavall:这很好,但是我们如何让它从语义上而不是基于字符的距离对单词进行分类呢?比如把所有的鱼都归类为鱼,把所有的鸟都归类为鸟?
>>> get_clusters(cluster_center_words, other_words)
{'dog': ['dogg', 'frog'], 'cat': ['kat', 'car']}