使⽤Python⾃动提取内容摘要
利⽤计算机将⼤量的⽂本进⾏处理,产⽣简洁、精炼内容的过程就是⽂本摘要,⼈们可通过阅读摘要来把握⽂本主要内容,这不仅⼤⼤节省时间,更提⾼阅读效率。但⼈⼯摘要耗时⼜耗⼒,已不能满⾜⽇益增长的信息需求,因此借助计算机进⾏⽂本处理的⾃动⽂摘应运⽽⽣。近年来,⾃动摘要、信息检索、信息过滤、机器识别、等研究已成为了⼈们关注的热点。
⾃动摘要(Automatic Summarization)的⽅法主要有两种:Extraction和Abstraction。其中Extraction是抽取式⾃动⽂摘⽅法,通过提取⽂档中已存在的关键词,句⼦形成摘要;Abstraction是⽣成式⾃动⽂摘⽅法,通过建⽴抽象的语意表⽰,使⽤⾃然语⾔⽣成技术,形成摘要。由于⾃动摘要⽅法需要复杂的⾃然语⾔理解和⽣成技术⽀持,应⽤领域受限。,抽取式摘要成为现阶段主流,它也能在很⼤程度上满⾜⼈们对摘要的需求。
⽬前抽取式的主要⽅法:
基于统计:统计词频,位置等信息,计算句⼦权值,再简选取权值⾼的句⼦作为⽂摘,特点:简单易⽤,但对词句的使⽤⼤多仅停留在表⾯信息。
基于图模型:构建拓扑结构图,对词句进⾏排序。例如,TextRank/LexRank
基于潜在语义:使⽤主题模型,挖掘词句隐藏信息。例如,采⽤LDA,HMM
基于线路规划:将摘要问题转为线路规划,求全局最优解。
2007年,美国学者的论⽂(Dipanjan Das, Andre F.T. Martins, 2007)总结了⽬前的⾃动摘要算法。其中,很重要的⼀种就是词频统计。这种⽅法最早出⾃1958年的IBM公司科学家 H.P. Luhn的论⽂。
Luhn博⼠认为,⽂章的信息都包含在句⼦中,有些句⼦包含的信息多,有些句⼦包含的信息少。”⾃动摘要”就是要出那些包含信息最多的句⼦。句⼦的信息量⽤”关键词”来衡量。如果包含的关键词越多,就说明这个句⼦越重要。Luhn提出⽤”簇”(cluster)表⽰关键词的聚集。所谓”簇”就是包含多个关键词的句⼦⽚段。
cluster
上图就是Luhn原始论⽂的插图,被框起来的部分就是⼀个”簇”。只要关键词之间的距离⼩于”门槛值”,它们就被认为处于同⼀个簇之中。Luhn建议的门槛值是4或5。也就是说,如果两个关键词之间有5个以上的其他词,就可以把这两个关键词分在两个簇。下⼀步,对于每个簇,都计算它的重要性分值。
cluster-2
以上图为例,其中的簇⼀共有7个词,其中4个是关键词。因此,它的重要性分值等于 ( 4 x 4 ) / 7 = 2.3。
然后,出包含分值最⾼的簇的句⼦(⽐如5句),把它们合在⼀起,就构成了这篇⽂章的⾃动摘要。具体实现可以参见 (O’Reilly, 2011)⼀书的第8章,python代码见。
Luhn的这种算法后来被简化,不再区分”簇”,只考虑句⼦包含的关键词。下⾯就是⼀个例⼦(采⽤伪码表⽰),只考虑关键词⾸先出现的句⼦。
类似的算法已经被写成了⼯具,⽐如基于Java的库的模块、基于C语⾔的库、以及基于classifier4J的和。
参考⽂章:
TextTeaser
原本是为在线长⽂章(所谓 tl;dr:too long; didn’t read)⾃动⽣成摘要的服务,其原本的收费标准是每摘要 1000 篇⽂章付费 12 美元或每⽉ 250 美元。巴尔宾称 TextTeaser 可以为任何使⽤罗马字母的⽂本进⾏摘要,⽽且⽐同类⼯具如 Cruxbot 和 Summly(在2013 年 3 ⽉被 雅虎斥资 3000 万美元收购)更准确。其创造者霍洛·巴尔宾(Jolo Balbin)表⽰,在“发现⼀些扩展问题,特别是API 中的问题
后”,他决定将 TextTeaser 代码开源。
TextTeaser开源的代码⼀共有三个class,TextTeaser,Parser,Summarizer。
TextTeaser,程序⼊⼝类。给定待摘要的⽂本和⽂本题⽬,输出⽂本摘要,默认是原⽂中最重要的5句话。
Summarizer,⽣成摘要类。计算出每句话的分数,并按照得分做排序,然后按照原⽂中句⼦的顺序依次输出得分最⾼的5句话作为摘
要。
Parser,⽂本解析类。对⽂本进⾏去除停⽤词、去除标点符号、分词、统计词频等⼀些预处理操作。
其中打分模型分为四部分:
句⼦长度,长度为20的句⼦为最理想的长度,依照距离这个长度来打分。
句⼦位置,根据句⼦在全⽂中的位置,给出分数。(巴尔宾认为⼀篇⽂章的第⼆句⽐第⼀句更重要,因为很多作家都习惯到第⼆句话引⼊关键点)备注:⽤段落效果会怎样?
⽂章标题与⽂章内容的关系,句⼦是否包含标题词,根据句⼦中包含标题词的多少来打分。
句⼦关键词打分,⽂本进⾏预处理之后,按照词频统计出排名前10的关键词,通过⽐较句⼦中包含关键词的情况,以及关键词分布的情况来打分(sbs,dbs两个函数)。
开源版本:
Scala版本:
Python版本:
⾃⼰尝试这个调⽤Python版本。主要:不要使⽤pip install textteaser进⾏安装,该安装⽅式安装的是这个项⽬:
下载完成后在Windows下运营test.py会报错,报错信息如下:
1 2 3 4 5 6 7 8 9 10 11 12Traceback (most recent call last):
File "D:/textteaser/test.py", line 12, in <module>
sentences = tt.summarize(title, text)
File "D:\textteaser\textteaser\__init__.py", line 13, in summarize
result = self.summarizer.summarize(text, title, source, category)
File "D:\textteaser\textteaser\summarizer.py", line 11, in summarize
sentences = self.parser.splitSentences(text)
File "D:\textteaser\textteaser\parser.py", line 62, in splitSentences
tokenizer = nltk.data.load('file:' + os.path.dirname(os.path.abspath(__file__)) + '/trainer/english.pickle')  File "C:\Python27\lib\site-packages\nltk\data.py", line 806, in load
resource_val = pickle.load(opened_resource)
ImportError: No module named copy_reg
针对报错信息,做如下修改:
1、将”D:\textteaser\textteaser\parser.py”第62⾏进⾏修改:
1 2#tokenizer = nltk.data.load('file:' + os.path.dirname(os.path.abspath(__file__)) + '/trainer/english.pickle')
tokenizer = nltk.data.load('file:' + os.path.dirname(os.path.abspath(__file__)) + os.sep + 'trainer' + os.sep + 'english.pickle')
2、到”\Lib\site-packages\nltk\data.py”第924⾏,将1return find(path_, ['']).open()
修改为:
1 2 3        file_path = find(path_, [''])
data = open(file_path, 'rb').read()
newdata = place("\r\n", "\n")java调用python模型
4 5 6 7 8 9        if newdata != data:
f = open(file_path, "wb")
f.write(newdata)
f.close()
f = open(file_path, "rb")
return f
注意:TextTeaser⽬前只⽀持英⽂摘要。
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 的得分定义如下:
TextRank
其中, d 为阻尼系数, 取值范围为 0 到 1, 代表从图中某⼀特定点指向其他任意点的概率, ⼀般取值为 0.85。使⽤TextRank 算法计算图中各点的得分时, 需要给图中的点指定任意的初值, 并递归计算直到收敛, 即图中任意⼀点的误差率⼩于给定的极限值时就可以达到收敛, ⼀般该极限值取 0.0001。
基于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的⾃动⽂摘
基于TextRank的⾃动⽂摘属于⾃动摘录,通过选取⽂本中重要度较⾼的句⼦形成⽂摘,其主要步骤如下:
1. 预处理:将输⼊的⽂本或⽂本集的内容分割成句⼦得,构建图G =(V,E),其中V为句⼦集,对句⼦进⾏分词、去除停⽌词,得,其
中是保留后的候选关键词。
2. 句⼦相似度计算:构建图G中的边集E,基于句⼦间的内容覆盖率,给定两个句⼦,采⽤如下公式进⾏计算:
simikarity-1若两个句⼦之间的相似度⼤于给定的阈值,就认为这两个句⼦语义相关并将它们连接起来,即边的权值:similarity-2
3. 句⼦权重计算:根据公式,迭代传播权重计算各句⼦的得分;
4. 抽取⽂摘句:将3得到的句⼦得分进⾏倒序排序,抽取重要度最⾼的T个句⼦作为候选⽂摘句。
5. 形成⽂摘:根据字数或句⼦数要求,从候选⽂摘句中抽取句⼦组成⽂摘。
参考资料:
玻森⾃动摘要
玻森采⽤的是最⼤边缘相关模型(Maximal Marginal Relevance)的⼀个变种。MMR是⽆监督学习模型,它的提出是为了提⾼信息检索(Information Retrieval)系统的表现。例如搜索引擎就是⽬前⼤家最常⽤的信息检索系统。⼤家可能经常会碰到,对于我们输⼊的⼀个关键词,搜索引擎通常会给出重复的或者内容太接近的检索的情况。为了避免这个现象,搜索引擎可以通过MMR来增加内容的多样性,
给出多⽅⾯考虑的检索结果,以此来提⾼表现。这样的思想是可以被借鉴⽤来做摘要的,因为它是符合摘要的基本要求的,即权衡相关性和多样性。不难理解,摘要结果与原⽂的相关性越⾼,它就接近全⽂中⼼意思。⽽考虑多样性则使得摘要内容更加的全⾯。⾮常的直观和简单是该模型的⼀个优点。
相⽐于其他⽆监督学习⽅法,如TextRank(TR), PageRank(PR)等,MMR是考虑了信息的多样性来避免重复结果。TR,PR是基于图(Graph)的学习⽅法,每个句⼦看成点,每两个点之间都有⼀条带权重(Weighted)的⽆向边。边的权重隐式定义了不同句⼦间的游⾛概率。这些⽅法把做摘要的问题看成随机游⾛来出稳态分布(Stable Distribution)下的⾼概率(重要)的句⼦集,但缺点之⼀便是⽆法避免选出来的句⼦相互之间的相似度极⾼的现象。⽽MMR⽅法可以较好地解决句⼦选择多样性的问题。具体地说,在MMR模型中,同时将相关性和多样性进⾏衡量。因此,可以⽅便的调节相关性和多样性的权重来满⾜偏向“需要相似的内容”或者偏向“需要不同⽅⾯的内容”的要求。对于相关性和多样性的具体评估,玻森是通过定义句⼦之间的语义相似度实现。句⼦相似度越⾼,则相关性越⾼⽽多样性越低。
⾃动摘要的核⼼便是要从原⽂句⼦中选⼀个句⼦集合,使得该集合在相关性与多样性的评测标准下,得分最⾼。数学表达式如下:
mmr
需要注意的是,D,Q,R,S都为句⼦集,其中,D表⽰当前⽂章,Q表⽰当前中⼼意思,R表⽰当前⾮摘要,S表⽰当前摘要。可以看出,在给定句⼦相似度的情况下,上述MMR的求解为⼀个标准的最优化问题。但是,上述⽆监督学习的MMR所得摘要准确性较低,因为全⽂的结构信息难以被建模,如段落⾸句应当有更⾼的权重等。为了提⾼新闻⾃动摘要的表现,玻森在模型中加⼊了全⽂结构特征,将MMR改为有监督学习⽅法。从⽽模型便可以通过训练从“标准摘要”中学习特征以提⾼准确性。
玻森采⽤摘要公认的Bi-gram ROUGE F1⽅法来判断⾃动⽣成的摘要和“标准摘要”的接近程度。经过训练,玻森在训练数集上的表现相对于未学习的摘要结果有了明显的提升——训练后的摘要系统F1提⾼了30%。值得⼀提的是,在特征训练中,为了改善摘要结果的可读性,玻森加指代关系特征,使得模型表现提⾼了8%。
相关链接:
其他相关开源项⽬: