训练情感分类器

这个例子展示了如何使用带注释的正面和负面情感词列表和预先训练的词嵌入来训练情感分析分类器。

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

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

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

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

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

加载预先训练的词嵌入

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

加载一个预先训练的词嵌入使用fasttextwordembeddings.函数。此功能需要文本分析工具箱™模型用于快速文本英语160亿令牌词嵌入万博1manbetx支持包。如果没有安装此支万博1manbetx持包,则该函数将提供下载链接。

emb = fasttextwordembedding;

负载的意见词典

从意见lexicon(也称为情绪词典)加载正面和否定词https://www.cs.uic.edu/~liub/FBS/sentiment-analysis.html.首先,从.rar.将文件放入名为opinion-lexicon-English,然后导入文本。

使用该功能加载数据readLexicon在此示例结束时列出。输出数据是一个变量的表单词包含了单词,和标签包含分类情绪标签,积极的

数据= Readlexicon;

把开头的几句话看作是肯定的。

idx = data.label ==“积极的”;头(数据(idx,:))
ans =.8×2表字标签____________ ________“A +”积极“比比皆是”积极“盛产”积极的“丰”正面“丰富的”积极“accessable”正“接近”正面“喝彩”正

将前几个单词标记为否定的。

idx = data.label ==“负面”;头(数据(idx,:))
ans =.8×2表单词标签_____________ ________ "双面的"否定的"双面的"否定的"异常的"否定的"废除的"否定的"可憎的"否定的"可憎的"否定的"厌恶的"否定的"否定的

准备培训数据

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

idx =〜IsVocabularyword(emb,data.word);数据(IDX,:) = [];

随机留出10%的单词进行测试。

numwords =大小(数据,1);cvp = cvpartition(numwords,“坚持”, 0.1);dataTrain =数据(训练(cvp):);人数(=数据(测试(cvp):);

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

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

火车情感分类器

列车支持向量机(万博1manbetxSVM)分类器将字向量分类为正和负类。

mdl = fitcsvm (XTrain YTrain);

测试分类器

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

wordsTest = dataTest.Word;wordsTest XTest = word2vec (emb);欧美= dataTest.Label;

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

[YPred,分数]=预测(mdl XTest);

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

图confusionchart(欧美,YPred);

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

图形子图(1,2,1)IDX = YPRED ==“积极的”;WordCloud(WordStest(IDX),分数(IDX,1));标题(“预测积极情绪”次要情节(1、2、2)wordcloud (wordsTest (~ idx),分数(~ idx, 2));标题(“预测负面情绪”

计算文本集合的情感

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

文件名=“weekendUpdates.xlsx”;tbl = readtable(文件名,“TextType”'细绳');textdata = tbl.textdata;TextData(1:10)
ans =.10×1的字符串数组“周年快乐!❤下一站:巴黎!✈#vacation”“哈哈,海滩上的烧烤,聘请自鸣得意模式!❤#vacation”“为星期六晚上准备好#yum #weekend”“和我说话 - 我需要一个#vacation !!!☹“在家中首次在家中冷却......这是生活!#weekend”“在考试前的最后#weekend。”"can’t believe my #vacation is over  so unfair" "Can’t wait for tennis this #weekend  " "I had so much fun!  Best trip EVER!  #vacation #weekend" "Hot weather and air con broke in car  #sweaty #roadtrip #vacation"

创建函数授权并预处理文本数据,以便它可以用于分析。功能PreprocessText.,按顺序执行以下步骤:

  1. 使用授权文本tokenizedDocument

  2. 使用擦除标点符号erasePunctuation

  3. 使用“使用”删除“和”和“”)的停止单词(例如“和”)Removestopwords.

  4. 转换为小写使用降低

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

文件= preprocessText (textData);

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

documents.Vocabulary idx = ~ isVocabularyWord (emb);= removeWords文档(文档、idx);

为了可视化情感分类器对新文本的推广效果,可以对文本中出现的但未出现在训练数据中的单词进行情感分类,并将其可视化为单词云。使用单词云来手动检查分类器是否按照预期的行为。

单词= documents.vocabulary;单词(ISMember(单词,Wordstrain))= [];vec = word2vec (emb,单词);[ypred,scores] =预测(MDL,VEC);图形子图(1,2,1)IDX = YPRED ==“积极的”;wordcloud(单词(idx),分数(idx 1));标题(“预测积极情绪”)次要情节(1、2、2)wordcloud(单词(~ idx),分数(~ idx, 2));标题(“预测负面情绪”

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

计算更新的平均情绪评分。对于每个文档,将单词转换为字向量,预测字向量上的情感分数,使用分数到后部变换功能来转换分数,然后计算平均情绪分数。

I = 1:numel(documents) words = string(documents(I));vec = word2vec (emb,单词);[~,分数]=预测(mdl vec);sentimentScore (i) =意味着(分数(:1));结束

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

表(SentmenceScore',TextData)
ans =.50×2表Var1 textData __________ ___________________________________________________________________________________________________________________________ 1.8382 "Happy anniversary! ❤ Next stop: Paris! ✈ #vacation" 1.294 "Haha, BBQ on the beach, engage smug mode!   ❤  #vacation" 1.0922 "getting ready for Saturday night  #yum #weekend " 0.094709 "Say it with me - I NEED A #VACATION!!! ☹" 1.4073 " Chilling  at home for the first time in ages…This is the life!  #weekend" -0.8356 "My last #weekend before the exam  ." -1.3556 "can’t believe my #vacation is over  so unfair" 1.4312 "Can’t wait for tennis this #weekend  " 3.0458 "I had so much fun!  Best trip EVER!  #vacation #weekend" -0.39243 "Hot weather and air con broke in car  #sweaty #roadtrip #vacation" 0.8028 " Check the out-of-office crew, we are officially ON #VACATION!! " 0.38217 "Well that wasn’t how I expected this #weekend to go  Total washout!! " 3.03 "So excited for my bestie to visit this #weekend!  ❤ " 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'“;”);wordsPositive =字符串(C {1});阅读消极词汇fidnegative = fopen(fulfile(“opinion-lexicon-English”“negative-words.txt”));C = textscan (fidNegative'%s''CommentStyle'“;”);wordsNegative =字符串(C {1});文件关闭所有%创建标签单词表话说= [wordsPositive; wordsNegative];标签=分类(nan(元素个数(单词),1));标签(1:元素个数(wordsPositive)) =“积极的”;标签(NUMER(字形)+1:结束)=“负面”;data =表(话说,标签,“VariableNames”, {“词”'标签'});结束

预处理功能

功能PreprocessText.执行以下步骤:

  1. 使用授权文本tokenizedDocument

  2. 使用擦除标点符号erasePunctuation

  3. 使用“使用”删除“和”和“”)的停止单词(例如“和”)Removestopwords.

  4. 转换为小写使用降低

函数文档= preprocessText(TextData)%标记文本。文档= tokenizeddocument(textdata);%擦掉标点符号。文件=侵蚀(文件);删除一个停止词列表。= removeStopWords文件(文档);%转换为小写。文件=低(文件);结束

参考书目

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

另请参阅

|||||||

相关的话题