В этом примере показано, как обучить простой классификатор текста подсчетам частоты слов с помощью модели мешка слов.
Можно создать простую классификационную модель, в которой в качестве предикторов используются значения частоты слов. В этом примере описывается простая модель классификации для прогнозирования категории заводских отчетов с использованием текстовых описаний.
Загрузите данные примера. Файл 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