Этот пример показывает, как выбрать подходящее количество тем для модели скрытого выделения Дирихле (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: (1,1) 5 tokens: large tree down plantersville nettleton (2,1) 18 tokens: two foot deep standing water develop street winthrop unive… (3,1) 9 tokens: nws columbia relayed report tree blow down tom hall (4,1) 10 tokens: medium report two tree blow down i40 old fort area (5,1) 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);
Цель состоит в том, чтобы выбрать много тем, которые минимизируют недоумение, является самым низким по сравнению с другими количествами тем. Это не единственный фактор: подгонка моделей с большим числом тем может занять больше времени, чтобы сходиться. Чтобы видеть эффекты компромисса, вычислите и качество подгонки и подходящее время. Если оптимальное количество тем высоко, то вы можете хотеть выбрать нижнее значение, чтобы ускорить подходящий процесс.
Соответствуйте некоторым моделям LDA для области значений значений для количества тем. Сравните подходящее время и недоумение каждой модели на протянутом наборе тестовых документов. Недоумением является второй вывод к функции logp
. Чтобы получить второй вывод, не присваивая первый вывод ничему, используйте символ ~
. Подходящее время является значением TimeSinceStart
для последней итерации. Это значение находится в struct 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 темами может быть хорошим выбором. Недоумение является низким по сравнению с моделями с различными количествами тем. С этим решателем прошедшее время для этого много тем также разумно. С другими решателями можно найти, что увеличение числа тем может привести к лучшей подгонке, но подбор кривой модели занимает больше времени, чтобы сходиться.
Функциональный preprocessWeatherNarratives
, выполняет следующие шаги по порядку:
Преобразуйте текстовые данные в нижний регистр с помощью lower
.
Маркируйте текст с помощью tokenizedDocument
.
Сотрите пунктуацию с помощью erasePunctuation
.
Удалите список слов остановки (такой как "и", и) использование removeStopWords
.
Удалите слова с 2 или меньшим количеством символов с помощью removeShortWords
.
Удалите слова с 15 или больше символами с помощью removeLongWords
.
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
addPartOfSpeechDetails
| bagOfWords
| bagOfWords
| erasePunctuation
| fitlda
| ldaModel
| logp
| normalizeWords
| removeEmptyDocuments
| removeInfrequentWords
| removeLongWords
| removeShortWords
| removeStopWords
| tokenizedDocument