Создайте простую текстовую модель для классификации

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

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

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

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

filename = "factoryReports.csv";
data = readtable(filename,'TextType','string');
head(data)
ans=8×5 table
                                 Description                                       Category          Urgency          Resolution         Cost 
    _____________________________________________________________________    ____________________    ________    ____________________    _____

    "Items are occasionally getting stuck in the scanner spools."            "Mechanical Failure"    "Medium"    "Readjust Machine"         45
    "Loud rattling and banging sounds are coming from assembler pistons."    "Mechanical Failure"    "Medium"    "Readjust Machine"         35
    "There are cuts to the power when starting the plant."                   "Electronic Failure"    "High"      "Full Replacement"      16200
    "Fried capacitors in the assembler."                                     "Electronic Failure"    "High"      "Replace Components"      352
    "Mixer tripped the fuses."                                               "Electronic Failure"    "Low"       "Add to Watch List"        55
    "Burst pipe in the constructing agent is spraying coolant."              "Leak"                  "High"      "Replace Components"      371
    "A fuse is blown in the mixer."                                          "Electronic Failure"    "Low"       "Replace Components"      441
    "Things continue to tumble off of the belt."                             "Mechanical Failure"    "Low"       "Readjust Machine"         38

Преобразуйте метки в Category столбец таблицы для категоризации и просмотра распределения классов в данных с помощью гистограммы.

data.Category = categorical(data.Category);
figure
histogram(data.Category)
xlabel("Class")
ylabel("Frequency")
title("Class Distribution")

Разделите данные на обучающий раздел и удерживаемый тестовый набор. Задайте процент удержания 10%.

cvp = cvpartition(data.Category,'Holdout',0.1);
dataTrain = data(cvp.training,:);
dataTest = data(cvp.test,:);

Извлеките текстовые данные и метки из таблиц.

textDataTrain = dataTrain.Description;
textDataTest = dataTest.Description;
YTrain = dataTrain.Category;
YTest = dataTest.Category;

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

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

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

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

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

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

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

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

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

documents = preprocessText(textDataTrain);
documents(1:5)
ans = 
  5×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

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

bag = bagOfWords(documents)
bag = 
  bagOfWords with properties:

          Counts: [432×336 double]
      Vocabulary: [1×336 string]
        NumWords: 336
    NumDocuments: 432

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

bag = removeInfrequentWords(bag,2);
[bag,idx] = removeEmptyDocuments(bag);
YTrain(idx) = [];
bag
bag = 
  bagOfWords with properties:

          Counts: [432×155 double]
      Vocabulary: [1×155 string]
        NumWords: 155
    NumDocuments: 432

Обучите контролируемый классификатор

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

Обучите мультикласс модель линейной классификации с помощью fitcecoc. Задайте Counts свойство модели мешка слов, чтобы быть предикторами, и метки типа события, чтобы быть ответом. Укажите, что ученики должны быть линейными. Эти ученики поддерживают разреженный вход данных.

XTrain = bag.Counts;
mdl = fitcecoc(XTrain,YTrain,'Learners','linear')
mdl = 
  CompactClassificationECOC
      ResponseName: 'Y'
        ClassNames: [Electronic Failure    Leak    Mechanical Failure    Software Failure]
    ScoreTransform: 'none'
    BinaryLearners: {6×1 cell}
      CodingMatrix: [4×6 double]


  Properties, Methods

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

Классификатор тестов

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

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

documentsTest = preprocessText(textDataTest);
XTest = encode(bag,documentsTest);

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

YPred = predict(mdl,XTest);
acc = sum(YPred == YTest)/numel(YTest)
acc = 0.8542

Предсказание с использованием новых данных

Классифицируйте тип события новых заводских отчетов. Создайте строковые массивы, содержащий новые заводские отчеты.

str = [
    "Coolant is pooling underneath sorter."
    "Sorter blows fuses at start up."
    "There are some very loud rattling sounds coming from the assembler."];
documentsNew = preprocessText(str);
XNew = encode(bag,documentsNew);
labelsNew = predict(mdl,XNew)
labelsNew = 3×1 categorical
     Leak 
     Electronic Failure 
     Mechanical Failure 

Пример функции предварительной обработки

Функция 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

См. также

| | | | | | | | |

Похожие темы