Кластеризация K-средних - выходные кластеры содержат одинаковое количество элементов, но в другом порядке [Python] - PullRequest
1 голос
/ 18 июня 2020

Я следовал этому руководству , чтобы выполнить кластеризацию K-средних для списка, содержащего отдельные слова. Это проект, основанный на крикете, поэтому я выбрал K = 3, чтобы позже можно было разделить три группы на [ватин, боулинг, поле]. Но после компиляции кода элементы в трех результирующих кластерах будут одинаковыми, но в другом порядке. Я попытался сделать исходный список отличным, но это тоже не помогло. Прикрепление кода ниже.

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd

len(finaldatatext)
#2173
vectorizer = TfidfVectorizer(stop_words='english')
#finaldatatext here is the list containing distinct elements
X = vectorizer.fit_transform(finaldatatext)

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

order_centroids = model.cluster_centers_.argsort()[:, ::-1]
terms = vectorizer.get_feature_names()

clusterlists = []
for i in range(true_k):
  dummy_list  = []
    for ind in order_centroids[i]:
      #print( '%s' % terms[ind])
      dummy_list.append('%s' % terms[ind])
  clusterlists.append(dummy_list)

Пример начального списка:

['anymore', 'silly', 'fielders', 'fans', 'rcb', 'precedent', 'reputation', 'pool', 'International', 'famous', 'Astle', 'max', 'stadium', 'bennet', 'working', 'lassi', 'ameetasinh', 'meantime', 'com', 'on', 'little', 'saini', 'Kanos', 'telling', 'six', 'PrithviShaw', 'started', 'letting', 'wYB2P72Il2', 'chess', 'brainwashed', 'Stat', 'mediocre', 'Afridi', 'hopes', 'strength', 'jamieson', 'managed', '46th', 'finale', 'PaRtNeRShIP', 'Another', 'kind', 'exactly', 'Happybirthday', 'out', 'RidaNajamKhan', 'scoreline', 'Career', 'boiiiiiiiiiiiii', 'based', 'starting', 'Test', 'omnipresent', 'Hahaha', 'version', 'victory', 'desert', 'cowards', 'OUTDATED', 'nz', 'inspecting', 'honestly', 'wait', 'Unless', 'steadying', 'think', 'anyone', 'YER', 'rant', 'one', 'odis', 'BANTER', 'paav', 'Ug6cTFgG8U', 'aggressive', 'brought', 'workload', 'Wise', 'ca', 'Brilliant', 'twist', 'open', 'THROWS', 'bringing', 'till', 'starts', 'gives', 'wYB', 'fifty', 'SENA', 'baboon', 'punishment', 'summarized', 'feeling', 'pandya', 'Bangladesh', 'hurting', 'accent', 'Kid', 'well']

Ожидаемый результат - три отдельных кластера с уникальными значениями, которые я могу классифицировать как ватин, боулинг и поле в соответствии с к элементам. В настоящее время это 3 идентичных кластера в разном порядке.

print(Clusterlists[0])
#sample reduced result
['absence', 'zize6kysq2', 'flexibility', 'finally', 'finals', 'fined', 'finisher', 'firepower', 'fit', 'fitness', 'flaw', 'flaws', 'fleming', 'fluffed', 'frame', 'fluke', 'fn0uegxgss', 'focussed', 'foot', 'forget', 'forgot', 'form', 'format', 'forward', 'fought', 'fow', 'finale', 'final', 'filter', 'figures', 'fashioned', 'fast', 'fastest', 'fat', 'fatigue', 'fault', 'fav', 'featured', 'feel', 'feeling', 'feels', 'fees', 'feet', 'felt', 'ferguson', 'fewest', 'ffc4pfbvfr', 'ffs', 'field', 'fielder', 'fielders', 'fielding', 'fight', 'fow_hundreds', 'frankly', 'faridabad', 'given', 'giving', 'glad', 'glenn', 'gloves', 'god', 'gods', 'goes', 'going', 'gois', 'gon', 'gone', 'good', 'got', 'grand', 'grandhomme', 'grandmom', 'grandpa', 'grass', 'great', 'greatest', 'greatness', 'greig', 'grind', 'gives', 'gingers', 'free', 'gill', 'frontline','fulfilling', 'future', 'gaandu', 'gabbar', 'gajal_dalmia', 'gambhir', 'game', 'gangsta', 'geez', 'gem', 'genius', 'genuinely', 'gets', 'getter', 'getting', 'giant', 'giddy', 'fascinating', 'fared', 'groupby', 'drives', 'dropped', 'drowning', 'dube', 'dude', 'dumb', 'dumbass', 'duo', 'e3cli7hakf', 'e9fhdkxvvl', 'earlier', 'early', 'earned', 'easiest', 'easily', 'easy', 'economically', 'economy', 'edengarden', 'edge']
len(Clusterlists[0])
#1728
len(Clusterlists[1])
#1728
len(Clusterlists[2])
#1728

в настоящее время дает одно и то же значение. Пожалуйста, предоставьте решение. Заранее спасибо.

Ссылка на исходный список finaldatatext, преобразованный в csv.

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Короткое время a go Я протестировал код для кластеризации текста. Вычислять расстояния между текстом несколько неортодоксально, но вы можете это сделать, если действительно хотите.

0 голосов
/ 18 июня 2020

Ваши "списки кластеров" добавляются только один раз в конце кода. Попробуй поправить отступы «кластерлистов», должно быть ОК.

Кроме того, отступ в исходном сообщении тоже кажется неправильным. Проверьте отступ после копирования и вставки.

...