В этом примере показано, как обучить простой классификатор текста по счетчикам частот слов с помощью модели мешка слов.
Можно создать простую модель классификации, которая использует счетчики частот слов в качестве предикторов. Этот пример обучает простую модель классификации, чтобы предсказать категорию заводских отчетов с помощью текстовых описаний.
Загрузите данные примера. Файл 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
, выполняет следующие шаги по порядку:
Токенизация текста с помощью tokenizedDocument
.
Удалите список стоповых слов (таких как «and», «of», и «the») с помощью removeStopWords
.
Лемматизируйте слова, используя normalizeWords
.
Удалите пунктуацию с помощью erasePunctuation
.
Удалите слова с 2 или меньшим количеством символов, используя removeShortWords
.
Удалите слова с 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
, выполняет следующие шаги по порядку:
Токенизация текста с помощью tokenizedDocument
.
Удалите список стоповых слов (таких как «and», «of», и «the») с помощью removeStopWords
.
Лемматизируйте слова, используя normalizeWords
.
Удалите пунктуацию с помощью erasePunctuation
.
Удалите слова с 2 или меньшим количеством символов, используя removeShortWords
.
Удалите слова с 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
addPartOfSpeechDetails
| bagOfWords
| encode
| erasePunctuation
| normalizeWords
| removeLongWords
| removeShortWords
| removeStopWords
| tokenizedDocument
| wordcloud