2013-07-05 2 views
1

Хотя я видел довольно много вопросов, связанных с этим, но на самом деле я не получаю ответа, потому что я новичок в использовании кластеризации nltk. Мне действительно нужно базовое объяснение для новичка для кластеризации, особенно для векторного представления для кластеризации кластеров KLLK и как его использовать. У меня есть список таких слов, как [кошка, собака, котенок, щенок и т. Д.] И два других списка таких слов, как [плотоядное животное, травоядное животное, домашнее животное и т. Д.] И [млекопитающее, домашнее животное и т. Д.]. Я хочу иметь возможность группировать последние два списка слов на основе первого, используя первый как средство или центроид. Я попытался, я получил AssertionError следующим образом:nltk k-означает кластеризацию или 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 будет оценено по достоинству. Заранее благодарю за ваш добрый ответ

+0

Не могли бы вы напомнить о некоторых из этих вопросов/ответов, касающихся этого, пожалуйста? :) – arturomp

+0

Если вы сравниваете строки, вы не должны использовать хеминг или левенштайн вместо евклидова? – Akavall

ответ

1

Если я правильно понял ваш вопрос, что-то вроде этого должно работать. Трудная часть кмэнов - найти центры кластеров, если вы уже нашли центры или знаете, какие центры вы хотите, вы можете: для каждой точки найти расстояние до каждого центра кластера и назначить точку ближайшему центру кластера.

(Как примечание стороны sklearn является большой пакет для кластеризации и машинного обучения в целом.)

В вашем примере это должно выглядеть следующим образом:

Levenstein

# 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'] 

Res ult:

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

согласен, scikit's sklearn очень полезен для статистического nlp. – alvas

+1

@akavall: это здорово, но как мы можем это классифицировать слова семантически, а не исходя из расстояния на основе символов? как категоризировать все, что есть рыба, как рыба, и все, что является птицей, как птицей? –

Смежные вопросы