主要内容

生成域特定情感词典

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

情感分析允许您自动总结一条给定的文本中的情绪。例如,分配“这家公司表现出强劲增长”的文本。并“这位其他公司被指控误导消费者。”具有正面和负面情绪。另外,例如,要分配文本“这家公司正在显示极其强劲增长。“这家公司表现出强劲增长的文本更强烈的情感分数。

情绪分析算法,如Vader依赖于被称为情词词典的注释列表。例如,VADER使用情绪词典注释,具有从-1到1的情绪分数,其中刻度接近1表示强烈的积极情绪,靠近-1表示强烈的负面情绪,并且近距离归零表示中性情绪。

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

此示例显示了如何使用基于图形的方法生成诸如种子单词的集合来生成情绪词汇。1]:

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

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

  • 为了确定具有强极性的单词,通过短但重量的路径识别连接到多种种子单词的单词。

加载数据

通过电子数据收集,分析和检索(EDGAR)API下载Secirities和Exchange委员会(SEC)的10-K和10-Q财务报告数据[2] 使用FINFICEREPTRES.辅助功能附加到此示例作为支持文件。金宝app要访问此文件,请将此示例打开为实时脚本。这FINFICEREPTRES.功能下载指定年,季度和最大字符长度的10-K和10-Q报告。

从2019年第四季度下载一组报告,少于200万个字符。根据报告的大小,这可能需要一些时间来运行。如果您有并行计算工具箱™,则该函数并行处理报告。

年= 2019;QTR = 4;maxlength = 2e6;textdata = fignereports(年,qtr,maxlength);
下载10-K和10-Q报告......完成。经过时间为605.480268秒。

定义用于与此数据一起使用的正面和负种子字样。

种子阳性= [“达到”“优势”“更好的”“有创造力的”“效率”......“有效率的”“提高”“更大”“改进”“改善”......“创新”“创新”“创新的”“机会”“有利可图”......“有利可图”“力量”“加强”“强的”“成功”]'Seedsnegative = [“不利”“不利地”“反对”“抱怨”“关心”......“损害”“默认”“缺陷”“披露”“失败”......“欺诈罪”“障碍”“诉讼”“亏损”“误导”......“忽略”“重述”“重组”“终止”“弱点”]'

准备文本数据

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

  • 删除任何URL。

  • 授权文本。

  • 删除包含数字的令牌。

  • 将文本转换为小写。

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

  • 删除任何停止单词。

使用该文本的预处理PreprocessText.功能。根据文本数据的大小,这可能需要一些时间来运行。

文档= preprocesstext(textdata);

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

图WordCloud(文件);

火车词嵌入

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

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

emb = trainwordembeddings(文件,'窗户',25,'mincount'20);
计算词汇。数百万字数:10.词汇数量:12648。培训:100%损失:0.713101剩余时间:0小时0分钟。

创建字图

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

创建一个加权图,其中包含词汇中的单词的节点,边缘表示单词是否在彼此7的7的Neigbor等中,以及对应于嵌入中的相应字向量之间的余弦距离的权重。

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

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

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

定义源和目标节点。

Sourcenodes = Repelem(词汇,Numneighbors);targetNodes = REPAPE(最近遍遍,1,[]);

计算边缘权重。

Edgeweights = Rehape(dist,1,[]);

创建与其Neigbors连接每个单词的图表,其边缘权重与相似性分数相对应。

wordgraph =图表(斯科特,靶向,边缘重量,词汇);

使用该删除重复的边缘简化功能。

wordgraph =简化(wordgraph);

可视化连接到“损坏”单词的单词图的部分。

