在一个主题中选择单词,LDA 主题的哪个截止点?

机器算法验证 Python 主题模型
2022-04-19 15:56:54

我的问题是 LDA 主题的良好截止阈值是多少?

我使用了这篇博文中的代码在 Python 中使用潜在 Dirichlet 分配进行主题建模

在该代码中,作者显示了每个主题中的前 8 个单词,但这是最佳选择吗?

对于每个主题分布,每个词都有一个概率,所有词的概率加起来为 1.0

我编写了这段代码来打印到一个 epsilon 阈值:

eps=0.01
for i, topic_dist in enumerate(topic_word):         
    wordindex=np.argsort(topic_dist)[::-1] #rev sort
    w=topic_dist[wordindex] ## this is the length of all the unique words 4258
    words=[np.array(vocab)[wordindex[j]] for j in range(min(n_top_words,len(wordindex))) if w[j]>eps ]
    weights=['{:.3f}'.format(w[j]) for j in range(min(n_top_words,len(wordindex))) if w[j]>eps ]
    print('Topic {}: {}; {}'.format(i, ', '.join(words),', '.join(weights)))

查看另一个库gensim LdaModel,看起来 LDA 最初很可能没有像这样的概率总和为 1.0,并且它们被归一化,见下文:

def show_topic(self, topicid, topn=10):
    topic = self.state.get_lambda()[topicid]
    topic = topic / topic.sum() # normalize to probability dist
    ...

使用 Python运行示例代码Latent Dirichlet Allocation (LDA)并调用 get_lambda,可以看到 lambda 值有时高于 1.0。

ldamodel.state.get_lambda()[1]

给出:

array([ 1.48214337,  1.48168697,  0.50442377,  0.50399559,  0.50400832,
    0.5047193 ,  0.50375875,  0.50376053,  1.50224118,  0.50376574,
    0.5037527 ,  0.50377459,  0.50376621,  1.49831418,  1.49832577,
    1.49831855,  1.49831883,  1.49831596,  1.51053093,  3.49684196,
    1.49832204,  1.49832512,  0.50316907,  0.50321838,  0.50328253,
    0.50319543,  0.50317986,  0.50318815,  0.50314213,  0.5031702 ,
    1.49635267,  1.49634655])

什么是最好的 eps 选择?不规范化概率分布并在截止值中使用原始值会更好吗?是否最好在每个主题中使用最大概率值并以此为基础?

在我的实际数据集中,有时 0.01 的 eps 实际上会创建一个无字主题!

更新

玩不同数量的主题时,我注意到如果我有 2 个带有load_reuters数据的主题,我会得到 eps=0.01

Topic 0: ; 
Topic 1: pope; 0.013

我相信主题 0 可以解释为其他所有内容,或者需要更多主题。

arr=[]
for n in (range(2,50)):
  model = lda.LDA(n_topics=n, n_iter=20, random_state=1)
  model.fit(X)
  topic_word = model.topic_word_  # model.components_ also works
  arr.append(
    (min([max(topic_word[i]) for i in range(model.n_topics)]),
     max([max(topic_word[i]) for i in range(model.n_topics)])))
plt.plot(arr)
...

所以看看这张图表,如果 n 低于 5 就太低了,并且在 20 之后的某个时间变平......

低密度脂蛋白

1个回答

重要的是要记住,诸如 LDA 之类的主题模型主要是为无监督文本摘要而开发的。因此,对于要显示多少个热门词,没有“最佳”选择。大多数关于主题模型的研究论文倾向于使用前 5-20 个单词。如果你使用超过 20 个单词,那么你就开始破坏简洁概括文本的目的。

公差太低,无法显示哪些词与每个主题相关。LDA 的主要目的是对词进行分组,以使每个主题中的主题词在该主题中的概率很高。如果选择了这么低的阈值,那么每个主题中会出现很多很多的单词,再次违背了简洁文本摘要的目的。要提取最可能的单词,最好选择的阈值。ϵ>0.01ϵ>0.9ϵ>0.8

使用 Gensim 时一般看到无词主题的问题可能是因为 Gensim 有自己的容差参数“minimum_probability”。此参数默认为 0.01(Gensim LDA 文档中对此进行了说明)。如果要查看每个主题的所有单词,无论它们出现在主题中的概率是否低,都可以设置 minimum_probability = 0。

对于 LDA,最好使用归一化概率(通过 ldamodel 使用“get_topic_terms”函数),因为它们是最易解释的。我不太熟悉 Gensim 如何估计主题词的概率,但未归一化的值可能是贝叶斯估计的结果,它与直接估计分母无关,因为(正如你所说)它只是归一化。