主要内容

利用深度学习对文本数据进行分类

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

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

要向LSTM网络输入文本,首先将文本数据转换为数字序列。可以使用将文档映射到数字索引序列的字编码来实现这一点。为了得到更好的结果,还在网络中包含一个词嵌入层。单词嵌入将词汇表中的单词映射到数字向量而不是标量索引。这些嵌入捕获单词的语义细节,因此具有相似含义的单词具有相似的向量。他们还通过向量算术建模单词之间的关系。例如,关系"罗马是意大利巴黎是法国“由方程式描述意大利- - - - - -罗马+巴黎=法国。

在本例中,训练和使用LSTM网络有四个步骤:

  • 导入并预处理数据。

  • 使用单词编码将单词转换为数字序列。

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

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

导入数据

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

文件名=“factoryreports.csv”;data = readtable(文件名,“TextType”,“字符串”);头(数据)
ans =8×5表类别描述紧急解决成本  _____________________________________________________________________ ____________________ ________ ____________________ _____ " 项目是偶尔陷入扫描仪卷。”"机械故障" "介质" "重新调整机器" 45 "装配活塞发出响亮的咔嗒咔嗒声"“机械故障”“介质”“重新调整机器”“启动工厂时电源会中断。”“电子故障”“高”“完全更换”16200“炸电容器在装配。”"电子故障" "高" "更换元件" 352 " "混频器断了保险丝"“电子故障”“低”“加入监视名单”55“爆裂管道中施工剂正在喷洒冷却剂。”"泄漏" "高" "更换元件371 " "保险丝在混合器里烧坏了""电子故障" "低" "替换元件" 441 "皮带上的东西不断掉下来。"“机械故障”“低”“重新调整机器”38

控件中的标签对事件进行分类类别柱子。要将数据划分为类,将这些标签转换为分类。

数据。类别=分类(data.Category);

使用直方图查看数据中类的分布。

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

下一步是将其划分为训练和验证集。将数据划分为训练分区和保留分区,用于验证和测试。指定保留百分比为20%。

本量利= cvpartition(数据。类别,“坚持”, 0.2);dataTrain =数据(训练(cvp):);dataValidation =数据(测试(cvp):);

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

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

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

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

预处理文本数据

创建一个对文本数据进行标记和预处理的函数。这个函数preprocessText,执行以下步骤:

  1. 标记文本使用令人畏缩的鳕文

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

  3. 使用标点符号使用侵蚀

对训练数据和验证数据进行预处理preprocessText函数。

documentstrain = preprocesstext(textdataTrain);documentsvalidation = preprocesstext(textdatavalidation);

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

documentsTrain (1:5)
ans = 5×1 tokenizedDocument: 9令牌:项目中偶尔陷入扫描仪线轴10令牌:大声作响,声音来自汇编活塞10令牌:削减能力,启动植物5令牌:油炸电容器在汇编程序4令牌:搅拌机绊倒保险丝

将文档转换为序列

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

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

内附= wordEncoding (documentsTrain);

下一个转换步骤是填充和截断文档,使它们都具有相同的长度。的培训选项函数提供自动填充和截断输入序列的选项。但是,这些选项不适用于字向量序列。相反,手动填充和截断序列。如果你左侧垫子并截断单词向量的序列,然后培训可能改善。

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

documentLengths = doclength (documentsTrain);图直方图(documentLengths)标题(“文件长度”)xlabel(“长度”)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”,“最后一次”) fullconnectedlayer (numClasses) softmaxLayer classiationlayer]
图层= 6x1层阵列与图层:1''序列输入序列输入,1维2'字嵌入层字嵌入层,具有50维和423个独特的单词3'LSTM LSTM,具有80个隐藏单元4'完全连接的4'完全连接4'连接的第5层'Softmax Softmax 6''分类输出crossentropyex

指定培训选项

指定培训选项:

  • 使用Adam解算器进行训练。

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

  • 每个时代都要洗牌数据。

  • 通过设置“阴谋”选择“训练进步”

  • 方法指定验证数据'vightationdata'选项。

  • 通过设置“详细”选择

默认情况下,trainNetwork如果有一个可用的,则使用GPU。否则,它使用CPU。要手动指定执行环境,请使用“ExecutionEnvironment”名称 - 值对参数培训选项.在CPU上进行训练比在GPU上花费的时间要长得多。使用GPU进行培训需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持版本(并行计算工具箱)

选项=培训选项(“亚当”,...“MiniBatchSize”, 16岁,...“GradientThreshold”2,...“洗牌”,'每个时代',...'vightationdata',{xvalidation,yvalidation},...“阴谋”,“训练进步”,...“详细”,错误的);

训练LSTM网络使用trainNetwork函数。

net = trainnetwork(xtrain,ytrain,图层,选项);

使用新数据进行预测

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

eportsnew = [...“冷却剂在分拣机下面聚集。”“分拣机在启动时吹熔断。”“汇编者有一些非常响亮的嘎嘎声的声音。”];

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

documentsNew = preprocessText (reportsNew);

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

xnew = doc2sequence(enc,dooksnew,'长度', sequenceLength);

使用培训的LSTM网络对新序列进行分类。

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

预处理功能

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

  1. 标记文本使用令人畏缩的鳕文

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

  3. 使用标点符号使用侵蚀

功能文件= preprocessText (textData)%标记文本。文件= tokenizedDocument (textData);%转换为小写。文件=较低(文件);%擦除标点符号。= erasePunctuation文件(文档);结束

另请参阅

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

相关话题