分类文本数据使用Deep学习

这个示例展示了如何使用深度学习长短期记忆(LSTM)网络对文本数据进行分类。

文本数据自然是顺序的。一段文本是单词的序列,它们之间可能有依赖关系。为了学习和利用长期依赖关系对序列数据进行分类,使用LSTM神经网络。LSTM网络是一种循环神经网络(RNN),它可以学习序列数据的时间步长之间的依赖关系。

输入文本到LSTM网络,第一文本数据转换成数字序列。您可以使用文字编码,这映射文件,以数字索引的顺序实现这一目标。为了获得更好的效果,还包括一个字在网络中埋层。Word中的嵌入的词汇数值向量,而不是标量指数映射的话。这些的嵌入捕捉的话语义细节,让具有类似意义的词语,也有类似的载体。他们还通过向量算法模型词之间的关系。例如,关系“罗马之于意大利如同罗马之于意大利巴黎是法国用意大利这个等式来描述-罗马+巴黎=法国。

本例中LSTM网络的培训和使用有四个步骤:

  • 导入和预处理数据。

  • 转换的话使用编码字数字序列。

  • 创建并训练一个带有单词嵌入层的LSTM网络。

  • 使用训练好的LSTM网络对新的文本数据进行分类。

导入数据

导入工厂报告数据。此数据包含标记的工厂事件的文字描述。要导入文本数据作为字符串,指定文本类型为“字符串”

文件名=“factoryReports.csv”;数据= readtable(文件名,'TextType'“字符串”);头(数据)
ans =8×5表说明类别紧急分辨率成本_____________________________________________________________________ ____________________ ____________________ ________ _____“的相关文件偶尔会卡在扫描器卷轴。”“机械故障”,“中等”,“重新调整机” 45“大声剑拔弩张和敲打的声音从汇编活塞都来了。”“机械故障”,“中等”,“重新调整机” 35“有削减电力启动设备时。”“电子故障”“高”“完全替代” 16200“在汇编炒电容器。”“电子故障”“高”“替换组件” 352“混音器跳闸保险丝。”“电子故障”“低”“添加到收藏” 55“在构建代理爆管被喷洒冷却液。”“泄漏”“高”“替换组件” 371“A熔丝在混合器吹”。“电子故障”“低”“替换组件” 441“事情继续翻滚带了。”“机械故障”,“低”,“重新调整机” 38

属性中的标签对事件进行分类类别列。要将数据划分为类,请将这些标签转换为categorical。

data.Category =分类(data.Category);

使用柱状图查看类在数据中的分布。

