Сравните решатели LDA

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

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

rng('default')

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

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

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

Отложите 10% документов наугад для валидации.

numDocuments = numel(textData);
cvp = cvpartition(numDocuments,'HoldOut',0.1);
textDataTrain = textData(training(cvp));
textDataValidation = textData(test(cvp));

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

documentsTrain = preprocessText(textDataTrain);
documentsValidation = preprocessText(textDataValidation);

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

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

Соответствуйте и сравните модели

Для каждого из решателей LDA соответствуйте модели LDA 60 темами. Чтобы отличить решатели при графическом выводе результатов на тех же осях, задайте различные свойства строки для каждого решателя.

numTopics = 60;
solvers = ["cgs" "avb" "cvb0" "savb"];
lineSpecs = ["+-" "*-" "x-" "o-"];

Для данных о валидации создайте модель сумки слов из документов валидации.

validationData = bagOfWords(documentsValidation);

Для каждого из решателей LDA соответствуйте модели, установите начальную концентрацию темы на 1 и задайте, чтобы не соответствовать параметру концентрации темы. Используя данные в свойстве FitInfo подходящих моделей LDA, постройте недоумение валидации, и время протекло. Постройте время, истекшее в логарифмическом масштабе. Это может занять до часа, чтобы запуститься.

Код для удаления NaNs необходим из-за причуды стохастического решателя 'savb'. Для этого решателя функция оценивает недоумение валидации после каждой передачи данных. Функция не оценивает недоумение валидации для каждой итерации (мини-пакет) и сообщает о NaNs в свойстве FitInfo. Чтобы построить недоумение валидации, удалите NaNs из значений, о которых сообщают.

figure
for i = 1:numel(solvers)
    solver = solvers(i);
    lineSpec = lineSpecs(i);
    
    mdl = fitlda(bag,numTopics, ...
        'Solver',solver, ...
        'InitialTopicConcentration',1, ...
        'FitTopicConcentration',false, ...
        'ValidationData',validationData, ...
        'Verbose',0);
    
    history = mdl.FitInfo.History;
    
    timeElapsed = history.TimeSinceStart;
    validationPerplexity = history.ValidationPerplexity;
    
    % Remove NaNs.
    idx = isnan(validationPerplexity);
    timeElapsed(idx) = [];
    validationPerplexity(idx) = [];
    
    semilogx(timeElapsed,validationPerplexity,lineSpec)
    hold on
end
hold off
xlabel("Time Elapsed (s)")
ylabel("Validation Perplexity")
legend(solvers)

Для стохастического решателя "savb" функция, по умолчанию, проходит через данные тренировки однажды. Чтобы обработать больше передач данных, установите 'DataPassLimit' на большее значение (значение по умолчанию равняется 1). Для пакетных решателей ("cgs", "avb", и "cvb0"), чтобы сократить количество итераций раньше соответствовал моделям, устанавливал опцию 'IterationLimit' на нижнее значение (значение по умолчанию равняется 100).

Более низкое недоумение валидации предлагает лучшую подгонку. Обычно, решатели "savb" и "cgs" сходятся быстро к хорошей подгонке. "cvb0" решателя может сходиться к лучшей подгонке, но он может взять намного дольше, чтобы сходиться.

Для свойства FitInfo функция fitlda оценивает недоумение валидации от вероятностей документа в оценках наибольшего правдоподобия вероятностей на тематику документа. Это обычно более быстро, чтобы вычислить, но может быть менее точным, чем другие методы. Также вычислите недоумение валидации с помощью функции logp. Эта функция вычисляет более точные значения, но может занять больше времени, чтобы запуститься. Для примера, показывающего, как вычислить недоумение с помощью logp, смотрите, Вычисляют Логарифмические Вероятности Документа из Матрицы Для подсчета количества слов.

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

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

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

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

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

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

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

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

function documents = preprocessText(textData)

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

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

% 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);

end

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

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

Похожие темы