Понимание и применение кластеризации k-средних для тематического моделирования

У меня есть следующий код, который я нашел на 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

person Jane Sully    schedule 12.06.2018    source источник


Ответы (2)


«Верх» в этом контексте напрямую связан с тем, как текст был преобразован в массив числовых значений. Используя 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.

person James Allen-Robertson    schedule 13.06.2018

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

person user9937571    schedule 13.06.2018
comment
Мой вопрос больше касался того, что представляет собой центроид, особенно в кластеризации документов? Если я вывожу лучшие термины, что означает верхние (наиболее репрезентативные, наиболее частые)? - person Jane Sully; 13.06.2018