exponenta event banner

Выбор количества тем для модели LDA

В этом примере показано, как выбрать подходящее количество тем для скрытой модели распределения Дирихле (LDA).

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

Извлечение и предварительная обработка текстовых данных

Загрузите данные примера. Файл factoryReports.csv содержит заводские отчеты, включая текстовое описание и категориальные метки для каждого события. Извлеките текстовые данные из поля Description.

filename = "factoryReports.csv";
data = readtable(filename,'TextType','string');
textData = data.Description;

Маркировка и предварительная обработка текстовых данных с помощью функции preprocessText который указан в конце этого примера.

documents = preprocessText(textData);
documents(1:5)
ans = 
  5×1 tokenizedDocument:

    6 tokens: item occasionally get stuck scanner spool
    7 tokens: loud rattle bang sound come assembler piston
    4 tokens: cut power start plant
    3 tokens: fry capacitor assembler
    3 tokens: mixer trip fuse

Отложите 10% документов случайным образом для проверки.

numDocuments = numel(documents);
cvp = cvpartition(numDocuments,'HoldOut',0.1);
documentsTrain = documents(cvp.training);
documentsValidation = documents(cvp.test);

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

bag = bagOfWords(documentsTrain);
bag = removeInfrequentWords(bag,2);
bag = removeEmptyDocuments(bag);

Выбор количества тем

Цель состоит в том, чтобы выбрать ряд тем, которые минимизируют недоумение по сравнению с другим количеством тем. Это не единственное соображение: модели, подходящие с большим количеством тем, могут занять больше времени, чтобы сойтись. Чтобы увидеть эффекты компромисса, рассчитайте как качество посадки, так и время подгонки. Если оптимальное количество разделов велико, может потребоваться выбрать меньшее значение для ускорения процесса фитинга.

Подберите некоторые модели LDA для диапазона значений для количества разделов. Сравните время подгонки и недоумение каждой модели с ограниченным набором тестовых документов. Недоумение является вторым выходом в logp функция. Чтобы получить второй выход без назначения первого выхода чему-либо, используйте ~ символ. Время подгонки - TimeSinceStart значение для последней итерации. Это значение находится в History структура FitInfo свойства модели LDA.

Для более быстрого вписывания укажите 'Solver' быть 'savb'. Для подавления подробных выходных данных установите 'Verbose' кому 0. Это может занять несколько минут.

numTopicsRange = [5 10 15 20 40];
for i = 1:numel(numTopicsRange)
    numTopics = numTopicsRange(i);
    
    mdl = fitlda(bag,numTopics, ...
        'Solver','savb', ...
        'Verbose',0);
    
    [~,validationPerplexity(i)] = logp(mdl,documentsValidation);
    timeElapsed(i) = mdl.FitInfo.History.TimeSinceStart(end);
end

Показать недоумение и прошедшее время для каждого количества тем на графике. Постройте график недоумений на левой оси и времени, прошедшего на правой оси.

figure
yyaxis left
plot(numTopicsRange,validationPerplexity,'+-')
ylabel("Validation Perplexity")

yyaxis right
plot(numTopicsRange,timeElapsed,'o-')
ylabel("Time Elapsed (s)")

legend(["Validation Perplexity" "Time Elapsed (s)"],'Location','southeast')
xlabel("Number of Topics")

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

Пример функции предварительной обработки

Функция preprocessText, выполняет следующие шаги в порядке:

  1. Преобразование текстовых данных в строчные с помощью lower.

  2. Маркировка текста с помощью tokenizedDocument.

  3. Стереть пунктуацию с помощью erasePunctuation.

  4. Удалите список стоп-слов (например, «and», «of» и «the»), используя removeStopWords.

  5. Удаление слов, содержащих не более 2 символов removeShortWords.

  6. Удаление слов с 15 или более символами с помощью removeLongWords.

  7. Лемматизировать слова с помощью normalizeWords.

function documents = preprocessText(textData)

% Convert the text data to lowercase.
cleanTextData = lower(textData);

% Tokenize the text.
documents = tokenizedDocument(cleanTextData);

% Erase punctuation.
documents = erasePunctuation(documents);

% Remove a list of stop words.
documents = removeStopWords(documents);

% Remove words with 2 or fewer characters, and words with 15 or greater
% characters.
documents = removeShortWords(documents,2);
documents = removeLongWords(documents,15);

% Lemmatize the words.
documents = addPartOfSpeechDetails(documents);
documents = normalizeWords(documents,'Style','lemma');
end

См. также

| | | | | | | | | | | | |

Связанные темы