Mallet 中一个词在一个话题中的权重是如何计算的?
How is the weight of a word in a topic calculated in 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
}
Mallet 将每个单词标记分配给一个主题。 getSortedWords()
方法计算有多少单词 tokens 属于特定类型(例如 knoflook)并且也分配给主题 k。将令牌划分为文档与此计算无关。
如果我没理解错的话,您会发现有 1855 个文档具有 knoflook 类型的词标记,并且还有一个分配给主题 t1。但是不能保证这两个标记是相同的。
从其他研究食谱的工作来看,我猜想大蒜是一种常见成分,在许多情况下都会出现,并且在许多主题中出现的概率可能很高。如果这个词的许多实例被分配给其他主题也就不足为奇了。
我想弄清楚分配给主题中每个单词的权重在 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
}
Mallet 将每个单词标记分配给一个主题。 getSortedWords()
方法计算有多少单词 tokens 属于特定类型(例如 knoflook)并且也分配给主题 k。将令牌划分为文档与此计算无关。
如果我没理解错的话,您会发现有 1855 个文档具有 knoflook 类型的词标记,并且还有一个分配给主题 t1。但是不能保证这两个标记是相同的。
从其他研究食谱的工作来看,我猜想大蒜是一种常见成分,在许多情况下都会出现,并且在许多主题中出现的概率可能很高。如果这个词的许多实例被分配给其他主题也就不足为奇了。