Этот пример показывает, как анализировать текст с помощью подсчета частот n-граммы.
N-грамма является кортежем последовательные слова. Например, биграмма (случай, когда ) пара последовательных слов, таких как "проливной дождь". Униграмма (случай, когда ) отдельное слово. Мешок n модели граммов записывает число раз, что различные N-граммы появляются в наборах документа.
Используя мешок n модели граммов, можно сохранить больше информации об упорядоченном расположении слова в данных об исходном тексте. Например, мешок n модели граммов лучше подходит для получения коротких фраз, которые появляются в тексте, таком как "проливной дождь" и "ветры грозы".
Чтобы создать мешок n модели граммов, используйте bagOfNgrams
. Можно ввести объекты bagOfNgrams
в другие функции Text Analytics Toolbox, такие как wordcloud
и fitlda
.
Чтобы воспроизвести результаты этого примера, установите rng
на 'default'
.
rng('default')
Загрузите данные в качестве примера. Файл weatherReports.csv
содержит прогнозы погоды, включая текстовое описание и категориальные метки для каждого события. Удалите строки с пустыми отчетами.
filename = "weatherReports.csv"; data = readtable(filename,'TextType','String'); idx = strlength(data.event_narrative) == 0; data(idx,:) = [];
Извлеките текстовые данные из таблицы и просмотрите первые несколько отчетов.
textData = data.event_narrative; textData(1:5)
ans = 5×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."
Создайте функцию, которая маркирует и предварительно обрабатывает текстовые данные, таким образом, они могут использоваться для анализа. Функциональный preprocessWeatherNarratives
, перечисленный в конце примера, выполняет следующие шаги:
Преобразуйте текстовые данные в нижний регистр с помощью lower
.
Маркируйте текст с помощью tokenizedDocument
.
Сотрите пунктуацию с помощью erasePunctuation
.
Удалите список слов остановки (такой как "и", и) использование removeStopWords
.
Удалите слова с 2 или меньшим количеством символов с помощью removeShortWords
.
Удалите слова с 15 или больше символами с помощью removeLongWords
.
Lemmatize слова с помощью normalizeWords
.
Используйте пример, предварительно обрабатывающий функциональный 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) 8 tokens: few tree limb great inches down hwy roseland
Создайте облако слова биграмм первым созданием мешка n модели граммов использование bagOfNgrams
и затем введение модели к wordcloud
.
Чтобы считать N-граммы длины 2 (биграммы), используйте bagOfNgrams
с опциями по умолчанию.
bag = bagOfNgrams(documents)
bag = bagOfNgrams with properties: Counts: [28138×117043 double] Vocabulary: [1×18409 string] Ngrams: [117043×2 string] NgramLengths: 2 NumNgrams: 117043 NumDocuments: 28138
Визуализируйте мешок n модели граммов использование облака слова.
figure
wordcloud(bag);
title("Weather Reports: Preprocessed Bigrams")
Модель Latent Dirichlet Allocation (LDA) является моделью темы, которая обнаруживает базовые темы в наборе документов и выводит вероятности слова в темах.
Создайте модель темы LDA с 10 темами с помощью fitlda
. Функция соответствует модели LDA путем обработки N-грамм как отдельных слов.
mdl = fitlda(bag,10);
Initial topic assignments sampled in 0.741989 seconds. ===================================================================================== | Iteration | Time per | Relative | Training | Topic | Topic | | | iteration | change in | perplexity | concentration | concentration | | | (seconds) | log(L) | | | iterations | ===================================================================================== | 0 | 2.81 | | 2.043e+04 | 2.500 | 0 | | 1 | 3.62 | 6.8345e-02 | 1.083e+04 | 2.500 | 0 | | 2 | 3.54 | 1.9129e-03 | 1.064e+04 | 2.500 | 0 | | 3 | 3.79 | 2.4671e-04 | 1.061e+04 | 2.500 | 0 | | 4 | 3.81 | 8.5912e-05 | 1.060e+04 | 2.500 | 0 | =====================================================================================
Визуализируйте первые четыре темы как облака слова.
figure for i = 1:4 subplot(2,2,i) wordcloud(mdl,i); title("LDA Topic " + i) end
Облака слова обычно подсвечивают биграммы co-появления в темах LDA. Графики функций биграммы с размерами согласно их вероятностям для заданных тем LDA.
Чтобы анализировать текст с помощью более длинных фраз, задайте опцию 'NGramLengths'
в bagOfNgrams
, чтобы быть большим значением.
При работе с более длинными фразами может быть полезно сохранить слова остановки в модели. Например, обнаружить фразу "не счастливо", сохраняют слова остановки "," и "не" в модели.
Предварительно обработайте текст. Сотрите пунктуацию с помощью erasePunctuation
и маркируйте использование tokenizedDocument
.
cleanTextData = erasePunctuation(textData); documents = tokenizedDocument(cleanTextData);
Чтобы считать N-граммы длины 3 (триграммы), используйте bagOfNgrams
и задайте 'NGramLengths'
, чтобы быть 3.
bag = bagOfNgrams(documents,'NGramLengths',3);
Визуализируйте мешок n модели граммов использование облака слова. Облако слова триграмм лучше показывает контекст отдельных слов.
figure
wordcloud(bag);
title("Weather Reports: Trigrams")
Просмотрите лучшие 10 триграмм и их подсчет частот с помощью topkngrams
.
tbl = topkngrams(bag,10)
tbl=10×3 table
Ngram Count NgramLength
________________________________________ _____ ___________
"inches" "of" "snow" 2075 3
"across" "the" "county" 1318 3
"were" "blown" "down" 1189 3
"wind" "gust" "of" 934 3
"A" "tree" "was" 860 3
"the" "intersection" "of" 812 3
"inches" "of" "rain" 739 3
"hail" "was" "reported" 648 3
"was" "blown" "down" 638 3
"and" "power" "lines" 631 3
Функциональный 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
| bagOfNgrams
| bagOfWords
| erasePunctuation
| fitlda
| ldaModel
| normalizeWords
| removeLongWords
| removeShortWords
| removeStopWords
| tokenizedDocument
| topkngrams
| wordcloud