主要内容

生成领域特定的情感词汇

这个例子展示了如何使用10-K和10-Q财务报告生成用于情绪分析的词汇。

情感分析允许您自动总结给定文本中的情感。例如,在“这家公司表现出强劲的增长”和“另一家公司被指控误导消费者”这两篇文章中,分别分配积极和消极的情绪。另外,例如,分配文本“This company is shows .比“这家公司表现出强劲的增长”这一文本更有信心。

像VADER这样的情感分析算法依赖于被称为情感词汇的注释单词列表。例如,VADER使用一个情绪词典,其中的单词注释了从-1到1的情绪分数,其中接近1的分数表示强烈的积极情绪,接近-1的分数表示强烈的消极情绪,接近零的分数表示中性情绪。

要使用VADER算法分析文本的情感,请使用vaderSentimentScores函数。如果情感词汇所使用的vaderSentimentScores函数并不适合您正在分析的数据,例如,如果您有一个特定于领域的数据集,如医疗或工程数据,那么您可以使用一小组种子词生成自己的自定义情感词汇。

这个例子展示了如何使用基于[的基于图的方法,在给定种子词的集合的情况下生成一个情感词汇表。1]:

  • 训练一个单词嵌入,使用训练数据对单词之间的相似性建模。

  • 创建一个简化的图,用对应于单词和相似度加权的边的节点表示嵌入。

  • 要确定极性较强的单词,请通过较短但权重较大的路径识别与多个种子单词相连的单词。

加载数据

