主要内容

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

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

要使用卷积对文本数据进行分类,必须将文本数据转换为图像。要做到这一点,请填充或截断观测值,使其具有恒定的长度年代并将文档转换为长度的字向量序列C使用单词嵌入。然后,您可以将文档表示为1 × -年代——- - - - - -C图像(高为1,宽为1的图像年代,C渠道)。

若要将CSV文件中的文本数据转换为图像,请创建tabularTextDatastore对象。中的数据转换tabularTextDatastore对象对图像进行深度学习调用变换使用自定义转换函数。的transformTextData函数从数据存储中读取数据和预训练的单词嵌入,并将每个观察结果转换为单词向量数组。

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

加载预训练词嵌入

加载预训练的fastText词嵌入。此功能需要文本分析工具箱™模型快速文本英语160亿令牌词嵌入金宝app支持包。如果没有安装此支金宝app持包,则该函数将提供下载链接。

emb = fasttextwordem寝料;

加载数据

中的数据创建表格文本数据存储factoryReports.csv。中读取数据“描述”而且“类别”只列。

filenameTrain =“factoryReports.csv”;textName =“描述”;labelName =“类别”;ttdsTrain = tabularTextDatastore(文件名训练,“SelectedVariableNames”, (textName labelName]);

预览数据存储。

ttdsTrain。ReadSize = 8;预览(ttdsTrain)
ans =8×2表类别描述  _______________________________________________________________________ ______________________ {' 项目是偶尔陷于扫描器线轴。'}{'机械故障'}{'巨大的嘎嘎声和砰砰声来自装配活塞。'}{'机械故障'}{'启动工厂时电源有切断。'}{'电子故障'}{'汇编程序中的电容器烧坏。'}{'电子故障'}{'混合器触发保险丝。'}{'电子故障'}{'施工剂中的管道破裂正在喷射冷却剂。'}{'泄漏'}{'混合器中的保险丝熔断。'}{'电子故障'}{'东西继续从传送带上掉下来。'}{'机械故障'}

创建一个自定义转换函数,将从数据存储读取的数据转换为包含预测器和响应的表。的transformTextData函数(在示例末尾列出)接受从tabularTextDatastore对象并返回一个包含预测器和响应的表。预测因子是1 × -sequenceLength——- - - - - -C由词嵌入给出的词向量数组循证,在那里C为嵌入维数。响应是类的分类标签一会

从训练数据中读取标签readLabels函数,在示例末尾列出,并查找惟一的类名。

标签= readLabels(ttdsTrain,labelName);classNames =唯一的(标签);numObservations = numel(标签);

使用转换数据存储transformTextData函数并指定序列长度为14。

sequenceLength = 14;tdsTrain = transform(ttdsTrain, @(data) transformTextData(data,sequenceLength,emb,classNames))
tdsTrain = TransformedDatastore带有属性:底层数据存储:[1×1 matlab.io.datastore.]TabularTextDatastore] 金宝appSupportedOutputFormats: ["txt" "csv" "xlsx" "xls" "parquet" "parq" "png" "jpg" "jpeg" "tif" "tiff" "wav" "flac" "ogg" "mp4" "m4a"]转换:{@(数据)transformTextData(data,sequenceLength,emb,classNames)} IncludeInfo: 0

预览转换后的数据存储。预测因子是1 × -年代——- - - - - -C数组,年代序列长度和C是特征的数量(嵌入维数)。这些回答就是分类标签。

预览(tdsTrain)
ans =8×2表预测响应_________________ __________________ {1×14×300单}机械故障{1×14×300单}机械故障{1×14×300单}电子故障{1×14×300单}电子故障{1×14×300单}电子故障{1×14×300单}泄漏{1×14×300单}电子故障{1×14×300单}机械故障

定义网络架构

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

下面介绍组网结构。

  • 指定输入大小为1 × -年代——- - - - - -C,在那里年代序列长度和C是特征的数量(嵌入维数)。

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

  • 对于每个块,指定200个大小为1 × -的卷积滤波器N以及大小为1 × -的池化区域年代,在那里N是n克的长度。

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

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

