文本抽取式摘要
关键词:抽取式,BM25算法,行业知识后处理。
背景
笔者所在的公司原来已经有一个自动摘要的模块,我只是在原来的基础上,做了些针对特定领域的优化。
首先自动文本摘要大概分为 抽取式和生成式两类。抽取式摘要主要是直接抽取输入文本的几句话来概括整段的内容,这个实现相对简单(常用算法 TextRank、TF-IDF 等,本文使用的是 BM25 算法)。另一种是生成式,生成式的构成比较复杂,实现难度也很大,效果在实际落地过程中也并不理想。所以下文主要是针对抽取式自动摘要来讨论的。
问题的算法抽象
首先抽取式摘要,问题可以归结为从文章中选取和其他句子最相关的那句话。也就是将每句话当成“搜索框”里输入的句子,然后计算其他句子和他的相关度得分,然后选取和其他句子相关性得分最高的那句话作为摘要。
BM25算法:
首先BM25算法在搜索引擎领域是很有用的。这里关于BM25解析,讲的很好的文章: BM25 - ywl925 - 博客园 。这里就不展开介绍了。
BM25算法得分的归一化
经过BM25算法计算的得分,范围相差会很大,笔者为了实现后面的静态加分,先对BM25算的score进行了一个归一化。归一化一般最常见的两种: Min-Max和Z score,是相对常见的概念。可以参考博客:数据归一化和两种常用的归一化方法 - ChaoSimple - 博客园
特定领域知识的积累
这里明确一下,这里所说的领域知识,主要是某些很有区分度的词和短语。这里涉及的底层模块也比较多。
首先是特定领域的语料库的积累。
以中文为例,除了一些公开的语料库,我们还需要一些扩充一些专门领域的语料。并对他们进行标注。
然后相应的,分词模块也要增强。
特别是针对那些领域专有的名词。由于现在中文分词的技术已经比较成熟,所以这块相对来说挑战不是很大。而且这面即使是基于HMM或者CRF做的分词,都已经有很可观的实用表现,和相当的泛化。不过如果能把底层的分词的模块性能和准确率提升一点,也会有很大的帮助,毕竟在中文文本处理中,分词是第一步要做的基础操作。
行业知识静态加分
这里的实现目前还是比较粗糙的。首先总结每个行业有区分度的词。这个词的获取会上面提到的特定的行业语料库,以及针对这个领域的分词。
在句子计算BM25得分,并归一化后,这里判断句子里面是否有领域关键词,如果有领域关键词,则静态的给归一化后的BM25 分数加一个静值。 之后对各个句子,按照这个新的分数排序。抽取得分最高的那句话。
这里还有一个问题可以深挖,就是笔者目前实现的领域知识加分,是在已经预先分好了分类的前提下,也就是说传入的参数,除了原文还会有属于哪个领域的具体信息。如果这个领域分类信息没有提前获得,那么就需要对整段文字做一个大概的分类,这样的难度就会大增。我们后续可以继续讨论这种情况。