TextRank&NMF文本摘要总结
我们在用TextRank作文本摘要时,提出一种新颖的方法来解决长文本的摘要提取问题。
TextRank的思想很简单,其基本思想来源于谷歌的 PageRank算法, 通过把文本分割成若干组成单元(单词、句子)并建立图模型, 利用投票机制对文本中的重要成分进行排序, 仅利用单篇文档本身的信息即可实现关键词提取、文摘。和 LDA、HMM 等模型不同, TextRank不需要事先对多篇文档进行学习训练, 因其简洁有效而得到广泛应用。
TextRank 一般模型可以表示为一个有向有权图 G =(V, E), 由点集合 V和边集合 E 组成, E 是V ×V的子集。图中任两点 Vi , Vj 之间边的权重为 wji , 对于一个给定的点 Vi, In(Vi) 为 指 向 该 点 的 点 集 合 , Out(Vi) 为点 Vi 指向的点集合。点 Vi 的得分定义如下:
其中, d 为阻尼系数, 取值范围为 0 到 1, 代表从图中某一特定点指向其他任意点的概率, 一般取值为 0.85。使用TextRank 算法计算图中各点的得分时, 需要给图中的点指定任意的初值, 并递归计算直到收敛, 即图中任意一点的误差率小于给定的极限值时就可以达到收敛, 一般该极限值取 0.0001。
TextRank用句子或词之间的相关关系矩阵替代了pagerank中网页间的指向关系。迭代的过程依旧使用的是pagerank 的算法。我们可以通过https://www.jianshu.com/p/7485cac02e95 了解PageRank。
1. 基于TextRank的关键词提取
关键词抽取的任务就是从一段给定的文本中自动抽取出若干有意义的词语或词组。TextRank算法是利用局部词汇之间关系(共现窗口)对后续关键词进行排序,直接从文本本身抽取。其主要步骤如下:
(1)把给定的文本T按照完整句子进行分割,即
(2)对于每个句子,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词、形容词,即
,其中
是保留后的候选关键词。
(3)构建候选关键词图G = (V,E),其中V为节点集,由(2)生成的候选关键词组成,然后采用共现关系(co-occurrence)构造任两点之间的边,两个节点之间存在边仅当它们对应的词汇在长度为K的窗口中共现,K表示窗口大小,即最多共现K个单词。
(4)根据上面公式,迭代传播各节点的权重,直至收敛。
(5)对节点权重进行倒序排序,从而得到最重要的T个单词,作为候选关键词。
(6)由(5)得到最重要的T个单词,在原始文本中进行标记,若形成相邻词组,则组合成多词关键词。例如,文本中有句子“Matlab code for plotting ambiguity function”,如果“Matlab”和“code”均属于候选关键词,则组合成“Matlab code”加入关键词序列。
TextRank算法进行文章的摘要提取算法流程
1. 第一步是把所有文章整合成文本数据
2. 接下来把文本分割成单个句子
3. 然后,我们将为每个句子找到向量表示(词向量)。
4. 计算句子向量间的相似性并存放在矩阵中
5. 然后将相似矩阵转换为以句子为节点、相似性得分为边的图结构,用于句子TextRank计算。
在进行下一步之前,我们先将相似性矩阵sim_mat转换为图结构。这个图的节点为句子,边用句子之间的相似性分数表示。在这个图上,我们将应用PageRank算法来得到句子排名。
6. 最后,一定数量的排名最高的句子构成最后的摘要。
在此基础上,我们考虑
包含实体(组织机构名称)的句子应该被重点关注。也就是说,包含特定实体的句子与普通句子之间的相关关系应该有加权。
长文本的语义通常会有多个子文本的语义共同描述,我们利用降维压缩来提取各个模块的特征语义,并用作相关关系矩阵的权值修正
对于第一点,我们用NER(bilstm+CRF)做NER,对于包含特定实体的句子更高的权重。
对于第二点,我们对句子的Embedding 矩阵作降维压缩(主要是用到NMF矩阵分解方法),提取不同模块的特征,再根据源文本中句子与各个特征之间的关系修正相关关系矩阵。
示意图如下:
我们在新闻数据上作的文本摘要结果表明:我们提取的文本摘要更具有代表性。
我们在作实体识别的时候,并没有考虑很确切的关系,换句话说,我们没有在CRF层添加很多规则,实际上,实验中的算法是用pyltp 来做命名实体识别的,这是因为对于少样本来说,pyltp基于词典的识别更加稳定。
但是pyltp的提取毕竟是千篇一律的,而我们仅需要“企业名称”类型的实体,从这个层面来看,建设一个有针对性地bilstm+CRF 框架很有必要。