通过电子数据收集、分析和检索(EDGAR) API从证券交易委员会(SEC)下载10-K和10-Q财务报告数据[2使用thefinanceReportsHelper函数作为支持文件附加到此示例。万博1manbetx要访问此文件,请将此示例作为Live Script打开。的financeReports函数可以下载指定年、季度和最大字符长度的10-K和10-Q报告。

下载2019年第四季度的2万份报告。根据报告的大小,这可能需要一些时间来运行。

年= 2019年;QTR = 4;textData = financeReports(年,qtr,“MaxNumReports”, 20000);
下载10-K和10-Q报告…完成了。运行时间为1799.718710秒。

定义用于此数据的积极和消极种子词集。种子词必须在文本数据中至少出现一次,否则它们将被忽略。

seedpositive = [“实现”“优势”“更好”“创意”“效率”...“有效”“增强”“更大的”“改进”“改善”...“创新”“创新”“创新”“机会”“盈利”...“盈利”“力量”“加强”“强”“成功”]“;种子阴性= [“不良”“不利”“对”“投诉”“关注”...“赔偿”“默认”“缺陷”“披露”“失败”...“欺诈”“障碍”“诉讼”“损失”“误导”...“省略”“重申”“重组”“终止”“弱点”]“;

准备文本数据

创建函数名preprocessText这将为分析准备文本数据。的preprocessText函数,示例末尾列出的函数执行以下步骤:

  • 删除所有url。

  • 标记文本。

  • 删除包含数字的令牌。

  • 将文本转换为小写。

  • 删除任何两个或更少字符的单词。

  • 删除任何停止词。

属性预处理文本preprocessText函数。根据文本数据的大小,这可能需要一些时间来运行。

documents = preprocessText(textData);

在单词云中可视化预处理文本数据。

图wordcloud(文件);

列车词嵌入

词嵌入将词汇表中的词映射到数字向量。这些嵌入可以捕获单词的语义细节,以便相似的单词具有相似的向量。

训练一个单词嵌入,使用训练数据对单词之间的相似性建模。指定大小为25的上下文窗口,并丢弃出现少于20次的单词。根据文本数据的大小,这可能需要一些时间来运行。

emb = trainwordem寝料(文档,“窗口”25岁的“MinCount”, 20);
训练:100%损失:1.44806剩余时间:0小时0分钟。

创建单词图表

创建一个简化的图,用对应于单词和相似度加权的边的节点表示嵌入。

创建一个加权图,其中节点对应词汇表中的单词,边表示单词之间是否在7的邻域内,权重对应于嵌入中对应单词向量之间的余弦距离。

对于词汇表中的每个单词,找出最近的7个单词及其余弦距离。

numNeighbors = 7;词汇= emb.词汇;worddvtors = word2vec(emb,词汇);[nearestWords,dist] = vec2word(emb,wordVectors,numNeighbors);

要创建图形,请使用函数,并成对指定源节点和目标节点,并指定它们的边权值。

定义源节点和目标节点。

sourceNodes = repelem(词汇表,numNeighbors);targetNodes =重塑(nearestWords,1,[]);

计算边权值。

edgeWeights =重塑(dist,1,[]);

创建一个图形,将每个单词与其相邻单词连接起来,其边权值对应于相似度得分。

wordGraph = graph(sourceNodes,targetNodes,edgeWeights,词汇表);

属性删除重复的边简化函数。

wordGraph =简化(wordGraph);

可视化单词图表中与单词“损失”相关的部分。

词=“损失”;idx = findnode(wordGraph,word);nbrs =邻居(wordGraph,idx);wordSubgraph = subgraph(wordGraph,[idx;nbr]);图形图(wordSubgraph)"与""有关的单词"+单词+”“”“

生成情绪评分

要确定极性较强的单词,请通过较短但权重较大的路径识别与多个种子单词相连的单词。

初始化词汇表中每个单词对应的情感分数数组。

sentimentScores = 0([1数字(词汇)]);

迭代遍历图并更新情绪分数。

在不同的深度遍历图形。对于每个深度,通过使用积极和消极的种子将情绪传播到图表的其余部分,计算单词的积极和消极极性。

对于每个深度:

  • 计算正极性和负极性分数。

  • 解释图中正流和负流总体质量的差异。

  • 对于每个节点词,将其两个分数的差值归一化。

运行算法后,如果一个短语的正极性得分高于负极性得分,那么它的最终极性将为正极性,否则为负极性。

指定最大路径长度为4。

maxPathLength = 4;

迭代遍历图表并计算情绪分数的总和。

depth = 1:maxPathLength计算极性分数。polarityPositive = polaritscores (seedpositive,vocabulary,wordGraph,depth);polarityNegative = polaritscores(种子负,词汇量,wordGraph,深度);占正、负流总质量的差异%。b = sum(polarityPositive) / sum(polarityNegative);计算新的情绪分数。sentimentScoresNew = polarityPositive - b * polarityNegative;sentimentScoresNew = normalize(sentimentScoresNew,“范围”[1]);将分数相加。sentimentScores = sentimentScores + sentimentScoresNew;结束

根据迭代次数将情绪分数归一化。

sentimentScores = sentimentScores / maxPathLength;

创建一个包含词汇和相应情绪分数的表。

TBL =表;资源描述。Token =词汇表';资源描述。SentimentScore = sentimentScores';

若要从词汇库中删除具有中性情绪的令牌,请删除情绪评分绝对值小于0.1阈值的令牌。

THR = 0.1;idx = abs(tbl.SentimentScore) < thr;Tbl (idx,:) = [];

按情绪分数降序排序表行,并查看前几行。

TBL = sortrows(TBL,“SentimentScore”“下”);头(台)
ans =8×2表令牌情绪指数_______________ ______________“机会”0.95633“创新”0.89635“成功”0.84362“聚焦”0.83768“强势”0.81042“能力”0.79174“创新”0.77698“改善”0.77176

的自定义情感词汇表vaderSentimentScores函数。

在词云中可视化情感词汇。在一个词云中显示得分为正的标记,在另一个词云中显示得分为负的标记。显示由其相应的情感分数绝对值给出的大小的单词。

图次要情节(1、2、1);Idx = tbl。情感评分> 0;tblPositive = tbl(idx,:);wordcloud (tblPositive“令牌”“SentimentScore”)标题(“积极词汇”)次要情节(1、2、2);Idx = tbl。情感得分< 0;tblNegative = tbl(idx,:);tblNegative。情感分数= abs(tblNegative.SentimentScore);wordcloud (tblNegative“令牌”“SentimentScore”)标题(“消极词汇”

将表导出到CSV文件。

文件名=“financeSentimentLexicon.csv”;writetable(资源描述、文件名)

分析文本中的情感

要分析以前未见过的文本数据中的情绪,请使用相同的预处理步骤对文本进行预处理,并使用vaderSentimentScores函数。

方法创建包含文本数据的字符串数组并对其进行预处理preprocessText函数。

textDataNew = [“这家创新型公司正持续呈现强劲增长。”“另一家公司被指控误导消费者。”];documentsNew = preprocessText(textDataNew);

评估情绪使用vaderSentimentScores函数。属性指定在本例中创建的情感词汇“SentimentLexicon”选择。

复合分数= vaderSentimentScores(documentsNew,“SentimentLexicon”(资源)
compoundScores =2×10.4360 - -0.1112

正面分数和负面分数分别表示正面情绪和负面情绪。价值的大小与情绪的强度相对应。

万博1manbetx支持功能

文本预处理功能

preprocessText函数执行以下步骤:

  • 删除所有url。

  • 标记文本。

  • 删除包含数字的令牌。

  • 将文本转换为小写。

  • 删除任何两个或更少字符的单词。

  • 删除任何停止词。

函数documents = preprocessText(textData)%删除url。textData = eraseURLs(textData);%标记。documents = tokenizedDocument(textData);移除包含数字的令牌。pat = textBoundary + wildcardPattern + digitpattern + wildcardPattern + textBoundary;Documents = replace(Documents,pat,"");%转换为小写字母。文档=较低(文档);删除短单词。文档= removeShortWords(文档,2);删除停止词。documents = removeStopWords(文档);结束

极性分数命令功能

polarityScores函数返回给定一组种子词、词汇、图表和指定深度的极性分数向量。该函数计算从每个种子词到词汇表中每个节点的最大加权路径的和。极性分数高表示短语通过短和强加权路径连接到多个种子词。

该函数执行以下步骤:

  • 将种子的分数初始化为1或0。

  • 在种子上绕圈。对于每个种子,迭代遍历不同深度的图。对于第一次迭代,将搜索空间设置为种子的直接邻居。

  • 对于每个深度级别,遍历搜索空间中的节点并识别其在图中的邻居。

  • 循环遍历它的邻居并更新相应的分数。更新的分数是种子和邻居的当前分数的最大值,以及种子和搜索节点的分数由对应的图边加权。

  • 在深度级别的搜索结束时,将邻居附加到搜索空间。这增加了下一个迭代的搜索深度。

输出极性是连接到输入种子的分数之和。

函数极性=极性分数(种子,词汇,词汇图,深度)删除词汇表中缺失的种子。Idx = ~ismember(种子,词汇);种子(idx) = [];初始化分数。vocabularySize =数字(词汇量);scores = 0 (vocabularySize);Idx = ismember(词汇表,种子);分数(idx,idx) =眼睛(数字(种子));遍历种子。I = 1:数字(种子)初始化搜索空间。Seed =种子(i);idxSeed =词汇表==种子;searchSpace = find(idxSeed);%在不同深度搜索。D = 1:深度遍历搜索空间中的节点。numNodes = nummel (searchSpace);idxNew = searchSpace(k);找到邻居和权重。nbrs =邻居(wordGraph,idxNew);idxWeights = finddge (wordGraph,idxNew,nbrs);weights = wordGraph.Edges.Weight(idxWeights);遍历邻居。J = 1:数值(nbrs)计算分数。score = scores(idxSeed,nbrs(j));scoreNew = scores(idxSeed,idxNew);%更新分数。scores(idxSeed,nbrs(j)) = max(score,scoreNew*weights(j));结束为下一次深度迭代搜索空间的追加节点。searchSpace = [searchSpace nbrs'];结束结束结束在词汇中寻找种子。[~,idx] = ismember(种子,词汇);与种子相关的分数总和。极性= sum(scores(idx,:));结束

参考书目

  1. Velikovich Lenid。“网络衍生极性词汇的可行性。”在计算语言学协会北美分会年会论文集,2010,第777-785页。2010.

  2. 访问EDGAR数据。https://www.sec.gov/os/accessing-edgar-data