这个例子展示了如何使用10-K和10-Q财务报告生成情感分析的词典。
情感分析允许您在给定的文本中自动总结情感。例如,将“这家公司表现出强劲的增长”和“另一家公司被指控误导消费者”这两段文字分别赋予正面和负面的情绪。此外,例如,分配文本“This company is showing .”极其一个比文字“这家公司正在显示强劲的增长”更强烈的情绪得分。
情绪分析算法,如Vader依赖于被称为情绪词典的诠释列表。例如,Vader使用具有从-1到1的情感分数的情绪分数的词语词典,其中分数接近1表示强烈的积极情绪,靠近-1表示强的负面情绪,并且接近零的分数表示中性情绪.
利用VADER算法对文本情感进行分析vadersentementices
函数。如果使用的情绪词典vadersentementices
函数不适合您正在分析的数据,例如,如果您有一个特定领域的数据集,如医疗或工程数据,那么您可以使用一小组种子词生成自己的自定义情感词典。
这个例子展示了如何使用基于图的方法生成一个情感词典给定种子词集合,基于[1]:
训练一个单词嵌入,使用训练数据对单词之间的相似度建模。
创建一个简化的图表,其表示嵌入与对应于相似性加权的单词和边的节点的嵌入。
要确定具有强极性的单词,可以通过较短但权重较大的路径识别与多个种子单词相连的单词。
通过电子数据收集,分析和检索(EDGAR)API下载Secirities和Exchange委员会(SEC)的10-K和10-Q财务报告数据[2)使用FITATEREPORTS.
辅助函数附加到此示例作为支持文件。金宝app要访问此文件,请将此示例打开为实时脚本。的FITATEREPORTS.
函数下载指定年份、季度和最大字符长度的10-K和10-Q报告。
从2019年第四季度下载一组20,000个报告。根据报告的规模,这可能需要一些时间来运行。
年= 2019;季度= 4;textData = financeReports(年、季度、'maxnumreports', 20000);
下载10-K和10-Q报告…完成了。运行时间为1799.718710秒。
定义用于此数据的正负种子词集。种子词必须在文本数据中至少出现一次,否则它们将被忽略。
seedsPositive = [“实现”“优势”“更好”“有创造力的”“效率”......“有效率的”“增强”“更大的”“改进”“改善”......“创新”“创新”“创新的”“机会”“有利可图”......“盈利”“力量”“加强”“强的”“成功”]“;seedsNegative = [“不良”“不利”“反对”“投诉”“忧虑”......“赔偿”“默认”“缺陷”“披露”“失败”......“欺诈”“障碍”“诉讼”“损失”“误导”......“省略”“重申”“重组”“终止”“弱点”]“;
创建函数名PreprocessText.
为文本数据的分析做准备。的PreprocessText.
函数的执行步骤如下:
消除任何url。
授权文本。
删除包含数字的令牌。
将文本转换为小写。
删除任何包含两个或两个以下字符的单词。
删除任何停顿词。
使用该文本的预处理PreprocessText.
函数。根据文本数据的大小,这可能需要一些时间来运行。
文件= preprocessText (textData);
在词云中可视化预处理的文本数据。
图wordcloud(文件);
Word Embeddings在词汇中的地图单词到数字向量。这些嵌入物可以捕获单词的语义细节,以便类似的单词具有相似的向量。
训练一个单词嵌入,使用训练数据对单词之间的相似度建模。指定一个大小为25的上下文窗口,并丢弃出现次数少于20次的单词。根据文本数据的大小,这可能需要一些时间来运行。
emb = trainwordembeddings(文件,“窗口”25岁的“MinCount”, 20);
培训:100%损失:1.44806剩余时间:0小时0分钟。
创建一个简化的图表,其表示嵌入与对应于相似性加权的单词和边的节点的嵌入。
创建一个加权图,其中节点对应于词汇表中的单词,边表示单词是否在彼此的7个邻域内,权值对应于对应的单词向量在嵌入时的余弦距离。
对于词汇表中的每个单词,找出最近的7个单词和它们的余弦距离。
numNeighbors = 7;词汇= emb.Vocabulary;wordVectors = word2vec (emb、词汇);[nearestWords dist] = vec2word (emb, wordVectors numNeighbors);
要创建图形,请使用图
函数并指定源节点和目标节点,并指定它们的边权值。
定义源节点和目标节点。
Sourcenodes = Repelem(词汇,Numneighbors);targetnodes =重塑(regieswinds,1,[]);
计算边权值。
Edgeweights = Rehape(Dist,1,[]);
创建一个图,将每个词与其相邻词连接起来,并使用与相似度评分相对应的边权值。
wordGraph =图(sourceNodes, targetNodes、edgeWeights、词汇);
使用该删除重复的边缘简化
函数。
WordGraph =简化(WordGraph);
可视化连接到“丢失”单词的单词图的部分。
字=“损失”;idx = findnode (wordGraph词);nbr =邻居(wordGraph idx);wordSubgraph =子图(wordGraph [idx;nbr]);图绘制(wordSubgraph)标题("与""有关的词"+文字+”“”“)
要确定具有强极性的单词,可以通过较短但权重较大的路径识别与多个种子单词相连的单词。
初始化一个对应于词汇表中每个单词的情感分数数组。
SENTIMISMCORIES =零([1个磁性(词汇)]);
迭代遍历图表并更新情绪得分。
在不同深度遍历图表。对于每个深度,计算单词的正极性和负极性,使用正极性和负极性种子将情绪传播到图表的其余部分。
对于每个深度:
计算正负极性分数。
说明了图表中正流和负流的总质量的差异。
对于每个节点词,将其两个分数的差异归一化。
运行算法后,如果一个短语的正极分数大于负极分数,则其最终极性为正,反之为负。
最大路径长度为4。
maxPathLength = 4;
迭代地遍历图形并计算情绪分数的总和。
为深度= 1:maxPathLength%计算极性分数。极性致阳性=极性尺(种子,词汇表,Wordgraph,深度);极性地区=极性尺度(种子,词汇表,Wordgraph,深度);%表示正流量和负流量的总质量差异%在图表中。B =和(极性界)/和(极性环境);%计算新的情绪分数。sentimentScoresNew = polarityPositive - b * polarityNegative;sentimentScoresNew =正常化(sentimentScoresNew,'范围',[ - 1,1]);把分数加到总数。SENTIMISMISCORS = SENTIMISMIESCORE + SENTIMISMECORENEW;结束
根据迭代次数将情绪得分归一化。
sentimentScores = sentimentScores / maxPathLength;
创建一个包含词汇表和相应的情感得分的表。
台=表;资源描述。令牌=词汇';资源描述。SentimentScore = sentimentScores ';
要从词典中删除具有中性情绪的标记,请删除情绪得分绝对值小于0.1的标记。
thr = 0.1;Idx = abs(tbl.sentimentscore)
通过降序的情绪分数对表行进行排序并查看前几行。
台= sortrows(资源描述,'SENTMISIONSCORE',“下”);头(台)
ans =8×2表令牌情绪_______________ ______________“机会”0.95633“创新”0.89635“成功”0.84362“专注”0.83768“强”0.81042“创新”0.77698“改进”0.77698“改进”0.77176
的自定义情感词汇表vadersentementices
函数。
在Word云中可视化情绪词典。在一个单词云和令牌中显示令牌,在一个字云和令牌中,另一个字分为负分数。显示具有绝对值给出的尺寸的单词,其相应的情感分数。
图次要情节(1、2、1);idx =(资源。SentimentScore > 0;tblPositive =(资源(idx:);wordcloud (tblPositive“令牌”,'SENTMISIONSCORE')标题('积极的话')子图(1,2,2);idx = tbl.sentimentscore <0;tblnegative = tbl(idx,:);tblnegative.sentimalscore = abs(tblnegative.sentimecore);WordCloud(Tblnegative,“令牌”,'SENTMISIONSCORE')标题('否定词')
将表导出为CSV文件。
文件名=“financeSentimentLexicon.csv”;可编程(TBL,FILENAME)
为分析未见文本数据中的情感,使用相同的预处理步骤对文本进行预处理,并使用vadersentementices
函数。
属性创建包含文本数据的字符串数组并对其进行预处理PreprocessText.
函数。
textDataNew = [“这家创新的公司不断显示出强劲的增长势头。”“另一家公司被指控误导消费者。”];documentsNew = preprocessText (textDataNew);
评估情绪使用vadersentementices
函数。属性指定在本例中创建的情感词典“SentimentLexicon”
选择。
compoundScores = vaderSentimentScores (documentsNew,“SentimentLexicon”(资源)
compoundScores =2×10.4360 - -0.1112
正面和负分数分别表明正面和负面情绪。值的幅度对应于情绪的强度。
的PreprocessText.
函数执行以下步骤:
消除任何url。
授权文本。
删除包含数字的令牌。
将文本转换为小写。
删除任何包含两个或两个以下字符的单词。
删除任何停顿词。
功能文件= preprocessText (textData)%删除URL。textdata = eraseURLS(TextData);%标记。文件= tokenizedDocument (textData);%删除包含数字的令牌。pat = textBoundary + wildcardPattern + digitpattern + wildcardPattern + textBoundary;文件=取代(文档、帕特"");%转换为小写。文件=低(文件);删除短单词。文件= removeShortWords(文件,2);删除停止字。= removeStopWords文件(文档);结束
的polarityScores
函数返回给定一组种子词、词汇表、图和指定深度的极性分数向量。该函数计算从每个种子词到词汇表中每个节点的最大加权路径的和。高极性分数表明短语通过短和强加权路径连接到多个种子词。
函数执行如下步骤:
用1初始化种子的分数,否则为0。
循环种子。对于每种种子,迭代地遍历不同深度水平的图形。对于第一次迭代,将搜索空间设置为种子的即时邻居。
对于每个深度级别,在搜索空间中的节点上循环并识别图中的邻居。
循环在其邻居上并更新相应的分数。更新的分数是种子和邻居当前分数的最大值,以及由相应的图形边缘加权的种子和搜索节点的分数。
在深度层搜索结束时,将邻居添加到搜索空间中。这增加了对下一次迭代的搜索深度。
输出极性是连接到输入种子的分数之和。
功能极性= polarityScores(种子、词汇、wordGraph、深度)去掉词汇表中缺少的种子。idx = ~ ismember(种子、词汇);种子(idx) = [];%初始化分数。vocabularySize =元素个数(词汇);成绩= 0 (vocabularySize);idx = ismember(词汇、种子);分数(idx idx) =眼睛(元素个数(种子));%循环遍历种子。为i = 1:元素个数(种子)%初始化搜索空间。种子=种子(i);idxSeed =词汇=种子;searchSpace =找到(idxSeed);%搜索在不同的深度。为d = 1:深度%循环在搜索空间中的节点。numNodes =元素个数(searchSpace);为k = 1:numNodes idxNew = searchSpace(k);找到邻居和权重。nbr =邻居(wordGraph idxNew);idxWeights = findedge (wordGraph idxNew nbr);重量= wordGraph.Edges.Weight (idxWeights);%循环邻居。为J = 1:NUMEL(NBRS)%计算分数。分数=分数(idxSeed nbr (j));scoreNew =分数(idxSeed idxNew);%更新分数。分数(idxSeed nbr (j)) = max(得分,scoreNew *权重(j));结束%追加节点以搜索下一次深度迭代的空间。searchspace = [searchspace nbrs'];结束结束结束在词汇中寻找种子。[~, idx] = ismember(种子、词汇);与种子相关的分数总和。极性=总和(分数(idx:));结束
Velikovich Lenid。《网络衍生的极性词典的可行性》在计算语言学协会北美分会年会论文集,2010,pp.777-785。2010年。