Выберите Number of Topics for LDA Model

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

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

Чтобы воспроизвести результаты этого примера, установите rng к 'default'.

rng('default')

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

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

filename = "weatherReports.csv";
data = readtable(filename,'TextType','string');
textData = data.event_narrative;

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

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

     5 tokens: large tree down plantersville nettleton
    18 tokens: two foot deep standing water develop street winthrop university campus inch rain fall less hour vehicle stall water
     9 tokens: nws columbia relayed report tree blow down tom hall
    10 tokens: medium report two tree blow down i40 old fort area
     0 tokens:

Отложите 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);

Выберите Number of Topics

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

Подбирайте некоторые модели LDA для области значений значений для количества тем. Сравните подходящее время и недоумение каждой модели на протянутом наборе тестовых документов. Недоумением является второй выход к logp функция. Чтобы получить второй выход, не присваивая первый выход ничему, используйте ~ символ. Подходящим временем является TimeSinceStart значение для последней итерации. Это значение находится в History struct 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 темами может быть хорошим выбором. Недоумение является низким по сравнению с моделями с различными количествами тем. С этим решателем прошедшее время для этого много тем также разумно. С другими решателями можно найти, что увеличение числа тем может привести к лучшей подгонке, но подбирать модель занимает больше времени, чтобы сходиться.

Функция предварительной обработки в качестве примера

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

  1. Преобразуйте текстовые данные в нижний регистр с помощью lower.

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

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

  4. Удалите список слов остановки (такой как "и", и) использование removeStopWords.

  5. Удалите слова с 2 или меньшим количеством символов с помощью removeShortWords.

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

  7. Lemmatize слова с помощью normalizeWords.

function [documents] = preprocessWeatherNarratives(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

Смотрите также

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

Похожие темы