字=“损害”;Idx = findnode(wordgraph,word);nbrs =邻居(Wordgraph,Idx);Wordsubgraph =子图(WordGraph,[IDX; NBRS]);图绘制(Wordsubmak)标题(“连接到”“”+ word +“”“

产生情感分数

为了确定具有强极性的单词,通过短但重量的路径识别连接到多种种子单词的单词。

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

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

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

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

对于每个深度:

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

  • 占图表中积极流量的总体差异的差异。

  • 对于每个节点字,正常化其两个分数的差异。

运行算法后,如果短语具有比负极性分数更高的正,则其最终极性将是正的,否则为负。

指定最大路径长度为4。

maxpathlength = 4;

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

为了深度= 1:maxPathLength%计算极性分数。极性致阳性=极性尺(种子,词汇表,Wordgraph,深度);PolarityNegative =极性尺度(种子,词汇,歌词,深度);%占积极流量和负流量的差异图中的%。B =和(极性界)/和(极性环境);%计算新的情绪分数。SENTIMISCONEDCORENEW =极性致阳性 -  B *极性环境;SentmensCoresNew = Normalize(SentmenceCoresnew,'范围',[ -  1,1]);%添加分数到总和。SENTIMIALCORS = SENTIMISMIESCORS + SENTIMISCENOW;结尾

通过迭代的数量使情感分数正常化。

SENTIMISMILORS = SENTIMISMIESCORS / MAXPATHLENG;

创建包含词汇表的表和相应的情感分数。

TBL =表;tbl.token =词汇';tbl.sentimalscore = sentmiescores';

要从Lexicon中删除具有中性情绪的令牌,请使用具有小于0.1的绝对值的情感分数删除令牌。

thr = 0.1;idx = abs(tbl.sentimalscore)
              

通过降级情绪分数来对表行进行排序,并查看前几行。

tbl = sortrows(tbl,'SentmenceScore'“下降”);头(TBL)
ans =.8×2表令牌情绪_____________ ______________“创新”1“效率”0.91852“强”0.82362“有效地”0.81475“创意”0.74264“增强”0.73791“创新”0.72985“改进”0.71476

您可以将此表用作自定义情绪词典vadersentementices功能。

在Word云中可视化情绪词典。在一个单词云和令牌中显示令牌,在一个字的云和令牌中,另一个字分数。显示具有由绝对值给出的大小的单词,其相应的情感分数。

图形子图(1,2,1);idx = tbl.sentimeCore> 0;tblpositive = tbl(idx,:);WordCloud(TBLTopPositive,'令牌''SentmenceScore') 标题('积极的话')子图(1,2,2);idx = tbl.sentimeCore <0;tblnegative = tbl(idx,:);tblnegative.sentimalscore = abs(tblnegative.sentimecore);Wordcloud(Tbltopnegative,'令牌''SentmenceScore') 标题('否定词'

将表导出到CSV文件。

filename =.“FinancesentimentLexton.CSV”;可编程(TBL,FILENAME)

分析文本情绪

要分析以前看不见的文本数据的情绪,请使用相同的预处理步骤进行预处理文本并使用vadersentementices功能。

创建包含文本数据和使用预处理的字符串数组PreprocessText.功能。

textdatanew = [“这家公司呈现出极强的增长。”“这位其他公司被指控误导消费者。”];documentnew = preprocesstext(textdatanew);

使用该情绪评估情绪vadersentementices功能。指定使用此示例中创建的情绪词典'sentimallextone'选项。

复旦= vAdersententiceCores(DomewsNew,'sentimallextone',TBL)
复旦=2×10.2834 -0.1273

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

金宝app支持功能

文本预处理功能

PreprocessText.函数执行以下步骤:

  • 删除任何URL。

  • 授权文本。

  • 删除包含数字的令牌。

  • 将文本转换为小写。

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

  • 删除任何停止单词。

功能文档= preprocessText(TextData)%删除URL。TextData = EraseURLS(TextData);%标记。文档= tokenizeddocument(textdata);%删除包含数字的令牌。Pat = TextBoundary + WildcardPattern + DigitsPattern + WildcardPattern + TextBoundary;文档=替换(文件,帕特,);%转换为小写。文件=较低(文件);%删除短文字。文档= RemoveShortwords(文件,2);%删除停止单词。文档= Removestopwords(文件);结尾

极性分数功能

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

该函数执行以下步骤:

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

  • 循环种子。对于每种种子,迭代地遍历不同深度水平的图形。对于第一次迭代,将搜索空间设置为种子的即时邻居。

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

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

  • 在搜索深度级别的末尾,将邻居附加到搜索空间。这增加了对下一次迭代的搜索深度。

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

功能极性=极性尺度(种子,词汇表,Wordgraph,深度)%初始化分数。Vocabularysize = Numel(词汇);分数=零(词汇);IDX = ISMember(词汇,种子);分数(IDX,IDX)=眼睛(NUMER(种子));%循环种子。为了我= 1:秩序(种子)%初始化搜索空间。种子=种子(i);Idxseed =词汇==种子;Searchspace =查找(Idxseed);%搜索不同深度。为了d = 1:深度%循环在搜索空间中的节点。numnodes = numel(searchspace);为了k = 1:numnode idxnew = searchspace(k);%找到邻居和重量。NBRS =邻居(WordGraph,IdxNew);Idxweights = specteded(wordgraph,idxnew,nbrs);权重= wordgraph.edges.redges.weight(idxweights);%循环到邻居。为了J = 1:Numel(NBRS)%计算得分。得分=分数(IDXSEED,NBRS(J));scorenew = scores(Idxseed,Idxnew);%更新分数。分数(Idxseed,NBRS(J))= Max(得分,Scorenew *权重(J));结尾%附加节点以搜索下一个深度迭代的空间。searchspace = [searchspace nbrs'];结尾结尾结尾%在词汇中找到种子。[〜,IDX] = ISMember(种子,词汇);%总和分数连接到种子。极性= sum(分数(idx,:));结尾

参考书目

  1. Velikovich,Lenid。“Web派生极性词典的可行性。”在2010年计算语言学协会北美章节年会年会,pp.777-785。2010年。

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