В этом примере показано, как выбрать подходящее количество тем для модели скрытого выделения Дирихле (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
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
, выполняет следующие шаги в порядке:
Преобразуйте текстовые данные в нижний регистр с помощью lower
.
Маркируйте текст с помощью tokenizedDocument
.
Сотрите пунктуацию с помощью erasePunctuation
.
Удалите список слов остановки (такой как "и", и) использование removeStopWords
.
Удалите слова с 2 или меньшим количеством символов с помощью removeShortWords
.
Удалите слова с 15 или больше символами с помощью removeLongWords
.
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
tokenizedDocument
| bagOfWords
| removeStopWords
| logp
| bagOfWords
| fitlda
| ldaModel
| erasePunctuation
| removeShortWords
| removeLongWords
| normalizeWords
| addPartOfSpeechDetails
| removeInfrequentWords
| removeEmptyDocuments