使用文档嵌入对文档进行分类
这个例子展示了如何通过使用单词嵌入将文档转换为特征向量来训练文档分类器。
大多数机器学习技术需要特征向量作为输入来训练分类器。
单词嵌入将单个单词映射到向量。可以使用单词嵌入将文档映射到单个向量,方法是组合单词向量,例如,通过计算平均值向量来创建文档向量。
给定标记文档向量的数据集,然后可以训练机器学习模型对这些文档进行分类。
加载预训练的单词嵌入
方法加载预训练的单词嵌入fastTextWordEmbedding
函数。此功能需要文本分析工具箱™模型fastText English 160亿Token字嵌入支持包。如果没有安装此支持包,则该功能提供下载链接。
emb = fastTextWordEmbedding
emb = wordem寝具属性:维度:300词汇:["," "the" ".""和"的"到"的"在"a" """ ":")"“,”“(”“”“”“”“*”“与”“”“”“”“或”“”“”“”年代的”“”“”“”……)
对于可再现性,使用rng
函数与“默认”
选择。
rng (“默认”);
负荷训练数据
下一步是加载示例数据。该文件factoryReports.csv
包含工厂报告,包括每个事件的文本描述和分类标签。
文件名=“factoryReports.csv”;data = readtable(文件名,TextType =“字符串”);头(数据)
ans =8×5表类别描述紧急解决成本 _____________________________________________________________________ ____________________ ________ ____________________ _____ " 项目是偶尔陷入扫描仪卷。”“机械故障”“中等”“重新调整机器”45“装配活塞发出响亮的咔啦咔啦声和砰砰声。”"机械故障" "中" "重新调整机器" "启动装置时电源有切断。""电子故障" "高" "完全更换" 16200 "装配器内的电容器烧坏""电子故障" "高" "更换元件" 352 "混合器触发保险丝"“电子故障”“低”“列入观察名单”55“爆裂管中施工剂正在喷洒冷却剂。”“泄漏”“高”“更换部件”371混合器保险丝烧断。"电子故障" "低" "更换元件" "东西继续从皮带上掉下来。"“机械故障”“低”“调整机器”38
类中的标签对事件进行分类类别
列。要将数据划分为类,请将这些标签转换为类别。
数据。类别=分类(data.Category);
下一步是创建一个分区,将数据划分为训练和测试集。将数据划分为一个训练分区和一个保留分区,用于验证和测试。指定抵制百分比为30%。
本量利= cvpartition (data.Category,坚持= 0.3);
使用分区获得训练和测试的目标标签。在后面的示例中,在为文档创建向量之后,还将使用分区将输入数据分割为训练和测试。
TTrain = data.Category(培训(cvp):);tt = data.Category(测试(cvp):);
创建一个执行预处理的函数是很有用的,这样您就可以用相同的方式准备不同的文本数据集合。
创建一个对文本数据进行标记和预处理的函数,以便将其用于分析。的preprocessText
函数中列出的例子预处理功能部分执行以下步骤:
使用标记化文本
tokenizedDocument
.删除标点符号使用
erasePunctuation
.删除一个停止使用的单词列表(例如“and”,“of”和“the”)
removeStopWords
.小写的所有单词。
文件= preprocessText (data.Description);
将文档转换为特征向量
这个函数word2vec
用于将令牌转换为向量。对于较大的文档,可以将这些词向量合并为单个词向量,计算所有词的平均值。这个例子展示了如何获取文档向量。
获取每个文档的向量,计算文档中所有单词的平均值。计算字向量使用word2vec
函数并删除嵌入词汇表中缺失的任何单词次rmi
函数。计算文档单词(数据的第一个维度)的平均值。
meanEmbedding = 0(元素个数(文档),emb.Dimension);为K =1:numel(documents) words = string(documents(K));话说wordVectors = word2vec (emb);wordVectors = rmmissing (wordVectors);meanEmbedding (k) =意味着(wordVectors, 1);结束meanEmbeddingTrain = meanEmbedding(培训(cvp):);meanEmbeddingTest = meanEmbedding(测试(cvp):);
查看嵌入测试数据的大小。该数组是一个numObservations-by-embeddingDimension数组,其中numObservations是测试文档的数量,embeddingDimension是嵌入维度。
大小(meanEmbeddingTest)
ans =1×2144 300
每个文档的输出是一个300维数组,它总结了文档中包含的单词向量的所有特征。测试集中第一个文档的向量如下所示:
: meanEmbeddingTest (1)
ans =1×300-0.1367 -0.0284 -0.1061 -0.0034 0.0577 -0.0662 -0.0845 -0.0606 0.0117 -0.0614 0.1074 -0.0814 0.0160 -0.0101 -0.0419 -0.0108 -0.0433 -0.0334 -0.0192 -0.0787 0.1210 -0.0796 -0.0926 0.0291 -0.0787 0.1210 -0.0796 0.1160 -0.0278 -0.0243 -0.0577 0.0851 0.0354 0.0002 0.0060 0.0887 0.0491 0.0312 -0.0865 -0.0867 0.0378 -0.0794 -0.1174 0.0331 0.0432 0.0372 -0.0873 -0.0515 0.0382 0.0283
获取文档向量之后,还可以使用以下方法将文档向量嵌入二维空间tsne
通过指定维数为2。t-SNE图可以帮助显示数据中的集群,这表明您可以构建一个机器学习模型。
Y = tsne (meanEmbeddingTest);gscatter (Y (: 1), Y(:, 2),分类(tt))标题(“报告嵌入的工厂”)
培训文档分类器
在可视化文档向量和各自的聚类之后,您可以使用fitcecoc
.
mdl = fitcecoc (meanEmbeddingTrain TTrain,学习者=“线性”)
mdl = CompactClassificationECOC ResponseName: 'Y' ClassNames:[电子故障泄漏机械故障软件故障]ScoreTransform: 'none' binary学习者:{6×1 cell} CodingMatrix: [4×6 double]属性,方法
测试模型
计算平均向量的得分,可视化精度结果和混淆矩阵。
欧美=预测(mdl meanEmbeddingTest);acc =平均值(YTest == TTest)
acc = 0.9444
tt confusionchart(欧美)
对角线上的大数字表示对应类的预测精度高。非对角线上的大数字表示对应类之间有很强的混淆。
例子预处理功能
这个函数preprocessText
,依次执行以下步骤:
使用标记化文本
tokenizedDocument
.删除标点符号使用
erasePunctuation
.删除一个停止使用的单词列表(例如“and”,“of”和“the”)
removeStopWords
.小写的所有单词。
函数文件= preprocessText (textData)标记文本。文件= tokenizedDocument (textData);%擦掉标点符号。= erasePunctuation文件(文档);删除停止词列表。= removeStopWords文件(文档);小写所有单词。文件=低(文件);结束
另请参阅
fastTextWordEmbedding
|tokenizedDocument
|word2vec
|readWordEmbedding
|trainWordEmbedding
|wordEmbedding