Как сделать процентную гистограмму тем из тематического моделирования? - PullRequest
1 голос
/ 11 июля 2019

Я ломал голову над этим в течение недели.

Я хочу

  1. запустить моделирование темы NMF
  2. Назначить каждому документу тему, посмотрев на максимальный вес,
  3. График распределенияв виде гистограммы% с использованием matplot.(То есть: темы на оси X и% документов, которые являются этой темой на оси Y.)

Вот некоторые игрушечные данные и выполнение шагов 1 и 2:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import NMF
import pandas as pd

# Get data
data = {
    "Documents": ["I am a document", 
                  "And me too", 
                  "The cat is big",
                  "The dog is big"
                  "My headphones are large", 
                  "My monitor has rabies", 
                  "My headphones are loud"
                  "The street is loud "]
}

df = pd.DataFrame(data)

# Fit a TFIDF vectorizer 
tfidf_vectorizer = TfidfVectorizer()
tfidf = tfidf_vectorizer.fit_transform(df['Documents'])

# Run NMF
nmf_model = NMF(n_components=4, random_state=1).fit(tfidf)

# Weights
W = nmf_model.transform(tfidf)

# Topics
H= nmf_model.components_

Теперь вот как я могу назначить документ для topcic:

# Will return document topics as list like [1, 4, 1...] to 
# represent that the first document is topic 1, the second 4, and so on. 
topics = pd.DataFrame(W).idxmax(axis=1, skipna=True).tolist()

Хорошо, теперь я смогу получить то, что хочу, с этими двумя структурами, но я в растерянности.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

IIUC, вы хотите нарисовать гистограмму, поэтому не меняйте темы в списке:

topics = pd.DataFrame(W).idxmax(axis=1, skipna=True)

plt.bar(x=topics.index, height=topics.mul(100)/topics.sum())
plt.show()

дает:

enter image description here

0 голосов
/ 11 июля 2019

выглядит как сценарий использования Counter (). Я бы написал что-то вроде этого:

from collections import Counter

mylist = [1,1,1,1,2,2,3,1,1,2,3,1,1,1]
mycount = Counter(mylist)
for key,value in mycount.items():
    print(key,value)  

Это выводит ваши темы в следующей структуре:

1 9
2 3
3 2  

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...