罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经退休,不会被更新。

数学与单词字嵌入的MATLAB工具箱和文本分析

文本数据已经成为一个重要的部分数据分析由于先进的自然语言处理,将非结构化文本转换为有意义的数据。新文本分析工具箱提供了在MATLAB工具来处理和分析文本数据。

今天的嘉宾博客古原竹内介绍了一些很酷的特性在新的工具箱,开始字嵌入。看看他是如何使用的情绪分析找到好AirBnB的位置留在波士顿!

内容

一个字嵌入是什么?

你听说过word2vec手套吗?这些都是非常强大的自然语言处理技术的一部分嵌入的,,你现在可以利用MATLAB工具箱通过文本分析。

我为什么兴奋?“嵌入”字变成一个向量空间模型基于词出现的频率接近。做一个互联网规模,你可以尝试捕捉中的词的语义向量,这样类似的词有相似的向量。

一个非常著名的例子嵌入可以表示这种关系的词,你可以做一个向量计算如下:

$ $ -王男+女\大约$ $女王

是的,“女王”就像“王”,除了它是一个女人,而不是一个男人!这太酷了,不是吗?这种魔法成为可能由于在互联网上庞大的原始文本数据的可用性,更大的计算能力,可以处理它和人工神经网络的进步,如深度学习

更令人兴奋的是,你不必是一个自然语言处理专家利用字嵌入的如果你使用pre-trained模型!让我告诉你如何使用它自己的文本分析的目的,如文档分类,信息检索情绪分析

成分

在这个例子中,我将使用一个pre-trained字嵌入手套。请跟随

请将内容从归档文件提取到当前文件夹。

从手套加载Pre-Trained字嵌入

您可以使用函数readWordEmbedding在文本分析工具箱pre-trained字嵌入的阅读。看到一个词向量,使用word2vec给定单词的向量表示。因为这个嵌入的尺寸是300,我们得到一个向量的每个单词300个元素。

文件名=“glove.6B.300d”;如果存在(文件名+“.mat”,“文件”)~ = 2 emb = readWordEmbedding(文件名+' . txt ');保存(文件名+“.mat”,“循证”,“-v7.3”);其他的负载(文件名+“.mat”)结束v_k = word2vec (emb,“王”)”;谁v_k
类属性名称大小字节v_k 300 x1 1200单

向量的数学例子

让我们尝试矢量数学!这是另一个著名的例子:

$ $巴黎——法国+波兰华沙\大约$ $

显然,向量减法“巴黎——法国“编码“资本”的概念,如果你添加“波兰”,得到“华沙”。

让我们尝试用MATLAB。word2vec返回向量嵌入给定单词的词,和vec2word找到最接近的词向量的“嵌入”这个词。

v_paris = word2vec (emb,“巴黎”);v_france = word2vec (emb,“法国”);v_poland = word2vec (emb,“波兰”);vec2word (emb v_paris - v_france + v_poland)
ans =“华沙”

可视化嵌入这个词

我们想想象这个词嵌入使用textscatter情节,但很难想象如果一切从嵌入这个词都包含400000个单词。我发现4000个英语名词的列表。让我们用这些话只和尺寸从300人减少到2使用tsne(t-Distributed随机邻居嵌入)降维。,让它更容易看到的话,我放大特定区域的情节包含食品相关词汇。你可以看到相关词汇被放置在一起。

如果存在(“nouns.mat”,“文件”)~ = 2 url =“http://www.desiquintans.com/downloads/nounlist/nounlist.txt”;名词= webread (url);名词=分裂(名词);保存(“nouns.mat”,“名词”);其他的负载(“nouns.mat”)结束名词(~ ismember(名词、emb.Vocabulary)) = [];vec = word2vec (emb、名词);rng (“默认”);%的再现性xy = tsne (vec);图textscatter (xy,名词)标题(“手套字嵌入(6 b.300d)——食品相关领域”轴([-35 -10 -36 -14]);集(gca),“剪裁”,“关闭”)轴

