Как рассчитывается вес слова в теме в Mallet?

Я пытаюсь выяснить, какой вес присваивается каждому слову в теме в Mallet.

Я предполагаю, что это какая-то форма подсчета документов. Однако мне трудно понять, как получается эта цифра.

В моей модели есть несколько слов, которые встречаются более чем в одной теме, и в каждой теме им присваивается разный вес, поэтому очевидно, что число не является количеством слов во всем корпусе. Моя следующая догадка заключалась в том, что число — это количество вхождений слова в общем наборе документов, назначенных теме, но когда я попытался проверить это вручную, это оказалось неверным.

В качестве примера: я тренирую модель на базе около 12 000 документов (альфа 0,1, бета 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 
     }

person Jeen Broekstra    schedule 08.11.2016    source источник


Ответы (1)


Маллет присваивает каждому токену слова тему. Метод getSortedWords() подсчитывает, сколько слов токенов относится к определенному типу (например, knoflook), а также относится к теме k. Разделение токенов на документы не имеет значения для данного расчета.

Если я правильно понимаю, вы обнаружите, что существует 1855 документов с токеном слова типа knoflook, а также с токеном слова, назначенным теме t1. Но нет никакой гарантии, что эти два токена одинаковы.

Из другой работы, посвященной рецептам, я бы предположил, что чеснок является распространенным ингредиентом, который встречается во многих контекстах и, вероятно, имеет высокую вероятность во многих темах. Неудивительно, если многие экземпляры этого слова относятся к другим темам.

person David Mimno    schedule 08.11.2016