В этом примере показано, как анализировать текст с использованием n-граммовых отсчётов частоты.
n-грамм - кортеж из последовательные слова. Для примера - биграмма (случай, когда ) - пара последовательных слов, таких как «обильные осадки». Униграмма (случай, когда ) - одно слово. Модель сумки n-граммов регистрирует количество раз, когда различные n-граммы появляются в наборах документов.
Используя модель bag-of-n-gams, можно сохранить больше информации о упорядоченном расположении слов в исходных текстовых данных. Например, модель «мешок n-граммов» лучше подходит для захвата коротких выражений, которые появляются в тексте, таких как «обильные ливни» и «грозовые ветра».
Чтобы создать модель мешка n-граммов, используйте bagOfNgrams
. Можно вводить bagOfNgrams
объекты в другие функции Symbolic Math Toolbox, такие как wordcloud
и fitlda
.
Загрузите данные примера. Файл factoryReports.csv
содержит заводские отчеты, включая текстовое описание и категориальные метки для каждого события. Удалите строки с пустыми отчетами.
filename = "factoryReports.csv"; data = readtable(filename,'TextType','String');
Извлеките текстовые данные из таблицы и просмотрите первые несколько отчетов.
textData = data.Description; textData(1:5)
ans = 5×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."
Создайте функцию, которая токенизирует и предварительно обрабатывает текстовые данные, чтобы их можно было использовать для анализа. Функция preprocessText
приведенный в конце примера, выполняет следующие шаги:
Преобразуйте текстовые данные в строчные с помощью lower
.
Токенизация текста с помощью tokenizedDocument
.
Удалите пунктуацию с помощью erasePunctuation
.
Удалите список стоповых слов (таких как «and», «of», и «the») с помощью removeStopWords
.
Удалите слова с 2 или меньшим количеством символов, используя removeShortWords
.
Удалите слова с 15 или более символами, используя removeLongWords
.
Лемматизируйте слова, используя normalizeWords
.
Используйте функцию предварительной обработки в качестве примера preprocessTest
для подготовки текстовых данных.
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
Создайте облако слов биграмм путем создания сначала модели bag-of-gams с помощью bagOfNgrams
, а затем ввод модели в wordcloud
.
Для подсчета n-граммов длины 2 (биграммы) используйте bagOfNgrams
с опциями по умолчанию.
bag = bagOfNgrams(documents)
bag = bagOfNgrams with properties: Counts: [480×941 double] Vocabulary: [1×351 string] Ngrams: [941×2 string] NgramLengths: 2 NumNgrams: 941 NumDocuments: 480
Визуализируйте модель сумки n-граммов с помощью облака слов.
figure
wordcloud(bag);
title("Text Data: Preprocessed Bigrams")
Модель Latent Dirichlet Allocation (LDA) является тематической моделью, которая обнаруживает базовые темы в наборе документов и выводит вероятности слов в темах.
Создайте модель темы LDA с 10 темами с помощью fitlda
. Функция подходит для модели LDA, рассматривая n-граммы как одинарные слова.
mdl = fitlda(bag,10,'Verbose',0);
Визуализируйте первые четыре темы как облака слов.
figure for i = 1:4 subplot(2,2,i) wordcloud(mdl,i); title("LDA Topic " + i) end
Слово облака подсвечивают обычно сопутствующие биграммы в темах 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("Text Data: Trigrams")
Просмотрите топ-10 триграммов и их счетчиков частот, используя topkngrams
.
tbl = topkngrams(bag,10)
tbl=10×3 table
Ngram Count NgramLength
__________________________________ _____ ___________
"in" "the" "mixer" 14 3
"in" "the" "scanner" 13 3
"blown" "in" "the" 9 3
"the" "robot" "arm" 7 3
"stuck" "in" "the" 6 3
"is" "spraying" "coolant" 6 3
"from" "time" "to" 6 3
"time" "to" "time" 6 3
"heard" "in" "the" 6 3
"on" "the" "floor" 6 3
Функция 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
| bagOfNgrams
| bagOfWords
| erasePunctuation
| fitlda
| ldaModel
| normalizeWords
| removeLongWords
| removeShortWords
| removeStopWords
| tokenizedDocument
| topkngrams
| wordcloud