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

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

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

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

Загрузите данные в качестве примера. Файл 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. Удалите список слов остановки (такой как "и", и) использование removeStopWords.

  3. Lemmatize слова с помощью 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×335 double]
      Vocabulary: [1×335 string]
        NumWords: 335
    NumDocuments: 432

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

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

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

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

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

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

XTrain = bag.Counts;
mdl = fitcecoc(XTrain,YTrain,'Learners','linear')
mdl = 
  classreg.learning.classif.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.8958

Предскажите Используя новые данные

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

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

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

| | | | | | | | |

Похожие темы