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