主要内容

基于卷积神经网络的文本数据分类

这个例子展示了如何使用卷积神经网络对文本数据进行分类。

要使用卷积对文本数据进行分类,请使用在输入的时间维度上进行卷积的1-D卷积层。

这个例子用不同宽度的一维卷积滤波器训练一个网络。每个过滤器的宽度对应于过滤器可以看到的单词数(n-gram长度)。该网络有多个卷积层分支,因此它可以使用不同的n-gram长度。

加载数据

中的数据创建表格文本数据存储factoryReports.csv并查看前几个报告。

数据=可读数据(“factoryReports.csv”);头(数据)
ans =8×5表类别描述紧急解决成本  _______________________________________________________________________ ______________________ __________ ______________________ _____ {' 项目是偶尔陷于扫描器线轴。'}{'机械故障'}{'中等'}{'重新调整机器'}45{'巨大的嘎嘎声和砰砰声来自装配活塞。'}{'机械故障'}{'中等'}{'重新调整机器'}35{'启动工厂时电源有切断。'}{'电子故障'}{'高'}{'完全替换'}16200{'汇编程序中的烧坏电容器。'}{'电子故障'}{'高'}{'更换组件'}352{'混频器触发熔断器。'}{'电子故障'}{'低'}{'添加到观察列表'}55{'施工剂中的爆裂管道正在喷射冷却剂。'}{'泄漏'}{'高'}{'更换组件'}371{'混合器内保险丝熔断。'}{'电子故障'}{'低'}{'更换组件'}441{'东西继续从皮带上脱落。'}{'机械故障'}{'低'}{'重新调整机器'}38

将数据划分为训练分区和验证分区。将80%的数据用于训练,其余数据用于验证。

cvp = cvpartition(data.Category,Holdout=0.2);dataTrain = data(training(cvp),:);dataValidation = data(test(cvp),:);

预处理文本数据

方法中提取文本数据“描述”列的初始化,并使用preprocessText函数,在本节中列出预处理文本功能这个例子。

documentsTrain = preprocessText(dataTrain.Description);

方法中提取标签“类别”列并将其转换为分类。

TTrain = categorical(dataTrain.Category);

查看类名和观察数。

classNames =唯一的(TTrain)
一会=4×1分类电子故障泄漏机械故障软件故障
numObservations = numel(TTrain)
numObservations = 384

使用相同的步骤提取和预处理验证数据。

documentsValidation = preprocessText(datavalid . description);TValidation = categorical(datavalid . category);

将文档转换为序列

要将文档输入神经网络,请使用单词编码将文档转换为数字索引序列。

从文档中创建单词编码。

enc = worddencoding (documentsTrain);

查看单词编码的词汇量大小。词汇量大小是单词编码中唯一单词的数量。

numWords = c. numWords
numWords = 436

方法将文档转换为整数序列doc2sequence函数。

XTrain = doc2sequence(enc,documentsTrain);

使用从训练数据创建的字编码将验证文档转换为序列。

XValidation = doc2sequence(enc,documentsValidation);

定义网络架构

定义分类任务的网络体系结构。

下面介绍组网结构。

  • 指定输入大小为1,它对应于整数序列输入的通道维度。

  • 使用维数为100的词嵌入输入。

  • 对于长度为2、3、4和5的n-gram,创建包含卷积层、批处理规范化层、ReLU层、dropout层和最大池化层的层块。

  • 对于每个块,指定200个大小为1 × -的卷积滤波器N和全局最大池化层。

  • 将输入层连接到每个块,并使用连接层连接块的输出。

  • 为了对输出进行分类,需要包含一个具有输出大小的全连接层K为softmax层,为classification层,其中K是类的数量。

指定网络超参数。

embeddingDimension = 100;ngramlength = [2 3 4 5];numFilters = 200;

首先,创建一个包含输入层和维度为100的单词嵌入层的层图。要帮助将单词嵌入层连接到卷积层,请将单词嵌入层名称设置为“循证”.若要检查卷积层在训练期间不将序列卷积为长度为零,请设置最小长度选择训练数据中最短序列的长度。

minLength = min(docclth (documentsTrain));layers = [sequenceInputLayer(1,MinLength= MinLength) wordEmbeddingLayer(embeddingDimension,numWords,Name=“循证”));lgraph = layerGraph(图层);

对于每个n-gram长度,创建一个1-D卷积、批处理归一化、ReLU、dropout和1-D全局最大池化层的块。将每个块连接到单词嵌入层。

numBlocks = nummel (ngramlength);j = 1:numBlocks N = ngramlength (j);block = [convolution1dLayer(N,numFilters,Name= .“conv”+ N,填充=“相同”) batchNormalizationLayer (Name =“bn”+ N) reluLayer (Name =“relu”+ N) dropoutLayer (0.2, Name =“下降”+ N) globalMaxPooling1dLayer (Name =“马克斯”+ N));lgraph = addLayers(lgraph,block);lgraph = connectLayers(“循证”“conv”+ N);结束

添加连接层、全连接层、softmax层和分类层。

numClasses = numel(classNames);layers = [concatenationLayer(1,numBlocks,Name= .“猫”) fullyConnectedLayer (numClasses Name =“俱乐部”) softmaxLayer (Name =“软”) classificationLayer (Name =“分类”));lgraph = addLayers(lgraph,layers);

将全局最大池化层连接到连接层,并在图中查看网络体系结构。

j = 1:numBlocks N = ngramlength (j);lgraph = connectLayers(“马克斯”+ N,“猫/”+ j);结束图表(lgraph)标题(“网络架构”

列车网络的

指定培训选项:

  • 用128个小批量进行训练。

  • 使用验证数据验证网络。

  • 返回具有最低验证损失的网络。

  • 显示训练进度图并抑制详细输出。

选项= trainingOptions(“亚当”...MiniBatchSize = 128,...ValidationData = {XValidation, TValidation},...OutputNetwork =“best-validation-loss”...情节=“训练进步”...Verbose = false);

训练网络使用trainNetwork函数。

net = trainNetwork(XTrain,TTrain,lgraph,options);

测试网络

利用训练好的网络对验证数据进行分类。

YValidation = category (net,XValidation);

在困惑图表中可视化预测。

图confusionchart (TValidation YValidation)

计算分类精度。准确率是正确预测的标签的比例。

accuracy = mean(TValidation == YValidation)
准确度= 0.9375

使用新数据进行预测

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

reportsNew = [“冷却剂在分拣机下面。”“分拣机在启动时炸断保险丝。”“有一些非常响亮的咔嗒声从组装。”];

将预处理步骤作为训练和验证文档对文本数据进行预处理。

documentsNew = preprocessText(reportsNew);XNew = doc2sequence(enc,documentsNew);

利用训练好的网络对新序列进行分类。

YNew = category (net,XNew)
YNew =3×1分类泄漏电子故障机械故障

预处理文本功能

preprocessTextData函数接受文本数据作为输入,并执行以下步骤:

  1. 标记文本。

  2. 将文本转换为小写。

函数documents = preprocessText(textData) documents = tokenizedDocument(textData);文档=较低(文档);结束

另请参阅

(文本分析工具箱)|(文本分析工具箱)|(文本分析工具箱)||||||(文本分析工具箱)|(文本分析工具箱)|

相关的话题