о выводе lda

Прямо сейчас я использую инструмент моделирования тем LDA из пакета MALLET, чтобы определять темы в моих документах. Поначалу все нормально, 20 тем достал. Однако когда я пытаюсь вывести новый документ с помощью модели, результат несколько сбивает с толку.

Например, я намеренно запускаю свою модель над документом, который я создал вручную и который не содержит ничего, кроме ключевых слов из одной из тем "FLU", но распределение тем, которое я получил, было <0,1 для каждой темы. Затем я пробую то же самое с одним из уже отобранных документов, который имеет высокий балл 0,7 по одной из тем. Снова случилось то же самое.

Может кто-нибудь объяснить причину?

Пытался спросить в списке рассылки MALLET, но, видимо, никто не ответил.


person goh    schedule 07.12.2010    source источник
comment
Когда вы говорите, что запускаете свою модель над созданным вами документом, что именно вы делаете? Вы пытаетесь повторно запустить часть логического вывода алгоритма LDA в новом документе? Если это так, ваш результат будет ожидаемым поведением. Похоже, вы пытаетесь обучить новую модель исключительно на основе нового документа. Не могли бы вы ответить своей настоящей командой? Алгоритм LDA не принимает новые документы в тематические распределения без необходимости делать выводы по всем исходным документам, а также является алгоритмом по набору документов.   -  person user1698895    schedule 06.07.2011


Ответы (4)


Я тоже очень мало знаю о МОЛОТОК, но в документации упоминается об этом ...

Вывод темы

--inferencer-filename [FILENAME] Создать инструмент вывода темы на основе текущей обученной модели. Используйте команду MALLET bin / mallet infer-themes --help, чтобы получить информацию об использовании вывода темы.

Обратите внимание, что вы должны убедиться, что новые данные совместимы с данными вашего обучения. Используйте параметр --use-pipe-from [MALLET TRAINING FILE] в команде MALLET bin / mallet import-file или import-dir, чтобы указать обучающий файл.

Может ты забыл это сделать? Мне действительно кажется, что данные, на которых вы тренируетесь, не в том же формате, что и данные, на которых вы тестируете.

person Stompchicken    schedule 07.12.2010
comment
привет @stompchicken, пробовали с командой --use-pipe-from. - person goh; 07.12.2010
comment
Ну что ж. В таком случае я понятия не имею. Если можете, попробуйте проверить данные обучения и тестирования, чтобы убедиться, что документы представлены одинаково. - person Stompchicken; 07.12.2010

У меня были те же трудности, что и у Маллета. Позже я обнаружил, что проблема в том, что документы нужно читать через Pipe, которая когда-то использовалась для чтения в учебных документах.

Вот образец для чтения в учебных документах:

ImportExample importerTrain = new ImportExample();//this is an example class in MALLET to import docs.   
InstanceList training= importer.readDirectory(new File(trainingDir));
training.save(new File(outputFile));

При чтении документов в выводе темы:

InstanceList training = InstanceList.load(new File(outputFile));
Pipe pipe = training.getPipe();
ImportExample importer = new ImportExample();
importer.pipe = pipe; //use the same pipe
InstanceList testing = importer.readDirectory(new File(testDir));

Я получил подсказку из одного вопроса, размещенного в их архиве: http://thread.gmane.org/gmane.comp.ai.mallet.devel/829

person Arrika    schedule 01.09.2011

Раскрытие информации: я знаком с методами и математикой, обычно используемыми для вывода темы, но я мало знаком с MALLET.
Я надеюсь, что эти полуобразованные предположения приведут вас к решению. Без гарантии ;-)

Я предполагаю, что вы используете команду молотка hlda для обучения модели.
Несколько вещей, которые могли пойти не так:

  • Убедитесь, что вы использовали параметр --keep-sequence на этапе импорта процесса. По умолчанию молоток сохраняет входные данные как простые мешки слов, теряя порядок, в котором слова были изначально найдены. Это может подойти для основных задач классификации, но не для тематического моделирования.
  • Помните, что выборка Гиббса, используемая молотком, - это случайный процесс; ожидайте вариаций, особенно с небольшими выборками. Во время тестов вы можете указать одно и то же случайное начальное число для каждой последующей итерации.
  • Каков размер ваших тренировочных данных? 20 тем кажутся много для начальных тестов, которые обычно основаны на небольших, вручную созданных и / или быстро собранных наборах для обучения и тестирования.
  • помните, что вывод темы основан на последовательностях слов, а не на отдельных ключевых словах (в вашем описании созданного вручную тестового документа упоминаются «ключевые слова», а не «выражения» или «фразы» ")
person mjv    schedule 07.12.2010
comment
Привет @mjv, на самом деле я использовал команду train-themes (я предполагаю, что она использует parallelTopicModel). 1. да, я использовал опцию --keep-sequence. 2. Мои данные по обучению состоят из 8000+ документов. Я считаю, что это адекватный набор данных? - person goh; 07.12.2010
comment
3. Разве LDA не на словах? Но даже если мой вручную созданный тестовый документ не дает результатов, не должен ли уже выбранный документ давать во время вывода несколько схожие результаты с исходным распределением тем? - person goh; 07.12.2010

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

Создайте свои тренировочные данные:

$BIN_DIR/mallet import-file --input $DIRECTORY/data.input --output $DIRECTORY/data.mallet --keep-sequence --token-regex '\w+'

где data.input - это документ, содержащий идентификатор вашего файла, метку и последовательность токенов или идентификаторов токенов. Затем обучите вашу модель на этих данных с параметрами, которые вам нравятся. Например:

$BIN_DIR/mallet train-topics --input $DIRECTORY/data.mallet \
      --num-topics $TOPICS --output-state $DIRECTORY/topic-state.gz \
      --output-doc-topics $DIRECTORY/doc-topics.gz \
      --output-topic-keys $DIRECTORY/topic-words.gz --num-top-words 500 \
      --num-iterations 1000

Позже вы можете создать логический вывод, используя вашу обученную модель и обучающие данные:

bin/mallet train-topics --input $DIRECTORY/data.mallet --num-topics NUMBER --input-state $DIRECTORY/topic-state.gz --no-inference --inferencer-filename $DIRECTORY/inferencer-model

Теперь создайте файл для новых документов, используя конвейер из обучающих данных:

bin/mallet import-file --input $DIRECTORY/new_data.input --output $DIRECTORY/new_data.mallet --use-pipe-from $DIRECTORY/data.mallet --keep-sequence --token-regex '\w+'

Вывести темы по новым документам:

bin/mallet infer-topics --inferencer $DIRECTORY/inferencer-model --input $DIRECTORY/new_data.mallet --output-doc-topics $DIRECTORY/new_data_doc_topics --num-iterations 1000
person lucy3_li    schedule 02.03.2021