Построение векторизованных текстовых документов в matplotlib? - PullRequest
0 голосов
/ 01 марта 2019

Я преобразовал целую кучу документов PDF в текст, а затем скомпилировал их в текст, я точно знаю, что у меня есть 3 различных типа документов, и я хочу использовать кластеризацию для их автоматической группировки:

dict_of_docs = {'document_1':'contents of document', 'document_2':'contents of document', 'document_3':'contents of document',...'document_100':'contents of document'}

Затем я векторизовал значения моего словаря:

vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(dict_of_docs.values())

Мой вывод X выглядит примерно так:

  (0, 768)  0.05895270500636258
  (0, 121)  0.11790541001272516
  (0, 1080) 0.05895270500636258
  (0, 87)   0.2114378682212116
  (0, 1458) 0.1195944498355368
  (0, 683)  0.0797296332236912
  (0, 1321) 0.12603709835806634
  (0, 630)  0.12603709835806634
  (0, 49)   0.12603709835806634
  (0, 750)  0.12603709835806634
  (0, 1749) 0.10626171032944469
  (0, 478)  0.12603709835806634
  (0, 1632) 0.14983692373373858
  (0, 177)  0.12603709835806634
  (0, 653)  0.0497440271723707
  (0, 1268) 0.13342186854440274
  (0, 1489) 0.07052056544031632
  (0, 72)   0.12603709835806634
  ...etc etc

Затем я преобразовал их в массив, X = X.toarray()

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

Как получить мой массиввекторизованных данных в точечный график?

1 Ответ

0 голосов
/ 01 марта 2019

Как получить массив векторизованных данных на диаграмме рассеяния?

В несколько этапов: кластеризация, уменьшение размерности, построение графиков и отладка.

Кластеризация:

Мы используем K-средства для подгонки X (наш TF-IDF векторизованный набор данных).

from sklearn.cluster import KMeans

NUMBER_OF_CLUSTERS = 3
km = KMeans(
    n_clusters=NUMBER_OF_CLUSTERS, 
    init='k-means++', 
    max_iter=500)
km.fit(X)

Уменьшение размерности:

  • TF-IDF - это матрица.Нам нужно 2 ~ 3 измерения для построения графика.
  • Мы можем применить PCA, а затем построить два наиболее важных принципиальных компонента (первые два).
from sklearn.decomposition import PCA

# First: for every document we get its corresponding cluster
clusters = km.predict(X)

# We train the PCA on the dense version of the tf-idf. 
pca = PCA(n_components=2)
two_dim = pca.fit_transform(X.todense())

scatter_x = two_dim[:, 0] # first principle component
scatter_y = two_dim[:, 1] # second principle component

Plotting:

Мы отображаем каждый кластер с заранее заданным цветом.

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('ggplot')

fig, ax = plt.subplots()
fig.set_size_inches(20,10)

# color map for NUMBER_OF_CLUSTERS we have
cmap = {0: 'green', 1: 'blue', 2: 'red'}

# group by clusters and scatter plot every cluster
# with a colour and a label
for group in np.unique(clusters):
    ix = np.where(clusters == group)
    ax.scatter(scatter_x[ix], scatter_y[ix], c=cmap[group], label=group)

ax.legend()
plt.xlabel("PCA 0")
plt.ylabel("PCA 1")
plt.show()

Отладчик источник :

Печать первых 10 слов в каждом кластере.

order_centroids = km.cluster_centers_.argsort()[:, ::-1]

terms = vectorizer.get_feature_names()
for i in range(3):
    print("Cluster %d:" % i, end='')
    for ind in order_centroids[i, :10]:
        print(' %s' % terms[ind], end='')
    print()

# Cluster 0: com edu medical yeast know cancer does doctor subject lines
# Cluster 1: edu game games team baseball com year don pitcher writes
# Cluster 2: edu car com subject organization lines university writes article

enter image description here

...