文本自动摘要算法

研究现状

为了抽取文章的摘要,研究者从不同的角度对自动文本摘要技术进行了研究:有专门研究摘要内容跟非摘要内容的区分特征的,有试图通过模拟文章写作过程将文章的主题挖掘出来的主题模型等等。如何将文章内容的侧重点挖掘出来,是自动摘要技术研究的关键之处。

基于篇章结构的自动文本摘要方法在近年来发展迅速。

潜在语义分析是一种篇章结构分析方法,其核心是用于描述文本产生机制的主题模型。一个好的主题模型应该能把握创作者的思路,即文章所表达的意思和这些意思之间的转折情况,并且能够根据意思选择合适的词组织成句。

主题模型的训练离不开词频统计,词语多义现象造成基于词形的词频统计不准确,因此需要先对文本进行词语消歧。可以基于WordNet进行词语相关度计算,用于词语消歧,该步骤可以看作自动文本摘要的预处理工作。

HMM(Hidden Markov Model)模型将文本看成由句子构成的观察序列隐藏状态是文本的主题,该模型取消了主题的独立性假设,在理论上比较成功地描述了文本的发生机制,但是对于文本摘要,特别是单文本摘要,如果能得知文本各部分主题的长度,就能够保证摘要内容的平衡性。

自动文本摘要技术需要考虑摘要的信息压缩比、内容的覆盖率和平衡性、语句的多样性、 整体的可读性等因素,这些因素直接影响自动文本摘要结果的好坏。

单文本摘要技术

基于特征分析的实现方法

  • 将全文按照标题和内容分开;
  • 选取文本内容中重要的词语(这里主要考虑名词和动词),并计算每个词语的权重,权重计算根据其在文本中出现的次数 tf 和包含该词语的句子个数 isf,即为 tf/isf;如果某个词语在标题中出现,对其权重乘以大于1的值,此处选取1.2。
  • 对文本内容进行分段分句,对位于首段尾段,首句尾句的句子进行标记。计算每个句子的权重,方法是将句子中的重要词语的权重加和;然后对首段尾段的句子权重乘以p_weight(大于1),对首句尾句的句子权重乘以s_weight(大于1)。
  • 根据用户输入的压缩比,求出权重最高的topK个句子,并按它们在原文中的顺序输出生成摘要。

代码链接:based_on_features_with_paragraph.py

显然在这种方法中,由于句子被假定为相互独立的,它们所表达的不同意思仅仅通过简单的词语统计量区别。将句子看成是相互独立的,意味着形成的摘要中的句子有可能会在内容上重复,该方法目前还没有考虑解决该问题。

基于TextRank的实现方法

  • 对文本进行句子切分,如果文本有分段,则将所有段落的句子放在一起;
  • 对所有的句子,抽取重要的词汇(这里主要抽取名词),作为后续计算相似性的依据;
  • 计算句子和句子之间的相似性,构造一个权值矩阵,矩阵的大小为句子数*句子数;相似性计算的公式如下:
    $$Similarity({ S }_{ i },{ S }_{ j })=\frac { |\{ { w }_{ k }|{ w }_{ k }\in { S }_{ i }{ \& { w }_{ k }\in S }_{ j }\} | }{ log(|{ S }_{ i }|)+log(|{ S }_{ j }|) }, { S }_{ i }为第i个句子,{ w }_{ k }为句子中的第k个词,|{ S }_{ i }|为句子的长度 $$
  • 对所有句子的权值初始化为1,然后进行TextRank迭代收敛,最终的权重作为句子的得分;
  • 取得分最高的topK个句子,按照在原文中的顺序排列输出;

代码链接:based_on_textrank.py

利用LSA进行单文档摘要

压缩文本,去除噪音。
从词的权重出发,构造出句子的权重和段落的权重,用句子的权重选出句子,用段落的权重给出每段应该选多少个句子?

基于LDA的单文档摘要

计算文档的语义模型和句子的语义模型的KL散度。