首先,在一个层数组中,指定输入层、第一个单元、深度连接层、全连接层、softmax层和分类层。

numFeatures = emb.Dimension;inputSize = [1 sequenceLength numFeatures];numFilters = 200;ngramlength = [2 3 4 5];numBlocks = nummel (ngramlength);numClasses = numel(classNames);

创建一个包含输入层的层图。将规范化选项设置为“没有”和层名“输入”

层= imageInputLayer(inputSize,“归一化”“没有”“名字”“输入”);lgraph = layerGraph(层);

对于每个n-gram长度,创建一个卷积、批规范化、ReLU、dropout和最大池化层的块。将每个块连接到输入层。

j = 1:numBlocks N = ngramlength (j);block = [convolution2dLayer([1 N],numFilters,“名字”“conv”+ N,“填充”“相同”) batchNormalizationLayer (“名字”“bn”+ N) reluLayer (“名字”“relu”+ N) dropoutLayer (0.2,“名字”“下降”+N) maxPooling2dLayer([1 sequenclength],“名字”“马克斯”+ N));lgraph = addLayers(lgraph,block);lgraph = connectLayers(“输入”“conv”+ N);结束

在图中查看网络结构。

图表(lgraph)标题(“网络架构”

添加深度级联层、全连接层、softmax层和分类层。

层= [depthConcatenationLayer(numBlocks,“名字”“深度”) fullyConnectedLayer (numClasses“名字”“俱乐部”) softmaxLayer (“名字”“软”) classificationLayer (“名字”“分类”));lgraph = addLayers(lgraph,layers);图表(lgraph)标题(“网络架构”

将最大池化层连接到深度级联层,并在图中查看最终的网络架构。

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

列车网络的

指定培训选项:

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

  • 不要打乱数据,因为数据存储是不可打乱的。

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

miniBatchSize = 128;numIterationsPerEpoch = floor(numObservations/miniBatchSize);选项= trainingOptions(“亚当”...“MiniBatchSize”miniBatchSize,...“洗牌”“永远”...“阴谋”“训练进步”...“详细”、假);

训练网络使用trainNetwork函数。

net = trainNetwork(tdsTrain,lgraph,options);

使用新数据进行预测

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

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

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

XNew = preprocessText(reportsNew,sequenceLength,emb);

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

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

读取标签命令功能

readLabels函数的副本tabularTextDatastore对象运输大亨并从标签中读取labelName列。

函数标签= readLabels(ttds,labelName) ttdsNew = copy(ttds);ttdsNew。选择edVariableNames = labelName; tbl = readall(ttdsNew); labels = tbl.(labelName);结束

转换文本数据函数

transformTextData函数中读取的数据tabularTextDatastore对象并返回一个包含预测器和响应的表。预测因子是1 × -sequenceLength——- - - - - -C由词嵌入给出的词向量数组循证,在那里C为嵌入维数。响应是类的分类标签一会

函数dataTransformed = transformTextData(数据,sequenceLength,emb,classNames)预处理文档。textData = data{:,1};预处理文本dataTransformed = preprocessText(textData,sequenceLength,emb);阅读标签。标签=数据{:,2};responses = categorical(labels,classNames);将数据转换为表。dataTransformed。Responses =响应;结束

预处理文本功能

preprocessTextData函数获取文本数据、序列长度和单词嵌入,并执行以下步骤:

  1. 标记文本。

  2. 将文本转换为小写。

  3. 使用嵌入将文档转换为指定长度的字向量序列。

  4. 重新塑造输入到网络中的词向量序列。

函数tbl = preprocessText(textData,sequenceLength,emb) documents = tokenizedDocument(textData);文档=较低(文档);将文档转换为嵌入尺寸-顺序-长度-1的图像。Predictors = doc2sequence(emb,documents,“长度”, sequenceLength);将图像重塑为大小为1的序列长度嵌入维度。predictors = cellfun(@(X) permute(X,[3 2 1]),predictors,“UniformOutput”、假);TBL =表;资源描述。预测因子=预测因子;结束

另请参阅

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

相关的话题