图直方图(data.Category);包含(“类”) ylabel (“频率”)标题(“级分配”

下一步是将其划分为用于训练和验证的集合。将数据划分为一个训练分区和一个外拉分区进行验证和测试。指定坚持百分比为20%。

CVP = cvpartition(data.Category,'坚持',0.2);dataTrain =数据(训练(CVP),:);资料验证=数据(测试(CVP),:);

从分区表中提取文本数据和标签。

textDataTrain = dataTrain.Description;textDataValidation = dataValidation.Description;YTrain = dataTrain.Category;YValidation = dataValidation.Category;

要检查是否已正确导入数据时,使用可视化词云培训文本数据。

图wordcloud(textDataTrain);标题(“训练数据”

预处理文本数据

创建功能和标记化预处理的文本数据。功能preprocessText,执行以下步骤:

  1. 使用标记文本tokenizedDocument

  2. 将文本转换使用小写较低的

  3. 使用以下方法删除标点符号erasePunctuation

预处理训练数据,并使用验证数据preprocessText函数。

documentsTrain = preprocessText (textDataTrain);documentsValidation = preprocessText (textDataValidation);

查看前几个预处理的培训文档。

documentsTrain(1:5)
ANS = 5×1 tokenizedDocument:9个令牌:项都偶尔卡在扫描器线轴10级的令牌:大声拍击和敲打音从汇编器活塞未来10个令牌:在启动植物5令牌当有削减功率:炒电容器在汇编器4级的令牌:混合器跳闸熔丝

转换文档到序列

输入文件到一个网络LSTM,使用编码的文档转换成数字索引的序列的单词。

要创建单词编码,请使用wordEncoding函数。

内附= wordEncoding (documentsTrain);

下一个转换步骤是填充和截断文档,使它们具有相同的长度。的trainingOptions函数提供选项来填充和截断输入序列自动。但是,这些选项并不很适合字向量序列。相反,要手动填充和截断序列。如果你left-pad截断单词向量的序列,可以提高训练效果。

要填充和截断文档,首先选择一个目标长度,然后截断比目标长度长的文档和比目标长度短的文档。为了获得最佳结果,目标长度应该短而不丢弃大量数据。要找到合适的目标长度,请查看训练文档长度的直方图。

documentLengths = doclength (documentsTrain);图直方图(documentLengths)标题(“文档长度”)包含(“长度”) ylabel (“文件”

大部分的训练文档少于10个令牌。以此为截断和填充你的目标长度。

使用。将文档转换为数字索引序列doc2sequence。要截断或左垫序列具有长度10,设置“长度”选择10。

sequenceLength = 10;XTrain = doc2sequence (enc documentsTrain,“长度”, sequenceLength);XTrain (1:5)
ans =5×1单元阵列{1×10双}{1×10双}{1×10双}{1×10双}{1×10双}

使用相同的选项将验证文档转换为序列。

XValidation = doc2sequence(ENC,documentsValidation,“长度”, sequenceLength);

创建和培训LSTM网络

定义LSTM网络架构。要将序列数据输入到网络中,需要包含一个序列输入层,并将输入大小设置为1。接下来,包含维度为50的单词嵌入层和与单词编码相同数量的单词。接下来,包括一个LSTM层,并设置隐藏单位的数量为80。要使用LSTM层处理顺序到标签的分类问题,请将输出模式设置为'持续'。最后,添加与类数量相同大小的全连接层、softmax层和分类层。

inputSize = 1;embeddingDimension = 50;numHiddenUnits = 80;numWords = enc.NumWords;numClasses =元素个数(类别(YTrain));层= [...sequenceInputLayer (inputSize) wordEmbeddingLayer embeddingDimension, numWords lstmLayer (numHiddenUnits,“OutputMode”'持续')fullyConnectedLayer(numClasses)softmaxLayer classificationLayer]
层x1 = 6层阵列层:1“1维2序列输入序列输入”字嵌入层字嵌入层和50个维度和423个独特的单词3”LSTM LSTM 80隐藏单位4”完全连接4完全连接层5”Softmax Softmax 6”crossentropyex分类输出

指定培训选项

指定培训方式:

  • 用亚当解算器来训练。

  • 指定迷你批处理大小为16。

  • 洗牌每一个时代的数据。

  • 监控通过设置训练进度“情节”选项“训练进度”

  • 指定使用的验证数据“ValidationData”选择。

  • 禁止通过设置详细的输出“详细”选项

默认情况下,trainNetwork使用可用的GPU(需要Parallel Computing Toolbox™和CUDA®启用的GPU,计算能力为3.0或更高)。否则,它使用CPU。要手动指定执行环境,请使用“执行环境”的名称-值对参数trainingOptions。在CPU上的训练时间要比在GPU上的训练时间长得多。

选择= trainingOptions ('亚当'...“MiniBatchSize”, 16岁,...“GradientThreshold”2,...“洗牌”“every-epoch”...“ValidationData”{XValidation, YValidation},...“情节”“训练进度”...“详细”、假);

使用训练LSTM网络trainNetwork函数。

网= trainNetwork (XTrain、YTrain层,选择);

预计使用新数据

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

reportsNew = [...“冷却剂在分类器下汇集。”“分类者在启动时吹保险丝。”“有一些非常响亮的咔哒咔哒的声音从组装者那里传来。”];

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

documentsNew = preprocessText (reportsNew);

将文本数据转换为序列doc2sequence使用与创建训练序列时相同的选项。

XNew = doc2sequence (enc documentsNew,“长度”, sequenceLength);

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

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

预处理功能

功能preprocessText执行下列步骤操作:

  1. 使用标记文本tokenizedDocument

  2. 将文本转换使用小写较低的

  3. 使用以下方法删除标点符号erasePunctuation

函数文件= preprocessText (textData)将文本标记。文件= tokenizedDocument (textData);%转换为小写。文件=低(文件);%擦掉标点符号。= erasePunctuation文件(文档);结束

也可以看看

||||||||

相关的话题