罗兰关于MATLAB的艺术

将想法转化为MATLAB

数学与字-字嵌入与MATLAB和文本分析工具箱

文本数据已成为重要的组成部分数据分析这得益于自然语言处理技术的进步,该技术可以将非结构化文本转换为有意义的数据。新文本分析工具箱在MATLAB中提供处理和分析文本数据的工具。

今天的客座博主,古原竹内在新的工具箱中引入了一些很酷的特性字嵌入.看看他是怎么使用的情绪分析找到波士顿的AirBnB好地方

目录

什么是单词嵌入?

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

为什么我对它感到兴奋?它把单词“嵌入”到向量空间模型基于一个单词与其他单词的接近程度。在互联网范围内完成,您可以尝试捕获向量中单词的语义,以便相似的单词具有相似的向量。

关于单词嵌入如何表示这种关系的一个非常著名的例子是,你可以像这样做一个矢量计算:

$$国王-男人+女人大约皇后$$

是的,“女王”就像“国王”,只是它是一个女人,而不是一个男人!那有多酷?由于互联网上大量原始文本数据的可用性,这种魔力已经成为可能,更大的计算能力可以处理它,以及人工神经网络的进展,例如深度学习

更令人兴奋的是,如果您使用预先训练好的模型,您不必成为自然语言处理专家就可以利用单词嵌入的功能!让我来告诉您如何将其用于您自己的文本分析目的,例如文档分类信息检索情绪分析

成分

在这个例子中,我将使用一个预先训练过的词嵌入手套.请跟着我走

请将存档文件中的内容解压缩到当前文件夹中。

从手套中加载预先训练好的词嵌入

你可以使用这个函数readWordEmbedding在文本分析工具箱中读取预先训练过的单词嵌入。要查看单词向量,请使用word2vec来得到给定单词的向量表示。因为这个嵌入的维数是300,所以每个单词都有一个包含300个元素的向量。

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

向量的数学例子

让我们试试向量数学吧!下面是另一个著名的例子:

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

显然,矢量减法“巴黎-法国”编码了“首都”的概念,如果你加上“波兰”,就得到了“华沙”。

让我们用MATLAB试试。word2vec返回单词嵌入中给定单词的向量,以及vec2word找出在单词嵌入中与向量最接近的单词。

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

可视化单词嵌入

我们想把这个词可视化嵌入使用textscatter但如果把单词embedding的40万词全部包含在内,就很难想象。我找到了一个包含4000个英语名词的列表。让我们只使用这些词,并使用将维度从300减少到2tsne(t分布随机邻居嵌入)降维。为了更容易看到单词,我放大到情节中包含与食物相关的单词的特定区域。你可以看到相关的词被放在一起。

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

使用词语嵌入进行情感分析

对于一个词嵌入的实际应用,让我们考虑情感分析。我们通常会利用已经存在的情感词汇,比如这个来自芝加哥的伊利诺伊大学.它包含了2006个积极词汇和4783个消极词汇。让我们使用自定义函数加载词典加载词典

如果我们仅仅依靠词典中可用的单词,我们只能对6789个单词的情绪进行评分。一个扩展的想法是使用单词嵌入来找到与这些情绪词相近的单词。

