Анализируйте текстовые данные Используя фразы многословные

Этот пример показывает, как анализировать текст с помощью подсчета частот n-граммы.

N-граммы

N-грамма является кортежем n последовательные слова. Например, биграмма (случай, когда n=2) пара последовательных слов, таких как "проливной дождь". Униграмма (случай, когда n=1) отдельное слово. Мешок 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, перечисленный в конце примера, выполняет следующие шаги:

  1. Преобразуйте текстовые данные в нижний регистр с помощью lower.

  2. Маркируйте текст с помощью tokenizedDocument.

  3. Сотрите пунктуацию с помощью erasePunctuation.

  4. Удалите список слов остановки (такой как "и", и) использование removeStopWords.

  5. Удалите слова с 2 или меньшим количеством символов с помощью removeShortWords.

  6. Удалите слова с 15 или больше символами с помощью removeLongWords.

  7. 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

Создайте Word Cloud биграмм

Создайте облако слова биграмм первым созданием мешка 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")

Подходящая модель темы к мешку N граммов

Модель 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 выполняет следующие шаги по порядку:

  1. Преобразуйте текстовые данные в нижний регистр с помощью lower.

  2. Маркируйте текст с помощью tokenizedDocument.

  3. Сотрите пунктуацию с помощью erasePunctuation.

  4. Удалите список слов остановки (такой как "и", и) использование removeStopWords.

  5. Удалите слова с 2 или меньшим количеством символов с помощью removeShortWords.

  6. Удалите слова с 15 или больше символами с помощью removeLongWords.

  7. 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

Смотрите также

| | | | | | | | | | | |

Похожие темы