Этот пример показывает, как использовать модель темы Скрытого выделения Дирихле (LDA), чтобы анализировать текстовые данные.
Модель Latent Dirichlet Allocation (LDA) является моделью темы, которая обнаруживает базовые темы в наборе документов и выводит вероятности слова в темах.
Чтобы воспроизвести результаты этого примера, установите rng
на 'default'
.
rng('default')
Загрузите данные в качестве примера. Файл weatherReports.csv
содержит прогнозы погоды, включая текстовое описание и категориальные метки для каждого события.
data = readtable("weatherReports.csv",'TextType','string'); head(data)
ans=8×16 table
Time event_id state event_type damage_property damage_crops begin_lat begin_lon end_lat end_lon event_narrative storm_duration begin_day end_day year end_timestamp
____________________ __________ ________________ ___________________ _______________ ____________ _________ _________ _______ _______ _________________________________________________________________________________________________________________________________________________________________________________________________ ______________ _________ _______ ____ ____________________
22-Jul-2016 16:10:00 6.4433e+05 "MISSISSIPPI" "Thunderstorm Wind" "" "0.00K" 34.14 -88.63 34.122 -88.626 "Large tree down between Plantersville and Nettleton." 00:05:00 22 22 2016 22-Jul-0016 16:15:00
15-Jul-2016 17:15:00 6.5182e+05 "SOUTH CAROLINA" "Heavy Rain" "2.00K" "0.00K" 34.94 -81.03 34.94 -81.03 "One to two feet of deep standing water developed on a street on the Winthrop University campus after more than an inch of rain fell in less than an hour. One vehicle was stalled in the water." 00:00:00 15 15 2016 15-Jul-0016 17:15:00
15-Jul-2016 17:25:00 6.5183e+05 "SOUTH CAROLINA" "Thunderstorm Wind" "0.00K" "0.00K" 35.01 -80.93 35.01 -80.93 "NWS Columbia relayed a report of trees blown down along Tom Hall St." 00:00:00 15 15 2016 15-Jul-0016 17:25:00
16-Jul-2016 12:46:00 6.5183e+05 "NORTH CAROLINA" "Thunderstorm Wind" "0.00K" "0.00K" 35.64 -82.14 35.64 -82.14 "Media reported two trees blown down along I-40 in the Old Fort area." 00:00:00 16 16 2016 16-Jul-0016 12:46:00
15-Jul-2016 14:28:00 6.4332e+05 "MISSOURI" "Hail" "" "" 36.45 -89.97 36.45 -89.97 "" 00:07:00 15 15 2016 15-Jul-0016 14:35:00
15-Jul-2016 16:31:00 6.4332e+05 "ARKANSAS" "Thunderstorm Wind" "" "0.00K" 35.85 -90.1 35.838 -90.087 "A few tree limbs greater than 6 inches down on HWY 18 in Roseland." 00:09:00 15 15 2016 15-Jul-0016 16:40:00
15-Jul-2016 16:03:00 6.4343e+05 "TENNESSEE" "Thunderstorm Wind" "20.00K" "0.00K" 35.056 -89.937 35.05 -89.904 "Awning blown off a building on Lamar Avenue. Multiple trees down near the intersection of Winchester and Perkins." 00:07:00 15 15 2016 15-Jul-0016 16:10:00
15-Jul-2016 17:27:00 6.4344e+05 "TENNESSEE" "Hail" "" "" 35.385 -89.78 35.385 -89.78 "Quarter size hail near Rosemark." 00:05:00 15 15 2016 15-Jul-0016 17:32:00
Извлеките текстовые данные из поля event_narrative
.
textData = data.event_narrative; textData(1:10)
ans = 10×1 string array
"Large tree down between Plantersville and Nettleton."
"One to two feet of deep standing water developed on a street on the Winthrop University campus after more than an inch of rain fell in less than an hour. One vehicle was stalled in the water."
"NWS Columbia relayed a report of trees blown down along Tom Hall St."
"Media reported two trees blown down along I-40 in the Old Fort area."
""
"A few tree limbs greater than 6 inches down on HWY 18 in Roseland."
"Awning blown off a building on Lamar Avenue. Multiple trees down near the intersection of Winchester and Perkins."
"Quarter size hail near Rosemark."
"Tin roof ripped off house on Old Memphis Road near Billings Drive. Several large trees down in the area."
"Powerlines down at Walnut Grove and Cherry Lane roads."
Создайте функцию, которая маркирует и предварительно обрабатывает текстовые данные, таким образом, они могут использоваться для анализа. Функциональный preprocessText
, перечисленный в конце примера, выполняет следующие шаги по порядку:
Маркируйте текст с помощью tokenizedDocument
.
Lemmatize слова с помощью normalizeWords
.
Сотрите пунктуацию с помощью erasePunctuation
.
Удалите список слов остановки (такой как "и", и) использование removeStopWords
.
Удалите слова с 2 или меньшим количеством символов с помощью removeShortWords
.
Удалите слова с 15 или больше символами с помощью removeLongWords
.
Используйте функцию предварительной обработки preprocessText
, чтобы подготовить текстовые данные.
documents = preprocessText(textData); documents(1:5)
ans = 5×1 tokenizedDocument: 5 tokens: large tree down plantersville nettleton 18 tokens: two foot deep standing water develop street winthrop university campus inch rain fall less hour vehicle stall water 9 tokens: nws columbia relay report tree blow down tom hall 10 tokens: medium report two tree blow down i40 old fort area 0 tokens:
Создайте модель сумки слов из маркируемых документов.
bag = bagOfWords(documents)
bag = bagOfWords with properties: Counts: [36176×18469 double] Vocabulary: [1×18469 string] NumWords: 18469 NumDocuments: 36176
Удалите слова из модели сумки слов, которые имеют, не появляются больше чем два раза всего. Удалите любые документы, содержащие слова из модели сумки слов.
bag = removeInfrequentWords(bag,2); bag = removeEmptyDocuments(bag)
bag = bagOfWords with properties: Counts: [28137×6974 double] Vocabulary: [1×6974 string] NumWords: 6974 NumDocuments: 28137
Соответствуйте модели 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("A tree is downed outside Apple Hill Drive, Natick"); 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