Понимание и применение кластеризации k-средних для моделирования тем - PullRequest
0 голосов
/ 13 июня 2018

У меня есть следующий код, который я нашел из https://pythonprogramminglanguage.com/kmeans-text-clustering/ при кластеризации документов.Несмотря на то, что я понимаю алгоритм k-средних в целом, у меня возникли некоторые проблемы, связанные с тем, что представляют собой верхние термины на кластер и как они вычисляются?Это самые частые слова, которые встречаются в кластере?В одном блоге, который я прочитал, сказано, что выводимые слова в конце представляют «верхние n слов, которые являются ближайшими к центроиду кластера» (но что означает, что фактическое слово «ближайший» к центроиду кластера).Я очень хочу понять детали и нюансы происходящего.Спасибо!

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score

documents = ["This little kitty came to play when I was eating at a restaurant.",
             "Merley has the best squooshy kitten belly.",
             "Google Translate app is incredible.",
             "If you open 100 tab in google you get a smiley face.",
             "Best cat photo I've ever taken.",
             "Climbing ninja cat.",
             "Impressed with google map feedback.",
             "Key promoter extension for Google Chrome."]

vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(documents)

true_k = 2
model = KMeans(n_clusters=true_k, init='k-means++', max_iter=100, n_init=1)
model.fit(X)

print("Top terms per cluster:")
order_centroids = model.cluster_centers_.argsort()[:, ::-1]
terms = vectorizer.get_feature_names()
for i in range(true_k):
    print("Cluster %d:" % i),
    for ind in order_centroids[i, :10]:
        print(' %s' % terms[ind]),
    print

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

«Верх» в этом контексте напрямую связан с тем, как текст был преобразован в массив числовых значений.Используя TFIDF, для каждого отдельного документа вы назначаете каждому слову оценку, основанную на его распространенности в этом документе, в противоположность распространенности во всем наборе документов.Слово с высоким показателем в документе указывает на то, что оно является более значимым или более представительным для этого документа, чем другие слова.

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

То, как это было сделано здесь, работает и эффективно, но мне трудно понять себя, и я не думаю, что это особенно интуитивно понятноТрудно понять, почему, если cluster_centers_ являются координатами для центроидов, то особенности с наивысшими числами координат являются главными словами.Я как бы понимаю, но не совсем (если кто-то хочет объяснить, как это работает, это было бы здорово!).

Я использую другой метод, чтобы найти главные термины для кластера, которые я считаю более интуитивными.Я только что проверил метод, который вы выложили, своим собственным на корпусе из 250 документов, и главные слова точно такие же.Ценность моего метода в том, что он работает, однако вы кластеризуете документы, если можете предоставить список назначений кластера (который должен обеспечивать любой алгоритм кластеризации), то есть вы не зависите от наличия атрибута cluster_centers_,Это также, я думаю, более интуитивно понятно.

import numpy as np

def term_scorer(doc_term_matrix, feature_name_list, labels=None, target=None, n_top_words=10):

    if target is not None:
        filter_bool = np.array(labels) == target
        doc_term_matrix = doc_term_matrix[filter_bool]
    term_scores = np.sum(doc_term_matrix,axis=0)
    top_term_indices = np.argsort(term_scores)[::-1]

    return [feature_name_list[term_idx] for term_idx in top_term_indices[:n_top_words]]

term_scorer(X, terms, labels=model.labels_, target=1, n_top_words=10)

Атрибут model.labels_ дает список назначений кластера для каждого документа.В этом примере я хочу найти верхние слова для кластера 1, поэтому я присваиваю target=1, функция фильтрует массив X, сохраняя только строки, назначенные для кластера 1. Затем она суммирует все оценки по всем строкам документов, поэтомуодна строка с колонкой для каждого слова.Затем он использует argsort для сортировки этой строки по самым высоким значениям к самым низким, заменяет значения исходными позициями индекса слов.Наконец, он использует понимание списка, чтобы перехватить индексные числа от верхней оценки до n_top_words, а затем создает список слов, просматривая эти индексы в feature_name_list.

0 голосов
/ 13 июня 2018

Когда слова преобразуются в векторы, мы говорим о близости слов о том, насколько они похожи.Так, например, вы можете использовать косинусное сходство для определения того, насколько близки два слова друг к другу.вектор «собака» и «щенок» будут похожи, так что вы можете сказать, что два слова близки друг к другу.Другими словами, близость также определяется контекстом слов.Таким образом, пара слов (the, cat) может быть близка согласно предложениям.Вот как работают word2vec или аналогичные алгоритмы для создания векторов слов.

...