我正在试图找出分配给主题中每个单词的权重在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
}
答案 0 :(得分:2)
Mallet将每个单词标记分配给一个主题。 getSortedWords()
方法计算标记具有特定类型的单词数量(例如 knoflook ),并且还分配给主题 k 。将令牌划分为文档与此计算无关。
如果我理解正确,您会发现有1855个文档具有 knoflook 类型的单词标记,并且还有一个单词标记分配给主题 t1 。但是不能保证这两个令牌是相同的。
从其他研究食谱的工作来看,我猜大蒜是一种常见的成分,在许多情况下都会发生,并且很可能在许多主题中具有很高的可能性。如果将该词的许多实例分配给其他主题,那就不足为奇了。