主要内容

生成特定领域情感词典

这个例子展示了如何使用10 - k为情绪分析生成一个词汇和10 -财务报告。

情绪分析允许您自动总结情绪在一个给定的文本。例如,指定的文本“这家公司正显示出强劲的增长。”和“其他公司被指控误导消费者。”有积极的和消极的情绪,分别。例如,分配本公司是显示文本”强劲的增长。“比文本更强的情绪得分”这个公司显示出强劲的增长。”

情绪分析算法,如维德依靠注释的词叫做情绪词汇列表。例如,维德使用情绪词汇与词汇注释与感情,分数从1到1,分数接近1表示强烈的积极情绪,成绩接近1表示强烈的负面情绪,成绩接近于零表示中性情绪。

分析文本的情绪使用维德算法,使用vaderSentimentScores函数。如果使用的情绪词汇vaderSentimentScores函数不适合您正在分析的数据,例如,如果你有一个特定领域的数据集,如医学或工程数据,然后你就可以生成自己的定制的情绪词汇使用少量的种子。

这个例子展示了如何生成一个情绪词典给出一组种子词使用图论方法基于[1]:

  • 火车一个字嵌入模型使用训练数据单词之间的相似性。

  • 创建一个简单的图形代表节点单词和对应边的嵌入加权相似。

  • 确定单词,并有很强的极性,识别词连接到多个种子词通过简短但权重路径。

加载数据

下载10 - k, 10 -财务报告数据来自证券交易委员会(SEC)通过电子数据收集、分析和检索(埃德加)API (2)使用financeReportshelper函数附加到这个例子作为支持文件。金宝app访问这个文件,打开这个例子作为一个活的脚本。的financeReports功能下载10 - k和10 -报告指定的年,季度,和最大字符长度。

下载一套从2019年第四季度的20000份报告。根据报告的大小,这可能需要一些时间。

年= 2019;季度= 4;textData = financeReports(年、季度、“MaxNumReports”,20000);
下载10 - k和10 -报告……完成了。运行时间是1799.718710秒。

定义的正面和负面的种子词使用这些数据。种子词必须出现至少一次在文本数据,否则他们将被忽略。

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

准备文本数据

创建一个函数名preprocessText准备的文本数据进行分析。的preprocessText函数,列出的示例执行以下步骤:

  • 消除任何url。

  • 在标记文本。

  • 删除令牌包含数字。

  • 将文本转换为小写。

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

  • 删除任何停止的话。

预处理文本使用preprocessText函数。根据文本数据的大小,这可能需要一些时间。

文件= preprocessText (textData);

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

图wordcloud(文件);

火车字嵌入

字嵌入的词在词汇映射到数值向量。这些嵌入可以捕获语义的细节词这样类似的词有相似的向量。

火车一个字嵌入模型使用训练数据单词之间的相似性。指定的上下文窗口大小25和丢弃的话少于20倍。根据文本数据的大小,这可能需要一些时间。

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

创建单词图

创建一个简单的图形代表节点单词和对应边的嵌入加权相似。

创建一个加权图,节点对应词的词汇,边表示词是否在neigborhood 7,和权重对应相应的词向量之间的余弦距离嵌入。

每个单词的词汇,找到最近的7字和余弦距离。

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

创建图表,使用功能和成对指定源和目标节点,并指定他们的边的权值。

定义源和目标节点。

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

计算边的权值。

edgeWeights =重塑(dist 1 []);

创建一个图形连接每个单词和其neigbors边对应相似性分数。

wordGraph =图(sourceNodes, targetNodes、edgeWeights、词汇);

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

wordGraph =简化(wordGraph);

词图的可视化部分连接到“损失”这个词。

词=“损失”;idx = findnode (wordGraph词);nbr =邻居(wordGraph idx);wordSubgraph =子图(wordGraph [idx;nbr]);图绘制(wordSubgraph)标题(”“文字连接+文字+”“”“)

产生情绪得分

确定单词,并有很强的极性,识别词连接到多个种子词通过简短但权重路径。

初始化一个数组情绪得分每个单词对应的词汇。

sentimentScores = 0([1元素个数(词汇)]);

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

在不同的深度遍历图。对于每个深度,计算正负极性的单词通过正面和负面的种子传播情绪剩下的图。

为每个深度:

  • 计算正负极性的分数。

  • 占总质量的差异的积极的和消极的流图。

  • 对于每个node-word,规范化的两个分数的区别。

运行该算法后,如果一个词有积极比负极性的分数高,那么它最终极性将积极和消极。

指定一个最大路径长度为4。

maxPathLength = 4;

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

深度= 1:maxPathLength%计算极性的分数。polarityPositive = polarityScores (seedsPositive、词汇、wordGraph深度);polarityNegative = polarityScores (seedsNegative、词汇、wordGraph深度);%占整体质量差的正面和负面的流%的图。b =总和(polarityPositive) /笔(polarityNegative);%计算新的情感得分。sentimentScoresNew = polarityPositive - b * polarityNegative;sentimentScoresNew =正常化(sentimentScoresNew,“范围”[1]);%添加分数总和。sentimentScores = sentimentScores + sentimentScoresNew;结束

正常的情绪得分的迭代次数。

sentimentScores = sentimentScores / maxPathLength;

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

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

从词典中删除令牌与中性情绪,把令牌和情绪得分绝对值小于阈值为0.1。

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

由下行情绪得分排序表行和视图的前几行。

台= sortrows(资源描述,“SentimentScore”,“下”);头(台)
ans =8×2表“机会”牌SentimentScore售予* * * 0.95633 0.84362 0.89635“创新”“成功”“集中”0.83768“强劲”0.81042“能力”0.79174 0.77176 0.77698“创新”“改进”

您可以使用此表作为一个定制的情绪的词汇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文件。

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

在文本分析情绪

分析情绪,以前看不见的文本数据,预处理文本使用相同的预处理步骤和使用vaderSentimentScores函数。

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

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

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

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

积极的和消极的分数表明积极和消极情绪,分别。值的大小对应于情绪的强度。

金宝app支持功能

文本预处理功能

preprocessText函数执行以下步骤:

  • 消除任何url。

  • 在标记文本。

  • 删除令牌包含数字。

  • 将文本转换为小写。

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

  • 删除任何停止的话。

函数文件= preprocessText (textData)%擦掉url。textData = eraseURLs (textData);%标记。文件= tokenizedDocument (textData);%删除令牌包含数字。帕特= textBoundary + wildcardPattern + digitsPattern + 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:元素个数(nbr)%计算分数。分数=分数(idxSeed nbr (j));scoreNew =分数(idxSeed idxNew);%更新分数。分数(idxSeed nbr (j)) = max(得分,scoreNew *权重(j));结束%附加节点为下一个深度迭代搜索空间。searchSpace = [searchSpace nbr的);结束结束结束%在词汇找到种子。[~,idx] = ismember(种子、词汇);%和分数与种子。极性=总和(分数(idx:));结束

参考书目

  1. Velikovich Lenid。“Web-derived极性词典的可行性。”In《北美协会的年度会议上对计算语言学,2010,777 - 785页。2010年。

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