Сортировка кластерных слов по весу TFIDF с использованием K-средних sklearn в Python

#python #scikit-learn #data-science #k-means

Вопрос:

Я возлюсь с K-средними значениями для кластеризации текста. Цель состоит в том, чтобы сгруппировать эти тексты в 3 различные группы. Итак, группы-это кошки, компьютеры и земля. Мой текущий код вроде как работает, но у меня есть несколько вопросов.

 from sklearn.feature_extraction.text import TfidfVectorizer import string import nltk import re  from pymystem3 import Mystem from nltk.corpus import words  documents = [] documents.append("Cats hide their paws.") documents.append("Cats can clear two metres with a standing jump.") documents.append("Why do dogs run after cats?") documents.append("We need to protect the earth.") documents.append("The earth rotates on its axis.") documents.append("I felt the earth shake.") documents.append("A computer stores data and information.") documents.append("I cannot open my computer files.") documents.append("You may need to reboot the computer.") documents.append("Do you know how to operate a computer?")  stem = Mystem()  punctuation = r""" “!"#$%amp;'» ()* ,-./:;lt;=” (gt;?@[]^_`{|}~"""  morped_docs = []  for document in documents:  tokens = stem.lemmatize(document.lower())  tokens = [token for token in tokens if token not in russian_stopwords   and token != " "   and token.strip() not in punctuation  and token.isalpha()]  morped_docs.append(tokens)  vectorizer = TfidfVectorizer(lowercase=False) matrix = vectorizer.fit_transform(documents)  model = KMeans(algorithm='auto', copy_x=True, init='k-means  ', max_iter=10, n_clusters=3, n_init=30, random_state=3454, tol=0.0001, verbose=0) model.fit(matrix) terms = vectorizer.get_feature_names() order_centroids = model.cluster_centers_.argsort()[:, ::-1]  

Число len(order_centroids) равно 3. Это, я полагаю, означает количество кластеров. Число len(order_centroids[0]) равно 47, что, по-видимому, является общим количеством уникальных слов. Затем я пытаюсь напечатать верхние слова для каждого кластера.

 for i in range(3):  print("Cluster %d:" % i),  for ind in order_centroids[i, :5]:  print(' %s' % terms[ind])  

И это дает мне

 Cluster 0:  Cats  hide  their  paws  Why Cluster 1:  computer  files  cannot  information  data Cluster 2:  the  earth  need  to  felt  

Если я изменюсь order_centroids[i, :5] на что-то вроде order_centroids[i, :50] того, что все слова будут в каждом кластере. Итак, правильно ли говорить, что эти слова имеют разный вес? Например, в кластере с кошками может быть слово computer , но его вес равен 0,0? Эти слова отсортированы? Я считаю, что если бы они были отсортированы по tfidf, это показало бы, какие слова наиболее важны для каждого кластера.