主要内容

创建简单的文本分类模型

这个例子展示了如何使用单词袋模型训练一个简单的文本分类器的词频计数。

您可以创建一个简单的分类模型,使用词频计数作为预测因子。此示例训练一个简单的分类模型,以使用文本描述预测工厂报告的类别。

加载和提取文本数据

加载示例数据。该文件factoryReports.csv包含工厂报告,包括每个报告的文本描述和分类标签。

文件名=“factoryReports.csv”;数据= readtable(文件名,“TextType”“字符串”);头(数据)
ans =8×5表类别描述紧急解决成本  _____________________________________________________________________ ____________________ ________ ____________________ _____ " 项目是偶尔陷入扫描仪卷。”“机械故障”“中等”“重新调整机”45“装配活塞发出巨大的嘎嘎声和砰砰声。”“机械故障”“中等”“重新调整机器”“开机时电源有故障。”"电子故障" "高" "完全更换" 16200 "装配器电容器烧坏"“电子故障”“高”“更换部件”“352”“混合器熔断器触发。”"电子故障" "低" "列入观察名单" 55 "爆裂管道中施工剂正在喷洒冷却剂""泄漏" "高" "更换部件" 371 "搅拌机保险丝烧断。"“电子故障”“信号低”“更换部件”“东西继续从传送带上掉下来。”"机械故障" "低" "调整机

中的标签进行转换类别列的类别,并使用直方图查看数据中类别的分布。

数据。Category = categorical(data.Category);图直方图(data.Category)“类”) ylabel (“频率”)标题(“类分配”

将数据划分为一个训练分区和一个测试集。指定坚持百分比为10%。

CVP = cvpartition(数据。类别,“坚持”, 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);文档(1:5)
ans = 5×1 tokenizedDocument: 6令牌:物品偶尔卡住扫描仪阀芯7令牌:巨大的嘎嘎声巨响来装配活塞4令牌:切断电源启动装置3令牌:炸电容器装配3令牌:混合器跳闸保险丝

从标记化的文档创建单词袋模型。

bag = bagOfWords(文档)
bag = bagOfWords with properties:计数:[432×336 double]词汇:[1×336 string] NumWords: 336 NumDocuments: 432

从单词袋模型中删除总共出现次数不超过两次的单词。从单词袋模型中删除任何不包含单词的文档,并删除标签中的相应条目。

袋子= removeInfrequentWords(袋子,2);[bag,idx] = removeEmptyDocuments(bag);YTrain(idx) = [];袋
bag = bagOfWords with properties:计数:[432×155 double]词汇:[1×155 string] NumWords: 155 NumDocuments: 432

训练监督分类器

使用单词袋模型和标签中的词频计数训练一个监督分类模型。

训练一个多类线性分类模型fitcecoc.指定计数属性设置为预测器,事件类型标签设置为响应。指定学习器为线性的。这些学习器支持稀疏数据输入。万博1manbetx

XTrain = bag.Counts;mdl = fitcecoc(XTrain,YTrain,“学习者”“线性”
mdl = CompactClassificationECOC ResponseName: 'Y' ClassNames:[电子故障泄漏机械故障软件故障]ScoreTransform: 'none' BinaryLearners: {6×1 cell} CodingMatrix: [4×6 double]属性,方法

为了更好地匹配,您可以尝试指定线性学习器的不同参数。有关线性分类学习器模板的更多信息,请参见templateLinear

测试分类器

利用训练好的模型预测测试数据的标签,计算分类精度。分类精度是模型正确预测的标签的比例。

使用与训练数据相同的预处理步骤对测试数据进行预处理。根据单词袋模型将结果测试文档编码为词频计数矩阵。

documentsTest = preprocessText(textDataTest);XTest = encode(包,documentsTest);

利用训练好的模型预测测试数据的标签,计算分类精度。

YPred = predict(mdl,XTest);acc = sum(YPred == YTest)/ nummel (YTest)
Acc = 0.8542

使用新数据进行预测

对新工厂报告的事件类型进行分类。创建一个包含新工厂报告的字符串数组。

STR = [“冷却剂在分拣机下面。”“分拣机在启动时炸断保险丝。”“有一些非常响亮的咔嗒声从组装。”];documentsNew = preprocessText(str);XNew = encode(包,documentsNew);labelsNew =预测(mdl,XNew)
labelsNew =3×1分类泄漏电子故障机械故障

使用实例预处理

这个函数preprocessText,依次执行以下步骤:

  1. 使用标记化文本tokenizedDocument

  2. 删除使用停止词的列表(如“and”,“of”和“the”)removeStopWords

  3. 使用词汇normalizeWords

  4. 使用删除标点符号erasePunctuation

  5. 删除使用2个或更少字符的单词removeShortWords

  6. 删除使用15个或更多字符的单词removeLongWords

函数documents = preprocessText(textData)标记文本。documents = tokenizedDocument(textData);删除一个停止词列表,然后对这些词进行lemalize。改善% lemmation,首先使用addPartOfSpeechDetails。文档= addPartOfSpeechDetails(文档);documents = removeStopWords(文档);文档= normalizeWords(文档,“风格”“引理”);删除标点符号。documents = eraspunctuation(文档);删除2个或更少字符的单词,以及15个或更多字符的单词%字符。文档= removeShortWords(文档,2);documents = removeLongWords(documents,15);结束

另请参阅

|||||||||

相关的话题