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

В этом примере показано, как выбрать подходящее количество тем для модели скрытого выделения Дирихле (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);

Выберите 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 темами может быть хорошим выбором. Недоумение является низким по сравнению с моделями с различными количествами тем. С этим решателем прошедшее время для этого много тем также разумно. С другими решателями можно найти, что увеличение числа тем может привести к лучшей подгонке, но подбирать модель занимает больше времени, чтобы сходиться.

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

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

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

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

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

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

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

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

  7. Lemmatize слова с помощью 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

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

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

Похожие темы