pos=加载词典(“positive-words.txt”);neg=加载词典(“否定词.txt”);(长度(pos)(否定)
ans=2006 4783

单词嵌入符合机器学习

如果我们使用单词向量作为训练数据来开发一个分类器,该分类器可以对400000单词嵌入中的所有单词进行评分,会怎么样?我们可以利用相关单词在单词嵌入中紧密相连的事实来做到这一点。让我们制作一个情感分类器,利用单词嵌入的向量。

作为第一步,我们将从词汇中的单词嵌入中获取向量,创建一个包含300列的预测值矩阵,然后使用积极或消极情绪标签作为响应变量。下面是单词、响应变量和300个预测值变量中的前7个预测值变量的预览。

%删除不在嵌入的单词pos = pos (ismember (pos emb.Vocabulary));neg =底片(ismember (neg emb.Vocabulary));%得到相应的单词向量v_pos=word2vec(emb,pos);v_neg=word2vec(emb,neg);%初始化表并添加数据数据=表;数据。词= (pos;底片);pred = [v_pos; v_neg];Data = [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“丰富的”1 -0.29317 -0.068101 -0.44659 -0.31563 -0.13791 - 0.4888 - 1894“可访问的”1 -0.45096 -0.46794 - 0.11761 - 0.7075 - 0.26262“称赞的”1 - 0.69129 -0.11164 - 0.3615 -0.4499 - 0.44146 -0.0067972“称赞的”1 - 0.69129 - 0.04812 - 0.29267 - 0.1242 -0.13791 - 0.44888 - 1894“称赞的”1-0.026593 -0.60759 -0.15785 0.36048 -0.45289 0.0092178 0.074671

为机器学习准备数据

让我们将数据划分为训练集和holdout集进行性能评估。拒绝符集包含30%的可用数据。

rng (“默认”%的再现性c=cvpartition(数据分别,“坚持”,0.3); 训练=数据(训练(c),2:结束);Xtest=数据(测试(c),2:结束-1);Ytest=数据响应(测试(c));Ltest=数据(测试(c),1);Ltest.label=Ytest;

情感分类器的训练和评价

我们想要构建一个分类器,它可以在词嵌入定义的向量空间中分离正词和负数词。为了快速评估性能,我在可能的机器学习算法中选择了快速而简单的线性判别法。

这是混淆矩阵这个模型。分类准确率为91.1%。不坏。

%的火车模型mdl=fitcdiscr(列车,“职责”);对试验数据进行预测Ypred=预测(mdl,Xtest);cf=混淆材料(Ytest,Ypred);%显示结果Figure vals = {“负面”“积极”};热图(val, vals, cf);包含(“预测标签”)伊拉贝尔(“真实标签”)头衔({“线性判别式混淆矩阵”...sprintf (“分类准确率%.1f%%”...sum (cf(逻辑(眼(2))))/笔(sum (cf)) * 100)})

让我们对照实际标签检查预测的情绪分数。自定义类情绪采用线性判别模型对情感进行评分。

scoreWords班级的方法是给单词打分。正面的分数代表正面的情绪,负面的分数代表负面的情绪。现在我们可以用400000单词来给情绪打分。

dbtype情绪18:26
20 vec = word2vec(obj.emb,words);% word vector 21 if size(vec,2) ~= obj.em . dimension % check num cols 22 vec = vec';[~,scores,~] = predict(obj.mdl,vec);25 scores = scores(:,2) - scores(:,1);%正分数-负分数26结束

让我们测试这个自定义类。如果标签为0且得分为负,或者标签为1且得分为正,则模型正确地对单词进行了分类。否则,这个词就被错分类了。

下面的表格显示了测试集中的10个例子:

  • 这个词
  • 其情绪标签(0 =消极,1 =积极)
  • 其情绪得分(负=负,正=正)
  • 评估(true =正确,false =不正确)
sent=情绪(emb,mdl);Ltest.score=sent.scoreWords(Ltest.word);Ltest.eval=Ltest.score>0==Ltest.label;disp(Ltest(randsample)(高度(Ltest),10),:)
文字标签得分eval _____________ _____________ _____“逃亡”0 -0.90731真“不幸”0 -0.98667真“杰出”1 0.99999真“不情愿”0 -0.99694真“笨”0 -0.99957真“无忧无虑”1 0.97568真“催眠”1 0.4801真“slug”0 -0.88944真“天使”1 0.43419真“甜言蜜语”0 -0.98412真

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

dbtype情绪28:33
28功能分数=分数文本(obj,文本)29%分数文本分数文本情感30个标记=拆分(较低(文本));%将文本拆分为标记31个分数=obj.scoreWords(标记);%每个标记获得分数32个分数=平均值(分数,'omitnan');%平均值33个结束

下面是学生们给出的句子的情感分数scoreText方法-非常积极,有些积极,有些消极。

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

波士顿Airbnb开放数据

让我们在Kaggle上的Boston Airbnb开放数据页面的评论数据上试试这个。首先,我们想看看人们在评论中作为一个整体所说的话词云.文本分析工具箱提供简化文本预处理工作流程的功能,例如标记化文档哪个将文档解析为一个令牌数组,和bagOfWords生成术语频率计数模型(这可以用来构建机器学习模型)。

注释掉的代码将生成本文顶部显示的单词云。但是,您也可以使用两个被称为bigrams的单词短语生成单词云。您可以使用多芬,它对令牌数组进行操作。您还可以看到,可以生成三元组和其他字格通过修改函数句柄。

似乎很多评论都是关于地点的!

opts=检测端口选项(“listings.csv”);l = readtable (“listings.csv”、选择);评论= readtable (“reviews.csv”);评论= tokenizedDocument (reviews.comments);评论=低(评论);评论= removeWords(评论,stopWords);评论= removeShortWords(注释2);评论= erasePunctuation(评论);%==取消注释以生成单词云==%bag=bagOfWords(注释);%图% wordcloud(袋);%标题(“AirBnB评论词汇云”)生成一个Bigram字云F = @(s)s(1:end-1) +" "+ s(2:结束);三元= docfun (f,评论);bag2 = bagOfWords(三元);图wordcloud (bag2);标题(“AirBnB评论Bigram云”

Airbnb评估评级

评论评分也是可用的,但评分确实偏向于100,这意味着绝大多数列表都是完美的(真的吗?)作为这是XKD漫画我们有在线评分的问题关于审查评级。这不是很有用。

图直方图(l.review_scores_rating)标题(“AirBnB审查评级的分布”)包含(“审查评级”)伊拉贝尔(“#清单”

计算情绪得分

现在让我们来为Airbnb上市评论的情绪评分。因为一个上市可以有很多评论,所以我会使用每个上市的情绪评分中值。波士顿的情绪评分中值通常在正范围内,但它遵循正态分布。这看起来更现实。

给评论打分f = @(str) send . scoretext (str);评论。情绪= cellfun (f, reviews.comments);%通过列表计算评分中位数(G,上市)= findgroups(评论(:,“listing_id”));上市。情绪= splitapply (@median,...reviews.sentiment G);%可视化结果图直方图(listings.sentiment)标题(“波士顿AirBnB Listing的人气”)包含(“情绪得分中值”)伊拉贝尔(上市公司的数量

情绪的位置

bigram云显示,评论者经常对位置和距离发表评论。您可以使用列表的纬度和经度来查看情绪分数非常高或很低的列表所在的位置。如果您看到分数较高的列表,它们可能表示可以停留的好位置。

%加入情绪得分和列表信息加入= innerjoin (...上市,l (:, {“id”“纬度”“经”...“neighbourhood_cleansed”}),...“左键”“listing_id”“RightKeys”“id”);joined.Properties。VariableNames{结束}=“已”%丢弃带有NaN情感分数的列表加入(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图imagesc(lonlim,latlim, map)保持gscatter (joined.longitude joined.latitude、joined.cat colorlist,“哦”)持有dar=[1,cosd(平均值(latlim)),1];daspect(dar)集(gca,“ydir”“正常”);轴([lonlim latlim])标题(“波士顿Airbnb上市的情绪得分”) [g,ngh] = findgroups(join (:,“已”));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一起发布

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。