主要内容

训练一个情感分类器

这个例子展示了如何使用带注释的积极和消极情绪词汇列表以及预训练的词汇嵌入来训练一个用于情感分析的分类器。

预训练的词嵌入在这个工作流中扮演了几个角色。它将单词转换为数字向量,并形成分类器的基础。然后,您可以使用分类器使用它们的向量表示来预测其他单词的情感,并使用这些分类来计算一段文本的情感。情感分类器的训练和使用有四个步骤:

  • 加载一个预先训练好的词嵌入。

  • 加载一个列出积极和消极词汇的意见词典。

  • 使用积极和消极词的词向量训练一个情感分类器。

  • 计算一篇文章中单词的平均情绪得分。

加载预训练词嵌入

词嵌入将词汇表中的词映射到数字向量。这些嵌入可以捕获单词的语义细节,以便相似的单词具有相似的向量。他们还通过向量运算建立单词之间的关系。例如,关系罗马之于巴黎,就像意大利之于法国是由方程描述的 R o e - t 一个 l y + F r 一个 n c e P 一个 r 年代

方法加载预训练的词嵌入fastTextWordEmbedding函数。此功能需要文本分析工具箱™模型快速文本英语160亿令牌词嵌入金宝app支持包。如果没有安装此支金宝app持包,则该函数将提供下载链接。

emb = fasttextwordem寝料;

加载意见词典

从观点词汇库(也称为情感词汇库)加载积极和消极词汇https://www.cs.uic.edu/~liub/FBS/sentiment-analysis.html.[1]首先,从. rar文件放入名为opinion-lexicon-English,然后导入文本。

使用函数加载数据readLexicon在本例的末尾列出。输出数据表中有变量吗包含单词,和标签包含一个明确的情感标签,积极的

data = readLexicon;

把前几个词看作是积极的。

Idx = data。标签= =“积极的”;头(数据(idx,:))
ans =8×2表单词标签____________ ________ "a+"积极的"丰富的"积极的"丰富的"积极的"丰富的"积极的"可接近的"积极的"可接近的"积极的"喝彩"积极的

把前几个词看作是消极的。

Idx = data。标签= =“负面”;头(数据(idx,:))
ans =8×2表字标签  _____________ ________ " "“负面”2张脸“负面”异常“负面”废除“负面”可恶的“负面”可恶地“负面”痛恨厌恶“消极负面的

为培训准备数据

为了训练情感分类器,使用预训练的词嵌入将单词转换为单词向量循证.首先删除单词嵌入中没有出现的单词循证

idx = ~isVocabularyWord(emb,data.Word);Data (idx,:) = [];

随机抽取10%的单词进行测试。

numWords = size(数据,1);cvp = cvpartition(numWords,“坚持”, 0.1);dataTrain = data(training(cvp),:);dataTest =数据(测试(cvp),:);

将训练数据中的单词转换为单词向量word2vec

wordsTrain = dataTrain.Word;XTrain = word2vec(emb,wordsTrain);YTrain = dataTrain.Label;

列车情感分类器

训练一个支持向量金宝app机(SVM)分类器,它将词向量分类为正类和负类。

mdl = fitcsvm(XTrain,YTrain);

测试分类器

将测试数据中的单词转换为单词向量word2vec

wordsTest = dataTest.Word;XTest = word2vec(emb,wordsTest);YTest = dataTest.Label;

预测测试词向量的情感标签。

[YPred,scores] = predict(mdl,XTest);

在混淆矩阵中可视化分类精度。

图confusionchart(欧美,YPred);

在词云中可视化分类。将具有积极情绪和消极情绪的单词绘制在单词云中,单词大小与预测得分对应。

