本文参考的是两篇论文(Fernández-Gavilanes et al., 2016; Cruz et al., 2011)以及PageRank算法(Page et al., 1998)
对了宝贝儿们,卑微小李的公众号【野指针小李】已开通,期待与你一起探讨学术哟~摸摸大!
目录
- 1 PolarityRank算法原理
- 1.1 图的生成
- 1.2 情感传播
- 1.2.1 公式说明
- 1.3 矩阵运算
- 1.4 收敛性证明
- 2 总结
- 3 参考
1 PolarityRank算法原理
由于PolarityRank算法是基于PageRank算法的,如果对PageRank算法不熟的同学可以参考我的上一篇文章:情感分析学习笔记(4)——PageRank原理与python代码实现。
PolarityRank算法是一个情感计算的方法,其思想大体上就是每个词语带有两个情感值和,这些词语通过某种方式构成了一张图,在图中通过PangRank式的传播(即通过节点之间的相关性计算),将情感传播至不同的节点。
在本节我会综合讲解两篇论文提到的内容,在下一节讲代码的时候我会讲我的方法,与这两个论文的方法有些许区别。
1.1 图的生成
根据上面的介绍,我们会发现需要一张有向图,Fernández-Gavilanes et al.提出,图是来源于句法树的,他们先对一句话进行POS,得到一颗句法树,其中图的节点及句法树中所有的名词、形容词、动词。
边的生成是依据节点之间的依赖关系,每个节点会与其所有的后代节点相连,但是为了使整棵树的左右都有边相连(因为情感传播不是针对于某棵子树),所以每个节点还会与自己的兄弟节点相连。作者考虑到系动词不带有任何情感极性,所以作者剔除了系动词,同时将系动词的孩子节点向上提一级。
1.2 情感传播
Cruz et al. 设有向图为,其中是顶点集,是边集。每条边有个实数非零值作为权重,即从顶点到的权重。指的是节点的所有出边,是节点的所有带正权重的入边,同理。作者还设定了和,如果节点是种子节点(seed node,就是指的情感基准词),那么和不为0,否则为0。这两个值对应的是PageRank算法中的中的,指的是节点有这么多的概率接收到来自种子词的情感。
由以上定义,得出PolarityRank的值计算公式:
情感计算归一化公式:
1.2.1 公式说明
这部分我罗列几个我看这个公式遇到的一些问题
a) 关于这个含义的说明:
这里先给大家上个图,就借用Fernández-Gavilanes et al. 老哥们的图一用:
我们假设是,那么就有,即;
我们继续假设是,那么就有,即。
我们借用上图的权重都为,那么,最终得到的值为,这个的意思就是说在每一轮迭代中有的概率将情感传递到中。
类比到PageRank中,就是对应的浏览网页的时候有多少概率跳转到网页。
b) 为什么,但是后面跟的值不仅有也有?
这是我纠结了最久的一个问题,后来发现原文中有一句话:
According to this arithmetic, and similarly to what happened in PageRank, the positive relevance of a node is increased proportionally to the positive relevance of the nodes connected to by edges of positive weights. But also, the positive relevance of is increased in proportion to the negative relevance of those nodes connected to
这句话的意思我大体简略的翻译一下,就是说,无论算的是节点的或者,但凡边权为positive,都对这个节点的和带来增加,如果边权为negative,那么对节点的和都带来减少。
c) 究竟是正的还是负的?
这个问题我也纠结的有点久,后来发现情感计算的公式是个归一化的过程,那么我们假设是负的,那么就会是一个很大的值,而有可能是个很小的值,不满足归一化,所以也是个正的值。
1.3 矩阵运算
当数据量过大后,使用for循环是一个很浪费性能的做法,所以需要转变为矩阵运算,Cruz et al. 为了凑页数,把矩阵运算都推导了一遍,我这里就copy paste一下:
首先定义矩阵,里面存储的是边权,定义,即矩阵第行的所有值之和。
当有了该矩阵后,作者对其进行了转置,定义,这一步的作用主要在于使得,保证了最终达到收敛,收敛证明下面再讲。转置后,第行的边权总和变为了第列的边权总和,即,且。
但是由于边权有正负之分,所以作者将拆开为和。其中:
拆分后,就变为了第列与的项之和。
根据以上几步,作者将上面的公式变为了如下这样:
这里有个小细节要注意,上面的公式是,这下面是,说明是已经发生了转置的。
作者又定义了两个矩阵和,,我们可以发现,这个就是归一化后的权重。于是将原有公式改变为:
当有了上面这一坨之后,作者就开始操作了,首先定义,这里是词的数量,定义的向量:
定义的向量:
定义的矩阵:
于是上面的公式可以直接改为:
这里作者专门说明了一下两个式子:
所以我这里也要专门说明下这个式子,最开始没发现多么重要,后来敲代码一直有问题才发现这个公式很重要,先上个图:
我们把矩阵A扩展开是如上图的,结合上面的公式,我们会发现,就是说如果只看矩阵左上块的第一列的和,即,不只是第一列,每一列如果只看一半,和都为0.5,只有看每一列的全部,再求和才为1。这里就是之前说的,为了保证。
对于和的计算方法如下:。由此可得两点:
- 与都是正值;
- 。
作者接下来的操作有点骚,作者的目标是:提取出PR向量,使得矩阵与矩阵进行求和运算,运算完了之后再与向量做乘(我估计这样是方便计算机运算)。
为了达到这一目标,那么就需要将给变为矩阵,改变步骤如下:
- 是标量,可以不考虑;
- 将给归一化到区间内,即,那么给定一个大小为的单位列向量,那么;
- 由于多乘了一个,就需要除以一个,即;
- 组合2、3步,变为:,由于之前推导的过程,就会发现值其实并没有改变,但是就变成了一个的矩阵。
所以由上的推导,定义矩阵:
由此公式就可以变为如下情况:
作者令,那么公式就变为:
由于是两个系数为正且和为1的矩阵的线性组合,所以是一个随机矩阵(stochastic matrix)。由此可以根据Perron-Frobenius理论得出公式有特征值为1,而其余特征值都小于1。
这里这个随机矩阵与Perron-Frobenius理论我查了些资料,发现还是不清楚是什么意思,我大致猜想了一下就是随机矩阵满足Perron-Frobenius理论,而Perron-Frobenius理论得出,当随机矩阵迭代()趋于无穷次的时候,矩阵的值可以由特征值和特征向量直接解出来。
当然这个不一定是正确的,因为那些文章里面的公式我看得头皮发麻,我会把我参考的链接放出来,如果有问题,望大佬们纠正或者补充。
1.4 收敛性证明
由PageRank算法可以得出,最终需要满足收敛,所以作者们通过数学上的内容证明了PolarityRank算法是收敛的,证明过程如下:
由于这是一个迭代的过程,所以作者用表示第次迭代的结果。于是将上面的公式转换为:
将上面两个公式相减,可得:
对于矩阵,取第一范数,即:
由上面提到的,,同时,所以。
2 总结
大家能够看到这里也不容易哈,上面7000+字以及花里胡哨的公式推导。本来说放代码的,但是为了方便大家对比公式,所以代码我重新写一篇文章来放上去。
本篇文章主要讲解了PolarityRank算法,这是一个基于PageRank的算法,其主要实现是需要将情感词(或者其他带有情感的东西)构成一个有向图,给每个节点分配两个值,给每条边分配两个权重,其他的传播过程类似于PageRank。