使用字嵌入的情绪分析

嵌入的实际应用的词,让我们考虑一下情绪分析。我们通常利用已有的情绪词汇等这个从芝加哥伊利诺伊大学。它有2006 4783年积极词汇和消极词汇。我们使用自定义函数加载词典load_lexicon

如果我们只依赖于可用的单词词汇,我们只能分人气6789字。扩大在这一个想法是用嵌入这个词来找到那些接近这些情绪词汇。

pos = load_lexicon (“positive-words.txt”);neg = load_lexicon (“negative-words.txt”);(长度(pos)(否定)
ans = 2006 4783

字嵌入满足机器学习

如果我们使用词向量作为训练数据建立一个分类器,可以得分在400000字嵌入所有单词?我们可以利用这一事实相关词在词紧密嵌入。让我们制作一个情感分类器,利用向量的“嵌入”这个词。

作为第一步,我们将得到这个词向量嵌入单词的词典来创建一个矩阵预测300列,然后使用积极或消极情绪标签作为响应变量。这是这个词的预览,响应变量和第一个预测变量的300。

%下降的话不是嵌入pos = pos (ismember (pos emb.Vocabulary));neg =底片(ismember (neg emb.Vocabulary));%得到相应的词向量v_pos = word2vec (emb、pos);neg v_neg = word2vec (emb);%初始化表并添加数据数据=表;数据。词= (pos;底片);pred = [v_pos; v_neg];data =[数据array2table (pred)];数据。resp = 0(高度(数据),1);data.resp(1:长度(pos)) = 1;%预览表头(数据(:,(1、结束2:8)))
ans = 8×9表词resp pred1 pred2 pred3 pred4 pred5 pred6 pred7 _________________替________ __________ ___ _____ _____ _____“比比皆是”1 0.081981 -0.27295 0.32238 0.19932 0.099266 0.60253 0.18819“丰富”1 -0.037126 0.085212 0.26952 0.20927 -0.014547 0.52336 0.11287“丰富”1 -0.038408 0.076613 -0.094277 -0.10652 -0.43257 0.74405 0.41298“丰富”1 -0.29317 -0.068101 -0.44659 -0.31563 -0.13791 0.44888 0.31894“访问”1 -0.45096 -0.46794 0.11761 -0.70256 0.19879 0.44775 0.26262“好评”1 0.07426 -0.11164 0.3615 -0.4499 -0.0061991 0.44146 -0.0067972“好评”1 0.69129 0.04812 0.29267 0.1242 0.083869 0.25791 -0.5444“欢呼”1 -0.026593 -0.60759 -0.15785 0.36048 -0.45289 0.0092178 0.074671

机器学习的数据做好准备

让我们分区的数据为训练集和抵抗组绩效评估。坚持集包含30%的可用数据。

rng (“默认”)%的再现性c = cvpartition (data.resp“坚持”,0.3);火车=数据(训练(c), 2:结束);Xtest =数据(测试(c), 2: end-1);欧美= data.resp(测试(c));lte =数据(测试(c), 1);lte。标签=欧美;

培训和评估情绪分类器

我们想要建立一个分类器,可以单独的积极词汇和消极词汇定义的向量空间嵌入这个词。快速性能评估,我选择了快速和简单的线性判别可能的机器学习算法。

这是混淆矩阵这个模型。结果是91.1%的分类精度。不坏。

%的火车模型mdl = fitcdiscr(火车,“职责”);%对测试数据预测Xtest Ypred =预测(mdl);cf = confusionmat(欧美,Ypred);%显示结果图vals = {“负面”,“积极”};热图(val, vals, cf);包含(“预测标签”)ylabel (“真正的标签”)标题({线性判别的混淆矩阵;sprintf (的分类精度% .1f % %,sum (cf(逻辑(眼(2))))/笔(sum (cf)) * 100)})

让我们检查预测情绪得分对实际标签。自定义类情绪使用线性判别模型得分的情绪。

scoreWords方法的类分数的话。积极的分数代表了积极的情绪,消极的分数是负的。现在我们可以使用400000个字来得分的情绪。

dbtypesentiment.m18:26
18功能分数= scoreWords (obj,言语)19% scoreWords分数情绪的单词vec = 20 word2vec (obj.emb、单词);%词向量21如果大小(矢量,2)~ = obj.emb。vec的维度vec = % num关口检查22;%根据需要转置23结束24[~,分数,~]=预测(obj.mdl vec);%得分25类概率=分数(:,2)——分数(:1);%正分数——负分数26日结束

让我们来测试这个自定义类。如果标签是0,分数是负或标签1和分数是正的,那么模型分类词正确。否则,这个词是被误诊。

这是表显示10来自测试集的例子:

  • 这个词
  • 其情绪标签(0 = - 1 =积极)
  • 其情绪得分(- = -,积极=积极)
  • 评价(对=正确,错=不正确)
发送=情绪(emb、mdl);lte。分数= sent.scoreWords (Ltest.word);lte。eval = lte。分数> 0 = = Ltest.label;disp (lte (randsample(高度(lte), 10),:))
词标签得分eval _________________ ________ ________ ________“逃犯”0 -0.90731真的“不幸”0 -0.98667真的“杰出的”1 0.99999真的“不情愿”0 -0.99694真的“糟蹋”0 -0.99957真的“无忧无虑”1 0.97568真的“迷住”1 0.4801真的“鼻涕虫”0 -0.88944真的“天使”真的“用甜言蜜语哄骗”0 -0.98412真的1 0.43419

现在我们需要一种方法来分数人类语言文本的情绪,而不是一个词。的scoreText情绪类平均法在文本中每个单词的情绪得分。这可能不是最好的办法,但这是一个简单的开始。

dbtypesentiment.m28:33
28功能得分= scoreText (obj,文本)29% scoreText分数情绪的文本30令牌=分裂(低(文本);%的文本分割成令牌31分数= obj.scoreWords(令牌);%得到分数为每个令牌32分数=意味着(分数,“omitnan”);%的平均分数33

这是情绪得分给出的句子scoreText方法——非常积极,有些正面的和负面的。

[sent.scoreText (这是神奇的)sent.scoreText (“这是好的”)sent.scoreText (“这很糟糕”)]
ans = 0.91458 0.80663 -0.073585

波士顿Airbnb公开数据

让我们试试这个审查数据从波士顿Airbnb Kaggle开放数据页面。首先,我们希望看到人们说什么在他们的评论词云。文本分析工具箱提供的功能来简化文本预处理工作流等tokenizedDocument文档解析到一个数组中令牌,然后呢bagOfWords产生这个词频率计数模型(这可以用来建立一个机器学习模型)。

注释掉的代码将生成这个词云这篇文章的顶部显示。不过,您还可以使用两个单词短语称为三元生成词云。您可以生成三元docfun的数组,令牌。您还可以看到,可以生成三元模型和其他字格通过修改函数处理。

似乎很多评论是关于位置!

选择= detectImportOptions (“listings.csv”);l = readtable (“listings.csv”、选择);评论= readtable (“reviews.csv”);评论= tokenizedDocument (reviews.comments);评论=低(评论);评论= removeWords(评论,stopWords);评论= removeShortWords(注释2);评论= erasePunctuation(评论);% = =取消生成一个词云= =%袋= bagOfWords(评论);%图% wordcloud(袋);%的标题(“AirBnB评论词云”)%生成一个元字云f = @ (s) (1: end-1) +”“+ s(2:结束);三元= docfun (f,评论);bag2 = bagOfWords(三元);图wordcloud (bag2);标题(“AirBnB审查三元云”)

Airbnb评估评级

评估评级也可用,但评级是偏向于100年,这意味着绝大多数上市公司是非常完美的(真的吗?)。作为这XCKD漫画所示,我们有在线评级的问题关于审核评级。这不是很有用。

图直方图(l.review_scores_rating)标题(AirBnB评估评级的分布)包含(“评估评级”)ylabel (“#清单”)

计算情绪得分

现在让我们分情绪Airbnb清单审核。从清单可以评论的数量,我将使用情绪得分中值/清单。波士顿情绪得分中值通常是积极的,但它遵循正态分布。这看起来更为现实。

%的分数评论f = @ (str) sent.scoreText (str);评论。情绪= cellfun (f, reviews.comments);%计算分数的平均审查清单(G,上市)= findgroups(评论(:,“listing_id”));上市。情绪= splitapply (@median,reviews.sentiment G);%可视化结果图直方图(listings.sentiment)标题(“波士顿AirBnB情感清单”)包含(“情绪得分中值”)ylabel (上市公司的数量)

情绪的位置

三元云显示评论者经常评论位置和距离。您可以使用纬度和经度的清单看清单非常高或低情绪得分。如果你看到集群的高分数,也许他们可能表明良好的位置。

%加入情绪得分和清单信息加入= innerjoin (上市,l (:, {“id”,“纬度”,“经”,“neighbourhood_cleansed”}),“LeftKeys”,“listing_id”,“RightKeys”,“id”);joined.Properties。VariableNames{结束}=“已”;%丢弃上市与南情绪得分加入(isnan (joined.sentiment):) = [];%离散化情绪得分到桶中加入。猫=离散化(joined.sentiment 0:0.25:1,“分类”,{“< 0.25”,“< 0.50”,“< 0.75”,“< = 1.00”});%去除未定义的类别猫=类别(joined.cat);加入(isundefined (joined.cat):) = [];%变量颜色colorlist =冬天(长度(猫));%生成图latlim = (42.300 - 42.386);lonlim = (-71.1270 - -71.0174);负载boston_map.mat图显示亮度图像(lonlim latlim,地图)gscatter (joined.longitude joined.latitude、joined.cat colorlist,“o”)举行dar = [1, cosd(平均(latlim)), 1];daspect (dar)组(gca,“ydir”,“正常”);轴([lonlim latlim])标题(“情绪得分由波士顿Airbnb清单”)(g,已)= findgroups(加入(:,“已”));ngh.Properties。VariableNames{结束}=“名字”;已。lat = splitapply (@mean, joined.latitude, g);已。朗= splitapply (@mean, joined.longitude, g);%的注释文本(ngh.lon (2), ngh.lat (2), ngh.name (2),“颜色”,' w ')文本(ngh.lon (4), ngh.lat (4), ngh.name (4),“颜色”,' w ')文本(ngh.lon (6), ngh.lat (6), ngh.name (6),“颜色”,' w ')文本(ngh.lon (11), ngh.lat (11), ngh.name (11),“颜色”,' w ')文本(ngh.lon (13), ngh.lat (13), ngh.name (13),“颜色”,' w ')文本(ngh.lon (17), ngh.lat (17), ngh.name (17),“颜色”,' w ')文本(ngh.lon (18), ngh.lat (18), ngh.name (18),“颜色”,' w ')文本(ngh.lon (22), ngh.lat (22), ngh.name (22),“颜色”,' w ')

总结

在这篇文章中,我重点词嵌入和情绪分析作为一个例子的文本分析工具箱中提供的新特性。希望你看到工具箱使得先进的文本处理技术很容易理解。你可以做更多的字嵌入除了情绪分析,和工具箱提供了更多的功能除了字嵌入的,如潜在语义分析潜在狄利克雷分配

希望我有更多的机会在文本分析工具箱讨论其他有趣的功能。

得到一个免费试用版玩,让我们知道你的想法在这里!




发表与MATLAB®R2017b

|