Подготовка текстовых данных к анализу

В этом примере показано, как создать функцию, которая очищает и предварительно обрабатывает текстовые данные для анализа.

Текстовые данные могут быть большими и могут содержать много шума, который отрицательно влияет на статистический анализ. Для примера текстовые данные могут содержать следующее:

  • Изменения в случае, например, «new» и «New»

  • Изменения в словоформах, например «прогулка» и «ходьба»

  • Слова, которые добавляют шум, например, стоповые слова, такие как «the» и «of»

  • Пунктуация и специальные символы

  • Теги HTML и XML

Эти облака слов иллюстрируют анализ частоты слов, применяемый к некоторым необработанным текстовым данным из заводских отчетов, и предварительно обработанную версию тех же текстовых данных.

Загрузка и извлечение текстовых данных

Загрузите данные примера. Файл factoryReports.csv содержит заводские отчеты, включая текстовое описание и категориальные метки для каждого события.

filename = "factoryReports.csv";
data = readtable(filename,'TextType','string');

Извлеките текстовые данные из поля Description, и данные о метках из поля Category.

textData = data.Description;
labels = data.Category;
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."

Создание токенизированных документов

Создайте массив токенизированных документов.

cleanedDocuments = tokenizedDocument(textData);
cleanedDocuments(1:10)
ans = 
  10×1 tokenizedDocument:

    10 tokens: Items are occasionally getting stuck in the scanner spools .
    11 tokens: Loud rattling and banging sounds are coming from assembler pistons .
    11 tokens: There are cuts to the power when starting the plant .
     6 tokens: Fried capacitors in the assembler .
     5 tokens: Mixer tripped the fuses .
    10 tokens: Burst pipe in the constructing agent is spraying coolant .
     8 tokens: A fuse is blown in the mixer .
     9 tokens: Things continue to tumble off of the belt .
     7 tokens: Falling items from the conveyor belt .
    13 tokens: The scanner reel is split , it will soon begin to curve .

Для улучшения лемматизации добавьте часть сведений о речи в документы с помощью addPartOfSpeechDetails. Используйте addPartOfSpeech функция перед удалением стоповых слов и лемматизации.

cleanedDocuments = addPartOfSpeechDetails(cleanedDocuments);

Такие слова, как «a», «and», «to» и «the» (известные как стоповые слова), могут добавить шум к данным. Удалите список стоповых слов с помощью removeStopWords функция. Используйте removeStopWords функция перед использованием normalizeWords функция.

cleanedDocuments = removeStopWords(cleanedDocuments);
cleanedDocuments(1:10)
ans = 
  10×1 tokenizedDocument:

    7 tokens: Items occasionally getting stuck scanner spools .
    8 tokens: Loud rattling banging sounds coming assembler pistons .
    5 tokens: cuts power starting plant .
    4 tokens: Fried capacitors assembler .
    4 tokens: Mixer tripped fuses .
    7 tokens: Burst pipe constructing agent spraying coolant .
    4 tokens: fuse blown mixer .
    6 tokens: Things continue tumble off belt .
    5 tokens: Falling items conveyor belt .
    8 tokens: scanner reel split , soon begin curve .

Лемматизируйте слова, используя normalizeWords.

cleanedDocuments = normalizeWords(cleanedDocuments,'Style','lemma');
cleanedDocuments(1:10)
ans = 
  10×1 tokenizedDocument:

    7 tokens: items occasionally get stuck scanner spool .
    8 tokens: loud rattle bang sound come assembler piston .
    5 tokens: cut power start plant .
    4 tokens: fry capacitor assembler .
    4 tokens: mixer trip fuse .
    7 tokens: burst pipe constructing agent spray coolant .
    4 tokens: fuse blow mixer .
    6 tokens: thing continue tumble off belt .
    5 tokens: fall item conveyor belt .
    8 tokens: scanner reel split , soon begin curve .

Удалите пунктуацию из документов.

cleanedDocuments = erasePunctuation(cleanedDocuments);
cleanedDocuments(1:10)
ans = 
  10×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
    6 tokens: burst pipe constructing agent spray coolant
    3 tokens: fuse blow mixer
    5 tokens: thing continue tumble off belt
    4 tokens: fall item conveyor belt
    6 tokens: scanner reel split soon begin curve

Удалите слова с 2 или менее символов и слова с 15 или более символов.

cleanedDocuments = removeShortWords(cleanedDocuments,2);
cleanedDocuments = removeLongWords(cleanedDocuments,15);
cleanedDocuments(1:10)
ans = 
  10×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
    6 tokens: burst pipe constructing agent spray coolant
    3 tokens: fuse blow mixer
    5 tokens: thing continue tumble off belt
    4 tokens: fall item conveyor belt
    6 tokens: scanner reel split soon begin curve

