如何在Mallet中计算主题中单词的权重?

时间:2016-11-08 02:58:11

标签: topic-modeling mallet

我正在试图找出分配给主题中每个单词的权重在Mallet中的含义。

我假设它是某种形式的文件发生计数。但是,我很难弄清楚这个数字是如何产生的。

在我的模型中,有多个单词出现在多个主题中,并且在每个主题中他们分配了不同的权重,因此很明显,数字不是整个语料库中的单词计数。我的下一个猜测是,数字是分配给主题的文档总集中出现的单词,但是当我尝试手动验证时,这似乎是不正确的。

作为一个例子:我正在训练一个大约12,000个文档的语料库(alpha 0.1,beta 0.01,t = 50)。培训结束后,我的模型有以下主题:

t1 = "knoflook (158.0), olie (156.0), ...."

因此,'knoflook'这个词的权重为158.然而,当我手动计算我的语料库中包含分配了t1的文档的数量时,我得到了一个完全不同的数字(1855)。

当然,我的手动验证可能已经关闭,但一般来说,了解每个主题中的单词重量是如何得出的将是有用的。

顺便说一下,上面的主题是基于以下代码的渲染:

    // The data alphabet maps word IDs to strings
    Alphabet dataAlphabet = instances.getDataAlphabet();

    // Get an array of sorted sets of word ID/count pairs
    ArrayList<TreeSet<IDSorter>> topicSortedWords = topicModel.getSortedWords();

    for (int t = 0; t < numberOfTopics; t++) {
            Iterator<IDSorter> iterator = topicSortedWords.get(t).iterator();
            StringBuilder sb = new StringBuilder();
            while (iterator.hasNext()) {
                IDSorter idWeightPair = iterator.next();
                final String wordLabel = dataAlphabet.lookupObject(idWeightPair.getID()).toString();
                final double weight = idWeightPair.getWeight();
                sb.append(wordLabel + " (" + weight + "), ");
            }
            sb.setLength(sb.length() - 2);

            // sb.toString is now a human-readable representation of the topic 
     }

1 个答案:

答案 0 :(得分:2)

Mallet将每个单词标记分配给一个主题。 getSortedWords()方法计算标记具有特定类型的单词数量(例如 knoflook ),并且还分配给主题 k 。将令牌划分为文档与此计算无关。

如果我理解正确,您会发现有1855个文档具有 knoflook 类型的单词标记,并且还有一个单词标记分配给主题 t1 。但是不能保证这两个令牌是相同的。

从其他研究食谱的工作来看,我猜大蒜是一种常见的成分,在许多情况下都会发生,并且很可能在许多主题中具有很高的可能性。如果将该词的许多实例分配给其他主题,那就不足为奇了。