В этом примере показано, как выбрать подходящее количество тем для скрытой модели распределения Дирихле (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 структура 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.
Удалите список стоп-слов (например, «and», «of» и «the»), используя removeStopWords.
Удаление слов, содержащих не более 2 символов removeShortWords.
Удаление слов с 15 или более символами с помощью removeLongWords.
Лемматизировать слова с помощью 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
addPartOfSpeechDetails | bagOfWords | bagOfWords | erasePunctuation | fitlda | ldaModel | logp | normalizeWords | removeEmptyDocuments | removeInfrequentWords | removeLongWords | removeShortWords | removeStopWords | tokenizedDocument