exponenta event banner

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

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

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

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

Загрузите данные примера. Файл 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

См. также

| | | | | | | | |

Связанные темы