主要内容

生成域特异性情绪词典

此示例显示如何使用10-K和10-Q财务报告生成用于情绪分析的词典。

情感分析允许您在给定的文本中自动总结情感。例如,将“这家公司表现出强劲的增长”和“另一家公司被指控误导消费者”这两段文字分别赋予正面和负面的情绪。此外,例如,分配文本“This company is showing .”强劲增长。“这家公司表现出强劲增长的文本更强烈的情感分数。

像VADER这样的情感分析算法依赖于被称为情感词典的带注释的单词列表。例如,VADER使用了一个情感词典,其中的词语注释的情感得分范围在-1到1之间,得分接近1表示强烈的积极情绪,得分接近-1表示强烈的消极情绪,得分接近0表示中性情绪。

要使用VADER算法分析文本情绪,请使用vaderSentimentScores函数。如果情感词汇被使用vaderSentimentScores函数不适合您正在分析的数据,例如,如果您有特定于域的数据设置,则可以使用一小组种子单词生成自己的自定义情绪词典。

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

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

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

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

加载数据

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

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

年= 2019;QTR = 4;TextData = FignerePorts(年,QTR,“MaxNumReports”, 20000);
下载10-K和10-Q报告......完成。经过时间为1799.718710秒。

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

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

准备文本数据

创建函数名称preprocessText为文本数据的分析做准备。这preprocessText函数的执行步骤如下:

  • 消除任何url。

  • 在标记文本。

  • 删除包含数字的令牌。

  • 将文本转换为小写。

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

  • 删除任何停顿词。

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

文件= preprocessText (textData);

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

图wordcloud(文件);

火车字嵌入

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

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

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

创建字图

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

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

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

numneighbors = 7;词汇= emb.vocabulary;WordVectors = Word2VEC(emb,词汇);[regetingwords,dist] = vec2word(emb,wordvectors,numneighbors);

要创建图形,请使用图形函数并指定成对源和目标节点,并指定其边缘权重。

定义源和目标节点。

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

计算边缘权重。

edgeWeights =重塑(dist 1 []);

创建一个图,将每个词与其相邻词连接起来,并使用与相似度评分相对应的边权值。

WordGraph =图表(Sourcenode,TargetNodes,Edgeweights,词汇);

删除重复的边使用简化函数。

wordGraph =简化(wordGraph);

将单词图中与“损失”相关的部分形象化。

词=“亏损”;Idx = findnode(wordgraph,word);NBRS =邻居(WordGraph,IDX);Wordsubgraph = Subagraph(WordGraph,[IDX; NBRS]);图绘制(Wordsubmak)标题(“连接到”“”+文字+“”“”的)

产生情绪得分

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

初始化与词汇表中的每个单词对应的情绪分数阵列。

SENTIMISMCORIES =零([1个磁性(词汇)]);

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

在不同的深度下遍历图。对于每个深度,通过使用正和负种子来计算单词的正极和负极性,以传播对图的其余部分的情绪。

为每个深度:

  • 计算正负极性分数。

  • 说明了图表中正流和负流的总质量的差异。

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

运行算法后,如果一个短语的正极分数大于负极分数,则其最终极性为正,反之为负。

最大路径长度为4。

maxPathLength = 4;

迭代遍历图并计算情感得分之和。

为了深度= 1:maxPathLength%计算极性分数。polarityPositive = polarityScores (seedsPositive、词汇、wordGraph深度);polarityNegative = polarityScores (seedsNegative、词汇、wordGraph深度);%表示正流量和负流量的总质量差异%在图表中。b = sum(polarityPositive) / sum(polarityNegative);%计算新的情绪得分。SENTIMISENEW =极性垂直 -  B *极性环境;SewiseCoresNew = Normalize(SentmenceCoresnew,“范围”[1]);%添加分数到总和。sentimentScores = sentimentScores + sentimentScoresNew;结尾

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

sentimentScores = sentimentScores / maxPathLength;

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

台=表;资源描述。令牌=词汇';资源描述。SentimentScore = sentimentScores ';

要从词典中删除具有中性情绪的标记,请删除情绪得分绝对值小于0.1的标记。

用力推= 0.1;idx = abs(tbl.SentimentScore) < thr;台(idx:) = [];

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

台= sortrows(资源描述,“SentimentScore”“下”);头(TBL)
ans =8×2表Token SentimentScore _______________ ______________“机会”0.95633“创新”0.89635“成功”0.84362“聚焦”0.83768“强”0.81042“能力”0.79174“创新”0.77698“改进”0.77176

