Получить значения из кластеров K-Means, используя фрейм данных - PullRequest
0 голосов
/ 28 августа 2018

У меня есть этот фрейм данных (text_df):

enter image description here

Есть 10 разных авторов с 13834 строками текста.

Затем я создал пакет слов и использовал TfidfVectorizer примерно так:

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf_v = TfidfVectorizer(max_df=0.5,
                          max_features=13000,
                          min_df=5,
                          stop_words='english',
                          use_idf=True,
                          norm=u'l2',
                          smooth_idf=True
                          )

X = tfidf_v.fit_transform(corpus).toarray() # corpus --> bagofwords
y = text_df.iloc[:,1].values

Форма Х (13834,2701)

Я решил использовать 7 кластеров для KMeans:

from sklearn.cluster import KMeans
km = KMeans(n_clusters=7,random_state=42)

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

Обновление:

Попытка визуализировать количество авторов на кластер, используя вложенный словарь, например:

author_cluster = {}
for i in range(len(y_kmeans)):
    # check 20 random predictions
    j = np.random.randint(0, 13833, 1)[0]

    if y_kmeans[j] not in author_cluster:
        author_cluster[y_kmeans[j]] = {}

        if y[j] not in author_cluster[y_kmeans[j]]:
            author_cluster[y_kmeans[j]][y[j]] = 1 
        else:
            author_cluster[y_kmeans[j]][y[j]] += 1

Выход:

enter image description here

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

1 Ответ

0 голосов
/ 29 августа 2018
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans

tfidf_v = TfidfVectorizer(max_df=0.5,
                          max_features=13000,
                          min_df=5,
                          stop_words='english',
                          use_idf=True,
                          norm=u'l2',
                          smooth_idf=True
                          )

X = tfidf_v.fit_transform(corpus) # I removed .toarray() - not sure why it was there except maybe for print debugging?
y = text_df.iloc[:,1].values

km = KMeans(n_clusters=7,random_state=42)

model = km.fit(X)
result = model.predict(X)

for i in range(20):
    # check 20 random predictions
    container = np.random.randint(low=0, high=13833, size=1)
    j = container[0]
    print(f'Author {y[j]} wrote {X[j]} and was put in cluster {result[j]}') 
...