В этом примере показано, как использовать модель темы Скрытого выделения Дирихле (LDA), чтобы анализировать текстовые данные.
Модель Latent Dirichlet Allocation (LDA) является моделью темы, которая обнаруживает базовые темы в наборе документов и выводит вероятности слова в темах.
Загрузите данные в качестве примера. Файл factoryReports.csv
содержит отчеты фабрики, включая текстовое описание и категориальные метки для каждого события.
data = readtable("factoryReports.csv",'TextType','string'); head(data)
ans=8×5 table
Description Category Urgency Resolution Cost
_____________________________________________________________________ ____________________ ________ ____________________ _____
"Items are occasionally getting stuck in the scanner spools." "Mechanical Failure" "Medium" "Readjust Machine" 45
"Loud rattling and banging sounds are coming from assembler pistons." "Mechanical Failure" "Medium" "Readjust Machine" 35
"There are cuts to the power when starting the plant." "Electronic Failure" "High" "Full Replacement" 16200
"Fried capacitors in the assembler." "Electronic Failure" "High" "Replace Components" 352
"Mixer tripped the fuses." "Electronic Failure" "Low" "Add to Watch List" 55
"Burst pipe in the constructing agent is spraying coolant." "Leak" "High" "Replace Components" 371
"A fuse is blown in the mixer." "Electronic Failure" "Low" "Replace Components" 441
"Things continue to tumble off of the belt." "Mechanical Failure" "Low" "Readjust Machine" 38
Извлеките текстовые данные из поля Description
.
textData = data.Description; textData(1:10)
ans = 10×1 string
"Items are occasionally getting stuck in the scanner spools."
"Loud rattling and banging sounds are coming from assembler pistons."
"There are cuts to the power when starting the plant."
"Fried capacitors in the assembler."
"Mixer tripped the fuses."
"Burst pipe in the constructing agent is spraying coolant."
"A fuse is blown in the mixer."
"Things continue to tumble off of the belt."
"Falling items from the conveyor belt."
"The scanner reel is split, it will soon begin to curve."
Создайте функцию, которая маркирует и предварительно обрабатывает текстовые данные, таким образом, они могут использоваться для анализа. Функциональный preprocessText
, перечисленный в конце примера, выполняет следующие шаги в порядке:
Маркируйте текст с помощью tokenizedDocument
.
Lemmatize слова с помощью normalizeWords
.
Сотрите пунктуацию с помощью erasePunctuation
.
Удалите список слов остановки (такой как "и", и) использование removeStopWords
.
Удалите слова с 2 или меньшим количеством символов с помощью removeShortWords
.
Удалите слова с 15 или больше символами с помощью removeLongWords
.
Используйте функцию предварительной обработки preprocessText
подготовить текстовые данные.
documents = preprocessText(textData); documents(1:5)
ans = 5×1 tokenizedDocument: 6 tokens: items 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
Создайте модель сумки слов из маркируемых документов.
bag = bagOfWords(documents)
bag = bagOfWords with properties: Counts: [480×351 double] Vocabulary: [1×351 string] NumWords: 351 NumDocuments: 480
Удалите слова из модели сумки слов, которые имеют, не появляются больше чем два раза всего. Удалите любые документы, содержащие слова из модели сумки слов.
bag = removeInfrequentWords(bag,2); bag = removeEmptyDocuments(bag)
bag = bagOfWords with properties: Counts: [480×162 double] Vocabulary: [1×162 string] NumWords: 162 NumDocuments: 480
Подбирайте модель LDA с 7 темами. Для примера, показывающего, как выбрать количество тем, смотрите, Выбирают Number of Topics for LDA Model. Чтобы подавить многословный выход, установите 'Verbose'
к 0.
numTopics = 7;
mdl = fitlda(bag,numTopics,'Verbose',0);
Если у вас есть большой набор данных, то стохастический аппроксимированный вариационный решатель Бейеса обычно лучше подходит, когда он может подбирать хорошую модель в меньшем количестве передач данных. Решатель по умолчанию для fitlda
(свернутый Гиббс, производящий), может быть более точным за счет занимания больше времени, чтобы запуститься. Чтобы использовать стохастического аппроксимированного вариационного Бейеса, установите 'Solver'
опция к 'savb'
. Для примера, показывающего, как сравнить решатели LDA, смотрите, Сравнивают Решатели LDA.
Можно использовать облака слова, чтобы просмотреть слова с самыми высокими вероятностями в каждой теме. Визуализируйте первые четыре темы с помощью облаков слова.
figure; for topicIdx = 1:4 subplot(2,2,topicIdx) wordcloud(mdl,topicIdx); title("Topic " + topicIdx) end
Используйте transform
преобразовать документы в векторы из вероятностей темы.
newDocument = tokenizedDocument("Coolant is pooling underneath sorter."); topicMixture = transform(mdl,newDocument); figure bar(topicMixture) xlabel("Topic Index") ylabel("Probability") title("Document Topic Probabilities")
Визуализируйте несколько смесей темы с помощью сложенных столбчатых диаграмм. Визуализируйте смеси темы первых 5 входных документов.
figure topicMixtures = transform(mdl,documents(1:5)); barh(topicMixtures(1:5,:),'stacked') xlim([0 1]) title("Topic Mixtures") xlabel("Topic Probability") ylabel("Document") legend("Topic " + string(1:numTopics),'Location','northeastoutside')
Функциональный preprocessText
, выполняет следующие шаги в порядке:
Маркируйте текст с помощью tokenizedDocument
.
Lemmatize слова с помощью normalizeWords
.
Сотрите пунктуацию с помощью erasePunctuation
.
Удалите список слов остановки (такой как "и", и) использование removeStopWords
.
Удалите слова с 2 или меньшим количеством символов с помощью removeShortWords
.
Удалите слова с 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
addPartOfSpeechDetails
| bagOfWords
| fitlda
| ldaModel
| removeEmptyDocuments
| removeInfrequentWords
| removeStopWords
| tokenizedDocument
| transform
| wordcloud