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

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

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

  • Изменения в случае, если, например, "новый" и "Новый"

  • Изменения словоформ, например, "идите" и "обход"

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

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

  • HTML-тэги и XML-тэги

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

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

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

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

Извлеките текстовые данные из поля event_narrative, и данные о метке из поля event_type.

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 .

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

cleanedDocuments = addPartOfSpeechDetails(cleanedDocuments);

Слова как "a", "и", "к", и (известный как слова остановки) могут добавить шум в данные. Удалите список слов остановки с помощью 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 .

Lemmatize слова с помощью 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. Удалите список слов остановки (такой как "и", и) использование removeStopWords.

  3. Lemmatize слова с помощью 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. Удалите список слов остановки (такой как "и", и) использование removeStopWords.

  3. Lemmatize слова с помощью 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

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

| | | | | | | | | |

Похожие темы