图subplot(1,2,1) idx = YPred ==“积极的”;wordcloud (wordsTest (idx),分数(idx 1));标题(“预测的积极情绪”) subplot(1,2,2) wordcloud(wordsTest(~idx),scores(~idx,2));标题(“预测负面情绪”

计算文本集合的情感

为了计算一段文本的情绪,例如社交媒体上的更新,预测文本中每个单词的情绪得分,并取情绪得分的平均值。

文件名=“weekendUpdates.xlsx”;TBL =可读(文件名,“TextType”“字符串”);textData = tbl.TextData;textData (1:10)
ans =10×1字符串数组“结婚周年快乐!下一站:巴黎!“哈哈,在海滩上烧烤,进入自鸣得意模式!”“为周六晚上做准备#yum #周末”“和我一起说——我需要一个#假期!!”多年来第一次在家放松一下…这就是生活!“我考试前的最后一个周末”“真不敢相信我的假期结束得这么不公平”“这个周末等不及打网球了”“我玩得很开心!”最棒的旅行!“天气热,空调坏在车里#大汗淋漓#公路旅行#假期”

创建一个函数,对文本数据进行标记和预处理,以便用于分析。这个函数preprocessText,在示例末尾列出,它按顺序执行以下步骤:

  1. 使用标记化文本tokenizedDocument

  2. 使用删除标点符号erasePunctuation

  3. 删除使用停止词(如“and”,“of”和“the”)removeStopWords

  4. 转换为小写使用较低的

使用预处理功能preprocessText准备文本数据。这一步可能需要几分钟的时间来运行。

documents = preprocessText(textData);

从文档中删除没有出现在单词嵌入中的单词循证

idx = ~isVocabularyWord(emb,documents.Vocabulary);documents = removeWords(documents,idx);

为了可视化情感分类器对新文本的泛化效果,可以对文本中出现而不是训练数据中出现的单词的情感进行分类,并在词云中可视化它们。使用词云手动检查分类器的行为是否符合预期。

words = documents.Vocabulary;words(ismember(words,wordsTrain)) = [];Vec = word2vec(emb,words);[YPred,scores] = predict(mdl,vec);图subplot(1,2,1) idx = YPred ==“积极的”;wordcloud(单词(idx),分数(idx 1));标题(“预测的积极情绪”) subplot(1,2,2) wordcloud(words(~idx),scores(~idx,2));标题(“预测负面情绪”

为了计算给定文本的情感,计算文本中每个单词的情感得分,并计算平均情感得分。

计算更新的平均情绪得分。对于每个文档,将单词转换为单词向量,预测单词向量上的情感得分,使用得分后验变换函数对得分进行变换,然后计算平均情感得分。

I = 1:numel(documents) words = string(documents(I));Vec = word2vec(emb,words);[~,scores] = predict(mdl,vec);sentimentScore(i) = mean(scores(:,1));结束

使用文本数据查看预测的情绪分数。得分大于0的代表积极情绪,得分小于0的代表消极情绪,得分接近0的代表中性情绪。

表(sentimentScore’,textData)
ans =50×2表Var1 textData  __________ ___________________________________________________________________________________________________________________________ 1.8382”结婚纪念日快乐!下一站:巴黎!度假“1.294”哈哈,在海滩上烧烤,进入自鸣得意模式!#假期“1.0922”准备好周六晚上#yum #周末“0.094709”和我一起说——我需要一个#假期!!多年来第一次在家放松一下…这就是生活!-1.3556“我考试前的最后一个周末”“不敢相信我的假期结束得太不公平了”“1.4312”“这个周末我等不及打网球了”“3.0458”我玩得很开心!最棒的旅行!热天气和车内空调坏了#汗流浃背#公路旅行#假期“0.8028”检查不在办公室的工作人员,我们正式开始度假了!!“0.38217”我没想到这个周末会彻底完蛋!!“3.03”我的闺蜜这个周末要来看我,我太兴奋了!  ❤ " 2.3849 "Who needs a #vacation when the weather is this good ☀ " -0.0006176 "I love meetings in summer that run into the weekend! Wait that was sarcasm. Bring on the aircon apocalypse!  ☹ #weekend" 0.52992 "You know we all worked hard for this! We totes deserve this  #vacation  Ibiza ain’t gonna know what hit em " ⋮

情感词汇阅读功能

这个函数从情感词汇表中读取积极和消极词汇,并返回一个表。表中包含变量而且标签,在那里标签包含分类值积极的而且与每个词的情感相对应。

函数data = readLexicon%阅读积极词汇fidPositive = fopen(fullfile(“opinion-lexicon-English”“positive-words.txt”));C = textscan(fidPositive,' % s '“CommentStyle”“;”);wordpositive = string(C{1});%阅读负面词汇fidNegative = fopen(fullfile(“opinion-lexicon-English”“negative-words.txt”));C = textscan(fidNegative,' % s '“CommentStyle”“;”);wordsNegative = string(C{1});文件关闭所有创建标签单词表words = [wordpositive; wordnegative];标签= categorical(nan(数字(词),1));标签(1:元素个数(wordsPositive)) =“积极的”;标签(元素个数(wordsPositive) + 1:结束)=“负面”;数据=表(单词,标签,“VariableNames”, {“词”“标签”});结束

预处理功能

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

  1. 使用标记化文本tokenizedDocument

  2. 使用删除标点符号erasePunctuation

  3. 删除使用停止词(如“and”,“of”和“the”)removeStopWords

  4. 转换为小写使用较低的

函数documents = preprocessText(textData)标记文本。documents = tokenizedDocument(textData);删除标点符号。documents = eraspunctuation(文档);删除一个停止词列表。documents = removeStopWords(文档);%转换为小写字母。文档=较低(文档);结束

参考书目

  1. 胡敏清,刘兵。“挖掘和总结客户评论。”在第十届ACM SIGKDD知识发现和数据挖掘国际会议论文集,第168-177页。ACM, 2004年。

另请参阅

|||||||

相关的话题