您可以将此表用作自定义情绪词典vaderSentimentScores函数。

在词云中形象化情感词汇。在一个词云中显示得分为正的令牌,在另一个词云中显示得分为负的令牌。用绝对值给出的单词大小显示它们对应的情绪得分。

图次要情节(1、2、1);idx =(资源。SentimentScore > 0;tblPositive =(资源(idx:);wordcloud (tblPositive'令牌'“SentimentScore”)标题(“积极词汇”)次要情节(1、2、2);idx =(资源。SentimentScore < 0;tblNegative =(资源(idx:);tblNegative。SentimentScore = abs (tblNegative.SentimentScore);wordcloud (tblNegative'令牌'“SentimentScore”)标题(“消极词汇”的)

将表导出到CSV文件。

filename =“FinancesentimentLexton.CSV”;writetable(资源描述、文件名)

文本情感分析

为分析未见文本数据中的情感,使用相同的预处理步骤对文本进行预处理,并使用vaderSentimentScores函数。

创建一个字符串数组,其中包含文本数据和使用预处理它preprocessText函数。

textDataNew = [“这家创新的公司不断显示出强劲的增长势头。”“另一家公司被指控误导消费者。”];documentsNew = preprocessText (textDataNew);

评估情绪使用vaderSentimentScores函数。属性指定在本例中创建的情感词典'sentimallextlex'选择。

compoundScores = vaderSentimentScores (documentsNew,'sentimallextlex',TBL)
复旦=2×10.4360 - -0.1112

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

金宝app支持功能

文本预处理功能

preprocessText函数的执行步骤如下:

  • 消除任何url。

  • 在标记文本。

  • 删除包含数字的令牌。

  • 将文本转换为小写。

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

  • 删除任何停顿词。

函数文件= preprocessText (textData)%擦掉url。textData = eraseURLs (textData);%标记。文档= tokenizeddocument(textdata);%删除包含数字的标记。帕特= TextBoundary + WildcardPattern + DigitsPattern + WildcardPattern + TextBoundary;文档=替换(文件,帕特,);%转换为小写。文件=低(文件);删除短单词。文档= RemoveShortwords(文件,2);删除停止字。文档= Removestopwords(文件);结尾

极性分数功能

极性尺函数返回极性分数的矢量给定一组种子单词,词汇,图形和指定深度。该功能将每个种子字的最大加权路径的总和计算到词汇表中的每个节点。高极性分数通过短且强加权的路径表示通过短且强大的路径连接到多个种子单词的短语。

该函数执行以下步骤:

  • 用初始化种子的分数和零零。

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

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

  • 循环在其邻居上并更新相应的分数。更新的分数是种子和邻居当前分数的最大值,以及由相应的图形边缘加权的种子和搜索节点的分数。

  • 在深度层搜索结束时,将邻居添加到搜索空间中。这增加了对下一次迭代的搜索深度。

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

函数极性=极性尺(种子,词汇表,Wordgraph,深度)去掉词汇表中缺少的种子。idx = ~ ismember(种子、词汇);种子(idx) = [];%初始化分数。Vocabularysize = Numel(词汇);得分=零(词汇);Idx = ISMember(词汇,种子);分数(Idx,Idx)=眼睛(磁秩序(种子));%循环遍历种子。为了i = 1:元素个数(种子)%初始化搜索空间。种子=种子(i);idxSeed =词汇=种子;searchSpace =找到(idxSeed);%搜索不同深度。为了d = 1:深度%循环搜索空间中的节点。numNodes =元素个数(searchSpace);为了k = 1:numNodes idxNew = searchSpace(k);找到邻居和权重。NBRS =邻居(WordGraph,IdxNew);idxweights = spectededge(wordgraph,idxnew,nbrs);权重= wordgraph.edges.redges.weight(idxweights);%循环邻居。为了j = 1:元素个数(nbr)%计算分数。分数=分数(idxSeed nbr (j));scoreNew =分数(idxSeed idxNew);%更新分数。分数(Idxseed,NBRS(J))= Max(得分,Scorenew *权重(J));结尾%追加节点以搜索下一次深度迭代的空间。[nbrs'];结尾结尾结尾%在词汇中找到种子。[~, idx] = ismember(种子、词汇);与种子相关的分数总和。极性=总和(分数(idx:));结尾

参考书目

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

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