Как создать матрицу терминов документа из моих вложенных списков панд? - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь реализовать фрагмент кода с использованием GuidedLDA, но я не понимаю, в каком формате должны работать мои текстовые данные. Код руководства загружает набор данных из самого модуля, в то время как я извлек свои текстовые данные из моего pandas dataframe, создал корпус и словарь, используя gensim, и все еще не могу сделать его функциональным.

Не могли бы вы объяснить, как я могу структурировать свои текстовые данные в набор данных разреженного массива, используемый в моделях LDA (я думаю, что матрица терминов документа?), Чтобы я мог использовать модуль GuidedLDA?

Первоначально я следовал этому руководству, чтобы выполнить анализ LDA для текстовых данных: https://www.machinelearningplus.com/nlp/topic-modeling-gensim-python/

После того, как я захотел улучшить его, я хотел использовать начальные темы для его адаптации. Итак, я нашел этот урок: https://medium.freecodecamp.org/how-we-changed-unsupervised-lda-to-semi-supervised-guidedlda-e36a95f3a164

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

Я пытался: - превращение моего корпуса в массив, чтобы получить форму

  • Сделано X = корпус

  • Структурировать мой корпус как модель BoW

  • Используется DictVectorized

Это учебный код, найденный здесь https://medium.freecodecamp.org/how-we-changed-unsupervised-lda-to-semi-supervised-guidedlda-e36a95f3a164:

X = guidedlda.datasets.load_data(guidedlda.datasets.NYT)
vocab = guidedlda.datasets.load_vocab(guidedlda.datasets.NYT)
word2id = dict((v, idx) for idx, v in enumerate(vocab))
print(X.shape)
print(X.sum())

model = guidedlda.GuidedLDA(n_topics=5, n_iter=100, random_state=7, 
refresh=20)
model.fit(X)

topic_word = model.topic_word_
n_top_words = 8
for i, topic_dist in enumerate(topic_word):
    topic_words = np.array(vocab)[np.argsort(topic_dist)][:- 

(n_top_words + 1): - 1] print ('Topic {}: {}'. format (i, '' .join (topic_words))) *

Мой код:

# Create Dictionary 
id2word = corpora.Dictionary(processed_sums_bigrams)

# Create Corpus (list of documents)
texts = processed_sums_bigrams

# Term Document Frequency
corpus = [id2word.doc2bow(text) for text in texts]

X = corpus
vocab = id2word
print(X.shape)
print(X.sum())

Когда X = корпус или id2word:

AttributeError: у объекта 'list' нет атрибута 'shape'

Когда X = np.array (корпус [0]):

X.shape >>> (36,7)

Эта форма слишком мала. Форма учебного кода (8447, 3012) и сумма 1221626.

Тогда я получаю эту ошибку:

-> 47 print ('Topic {}: {}'. Format (str (i), '' .join (topic_words))) Ошибка типа: элемент последовательности 0: ожидаемый экземпляр str, найдено numpy.int32

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

ValueError: недостаточно значений для распаковки (ожидается 2, получено 1)

TypeError: Невозможно привести данные массива из dtype ('float64') к dtype ('int64') в соответствии с правилом 'safe'

...