Подбирать тексты по топи c (LDA) - PullRequest
7 голосов
/ 17 июня 2020

Можно ли искать тексты, которые находятся в определенных топах c (определяется LDA)?

У меня есть список из 5 тем по 10 слов в каждой, найденных с помощью lda.

Я проанализировал тексты в столбце фрейма данных. Я хотел бы выбрать / отфильтровать строки / тексты, которые находятся в одной спецификации c topi c.

Если вам нужна дополнительная информация, я вам предоставлю.

Я имею в виду шаг, который возвращает следующий результат:

[(0,
  '0.207*"house" + 0.137*"apartment" + 0.118*"sold" + 0.092*"beach" + '
  '0.057*"kitchen" + 0.049*"rent" + 0.033*"landlord" + 0.026*"year" + '
  '0.024*"bedroom" + 0.023*"home"'),
 (1,
  '0.270*"school" + 0.138*"homeworks" + 0.117*"students" + 0.084*"teacher" + '
  '0.065*"pen" + 0.038*"books" + 0.022*"maths" + 0.020*"exercise" + '
  '0.020*"friends" + 0.020*"college"'),
 ... ]

создано

# LDA Model

lda_model = gensim.models.ldamodel.LdaModel(corpus=corpus,
                                           id2word=id2word,
                                           num_topics=num_topics, 
                                           random_state=100,
                                           update_every=1,
                                           chunksize=100,
                                           passes=10,
                                           alpha='auto', 
                                           # alpha=[0.01]*num_topics,
                                           per_word_topics=True,
                                           eta=[0.01]*len(id2word.keys()))

Распечатать ключевое слово в 10 темах

from pprint import pprint
pprint(lda_model.print_topics())
doc_lda = lda_model[corpus]

Исходный столбец с текстами, которые были проанализированы, называется Texts, и он выглядит так:

Texts 

"Children are happy to go to school..."
"The average price for buying a house is ... "
"Our children love parks so we should consider to buy an apartment nearby"

etc etc...

Мой ожидаемый результат будет

Texts                                            Topic 
    "Children are happy to go to school..."         2
    "The average price for buying a house is ... "  1
    "Our children love parks so we should consider to buy an apartment nearby"                                   

      2

Спасибо

1 Ответ

4 голосов
/ 27 июня 2020

doc_lda содержит список кортежей (topi c, score) для каждого предложения. Следовательно, вы можете гибко присвоить предложению topi c, используя любую эвристику, например, простая эвристика c могла бы назначить topi c с максимальным баллом.

Мы можем извлечь topi c оценок каждого предложения, выполнив следующие действия:

topic_scores = [[topic_score[1] for topic_score in sent] for sent in doc_lda]

Вы также можете преобразовать приведенное выше в pandas фрейм данных, где каждая строка представляет собой предложение, а каждый столбец - это topi c id. Структура данных фрейма данных обычно допускает гибкую и более сложную операцию с отношениями предложений topi c -score

df_topics = pd.DataFrame(topic_scores)

Если вы просто хотите назначить одну topi c, которая имеет максимальную оценку за предложение, вы можете сделать это:

max_topics = [max(sent, key=lambda x: x[1])[0] for sent in doc_lda]
...