Создайте модель мешка слов

Создайте модель мешка слов.

cleanedBag = bagOfWords(cleanedDocuments)
cleanedBag = 
  bagOfWords with properties:

          Counts: [480×352 double]
      Vocabulary: [1×352 string]
        NumWords: 352
    NumDocuments: 480

Удалите слова, которые не появляются более двух раз в модели мешка слов.

cleanedBag = removeInfrequentWords(cleanedBag,2)
cleanedBag = 
  bagOfWords with properties:

          Counts: [480×163 double]
      Vocabulary: [1×163 string]
        NumWords: 163
    NumDocuments: 480

Некоторые шаги предварительной обработки, такие как removeInfrequentWords оставляет пустые документы в модели мешка слов. Чтобы убедиться, что никакие пустые документы не остаются в модели мешка слов после предварительной обработки, используйте removeEmptyDocuments как последний шаг.

Удалите пустые документы из модели мешка слов и соответствующих меток из labels.

[cleanedBag,idx] = removeEmptyDocuments(cleanedBag);
labels(idx) = [];
cleanedBag
cleanedBag = 
  bagOfWords with properties:

          Counts: [480×163 double]
      Vocabulary: [1×163 string]
        NumWords: 163
    NumDocuments: 480

Создайте функцию предварительной обработки

Может быть полезно создать функцию, которая выполняет предварительную обработку, чтобы можно было одинаково подготовить различные наборы текстовых данных. Для примера можно использовать функцию, чтобы можно было предварительно обработать новые данные с помощью тех же шагов, что и обучающие данные.

Создайте функцию, которая токенизирует и предварительно обрабатывает текстовые данные, чтобы их можно было использовать для анализа. Функция preprocessText, выполняет следующие шаги:

  1. Токенизация текста с помощью tokenizedDocument.

  2. Удалите список стоповых слов (таких как «and», «of», и «the») с помощью removeStopWords.

  3. Лемматизируйте слова, используя normalizeWords.

  4. Удалите пунктуацию с помощью erasePunctuation.

  5. Удалите слова с 2 или меньшим количеством символов, используя removeShortWords.

  6. Удалите слова с 15 или более символами, используя removeLongWords.

Используйте функцию предварительной обработки в качестве примера preprocessText для подготовки текстовых данных.

newText = "The sorting machine is making lots of loud noises.";
newDocuments = preprocessText(newText)
newDocuments = 
  tokenizedDocument:

   6 tokens: sorting machine make lot loud noise

Сравнение с необработанными данными

Сравните предварительно обработанные данные с необработанными данными.

rawDocuments = tokenizedDocument(textData);
rawBag = bagOfWords(rawDocuments)
rawBag = 
  bagOfWords with properties:

          Counts: [480×555 double]
      Vocabulary: [1×555 string]
        NumWords: 555
    NumDocuments: 480

Вычислите сокращение данных.

numWordsCleaned = cleanedBag.NumWords;
numWordsRaw = rawBag.NumWords;
reduction = 1 - numWordsCleaned/numWordsRaw
reduction = 0.7063

Сравните необработанные данные и очищенные данные путем визуализации двух моделей мешков слов с помощью облаков слов.

figure
subplot(1,2,1)
wordcloud(rawBag);
title("Raw Data")
subplot(1,2,2)
wordcloud(cleanedBag);
title("Cleaned Data")

Функция предварительной обработки

Функция preprocessText, выполняет следующие шаги по порядку:

  1. Токенизация текста с помощью tokenizedDocument.

  2. Удалите список стоповых слов (таких как «and», «of», и «the») с помощью removeStopWords.

  3. Лемматизируйте слова, используя normalizeWords.

  4. Удалите пунктуацию с помощью erasePunctuation.

  5. Удалите слова с 2 или меньшим количеством символов, используя removeShortWords.

  6. Удалите слова с 15 или более символами, используя removeLongWords.

function documents = preprocessText(textData)

% Tokenize the text.
documents = tokenizedDocument(textData);

% Remove a list of stop words then lemmatize the words. To improve
% lemmatization, first use addPartOfSpeechDetails.
documents = addPartOfSpeechDetails(documents);
documents = removeStopWords(documents);
documents = normalizeWords(documents,'Style','lemma');

% Erase punctuation.
documents = erasePunctuation(documents);

% Remove words with 2 or fewer characters, and words with 15 or more
% characters.
documents = removeShortWords(documents,2);
documents = removeLongWords(documents,15);

end

См. также

| | | | | | | | | |

Похожие темы