TopicModel:如何通过主题模型“ topic”查询文档?

时间:2018-07-20 18:57:07

标签: python scikit-learn lda topic-modeling

下面,我创建了一个完整的可复制示例,以为给定的DataFrame计算主题模型。

import numpy as np  
import pandas as pd

data = pd.DataFrame({'Body': ['Here goes one example sentence that is generic',
                  'My car drives really fast and I have no brakes',
                  'Your car is slow and needs no brakes', 
                  'Your and my vehicle are both not as fast as the airplane']})

from sklearn.decomposition import LatentDirichletAllocation
from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(lowercase = True, analyzer = 'word')

data_vectorized = vectorizer.fit_transform(data.Body)
lda_model = LatentDirichletAllocation(n_components=4, 
                                      learning_method='online', 
                                      random_state=0,
                                      verbose=1)
lda_topic_matrix = lda_model.fit_transform(data_vectorized)

问题:如何按主题过滤文档?如果是这样,文档是否可以具有多个主题标签,或者是否需要一个阈值?

最后,我希望将每个文档的主题2和主题3的负荷都很高,以“ 1”标记,否则为“ 0”。

1 个答案:

答案 0 :(得分:2)

lda_topic_matrix包含文档属于特定主题/标签的概率分布。在人类中,这意味着每一行总计为1,而每个索引处的值是该文档属于特定主题的概率。因此,每个文档确实具有不同程度的所有主题标签。如果您有4个主题,则所有标签均相同的文档将在lda_topic_matrix中具有对应的行,类似于 [0.25, 0.25, 0.25, 0.25]。并且只有一个主题(“ 0”)的文档的行将变为[0.97, 0.01, 0.01, 0.01],具有两个主题(“ 1”和“ 2”)的文档的分布将为[0.01, 0.54, 0.44, 0.01]

因此,最简单的方法是选择概率最高的主题,然后检查它是2还是3

main_topic_of_document = np.argmax(lda_topic_matrix, axis=1)
tagged = ((main_topic_of_document==2) | (main_topic_of_document==3)).astype(np.int64)

This article对LDA的内部机制提供了很好的解释。