如何通过文本挖掘实现文本的(统计)主题比较?

How to Implement a (statistical) Thematic Comparison of Texts via Text-Mining?

我尝试比较 'text-files' 形式的文本内容。
例如:我有 100 篇关于动物的文章,我想分析每篇文章讨论的是什么动物。
我正在寻找如下分析输出:doc1: 60% cats, 10% rabbits, 10% dogs, 0% elephants, 20% else", "doc2: 0% cats, 10% rabbits, 40% dogs, ...

我已经阅读了很多有关文本分类的潜在狄利克雷分配(以及每个主题的词概率)的文章,但完全无监督的方法似乎不适合我的文档集。

尝试在 Python 中实现 LDA-Stuff 我知道要准备数据(标记化,lemmatizing/stemming),但我不知道接下来的步骤。我是否必须为每个主题(动物)生成训练数据,我该如何实现?

我还看过 gensim 中通过 eta-value 操纵主题的教程,但我不知道如何利用它来对我有利。

我很感激任何可以引导我走向正确方向的建议。谢谢!

如果你想使用 LDA,你已经完成了处理(标记化,stemming/lemmatizing),下一步是创建 gensim 字典和语料库。假设您的文档集是一个像 [['my', 'first', 'doc'], ['the', 'second', 'doc']] 这样的列表列表,您可以这样进行:

dictionary = gensim.corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

然后使用适当数量的主题(=动物)创建模型:

model = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=num_animals)

您根本不需要自己生成训练数据。经过多次迭代后,LDA 算法本身对一组随机选择的未用于训练的保留测试文档执行质量检查。相应的度量通常称为 "perplexity" 或 "log likelihood",通常会在迭代期间显示。

最终创建模型后,您可以查看主题中的单词:

model.print_topics()

在很多情况下,您有一个文档集合,并且对包含的主题数量有一个大概的了解。因此,最相关的参数是主题编号。 由于您已经知道主题编号,因此您可以修改其他参数。我可以想象很难找到可以很容易地归因于一种动物的话题。请记住,尽管每个词都出现在每个主题中,因此即使 "elephant" 也会出现在 "cat" 主题中的某个地方。

要尝试的事情:

  • 对你的 stemming/lemmatization 更加严格,以合并更多具有相同含义的标记
  • 查看字典的 filter_extremes 功能以过滤非常常见或非常罕见的标记
  • 应用或扩展停用词过滤器以去除不相关的术语
  • 尝试使用 alpha(每个文档的主题流行度)和 eta(每个主题的标记流行度)值