本篇文章主要介绍摘要提取的方法。
本项目完整源码地址:
链接: https://pan.baidu.com/s/1yymEHofUoFzjbN_mdThsKw 提取码: yd3z
项目博客地址:
https://blog.csdn.net/qq_29153321/article/details/104037335
一、背景介绍
目前自动摘要(Automatic Summarization)的方法主要有两种:
Extraction 是抽取式自动文摘方法,通过提取文档中已存在的关键词,句子形成摘要;
Abstraction 是生成式自动文摘方法,通过建立抽象的语意表示,使用自然语言生成技术,形成摘要。
这两种方法都有一定的局限性,第一种抽取式摘要提取的结果普遍太冗长,并且不一定能完全概括文章中心思想;第二种生成式摘要提取的方法主要基于seq2seq模型进行改进的,目前还不太成熟。
二、基于依存句法和语义角色标注的事件三元组抽取
句法分析是自然语言中关键技术之一,其主要任务时确定句法结构、句子中的词汇之间的依存关系;因而主要包括两方面的内容:一、确定语言的语法体系,即对句子结构给与形式化定义;二、句法分析技术,根据语法体系,推导出句子的句法结构,以及句法单位与句法单位之间的关系。
语义依存分析是分析句子中的各语言单位的关联,并将语义关联以依存的结构进行展示;语义依存分析目标是跨越句子表层句法结构的束缚,直接获取深层的语义信息。浅层语义分析是依赖于句法分析的结果,而深层的语义分析并不都跟句法分析结果产生影响,这就是语义分析与句法分析的不同之处。
语义角色与语义分析之间存在着关联性,语义角色只关注的是谓词的论元以及谓词与论元之间的关系;语义分析不仅关注谓词与论元的关系,还关注谓词与谓词、论元与论元、论元内部的语义关系。其语义分析更加的全面。
语义依存关系主要分为三类:1、主要语义角色,每一种语义角色对应存在一个嵌套关系和反关系;2、事件关系,描述两个事件的关系;3、语义依附标记,标记说话者语气等依附信息。
目前哈工大的分词pyltp提供了相应的模块,pyltp包的主要功能为:分句(SentenceSplitter)、分词(cws.model)、词性标注(pos.model)、实体命名(ner.model…)、依存句法分析(parser.model)、语义角色分析(srl)、语义依存分析(暂不提供这个功能)
基于依存句法的三元组抽取
1、对于每个词生成一个该词的依存句法的儿子节点,主要存储关系和对应儿子词的位置;
2、对没歌词生成一个该词的父子数组的依存结构,主要是记录该词的词性、父节点的词性以及他们之间的关系;
3、循环每个词,找到具有动宾关系、定语后置动宾关系、介宾的主谓动补关系,并进行提取;
4、对于提取主宾中的词,需要在里面寻找具有相关依存结构的词,剔除不需要的词;
基于语义角色标注的三元组抽取
利用ltp的语义角色对句子进行标注,统计是否存在svo的结构,如果存在,则提取,否则,换依存句法进行提取。
https://blog.csdn.net/Zh823275484/article/details/88037951
二、摘要提取实践部分
本文提出了一种新的提取摘要的方法,基于三元组抽取
依存分析
1 主谓关系 SBV subject-verb 我送她一束花 (我 <-- 送)
2 动宾关系 VOB 直接宾语,verb-object 我送她一束花 (送 --> 花)
3 间宾关系 IOB 间接宾语,indirect-object 我送她一束花 (送 --> 她)
4 前置宾语 FOB 前置宾语,fronting-object 他什么书都读 (书 <-- 读)
5 兼语 DBL double 他请我吃饭 (请 --> 我)
6 定中关系 ATT attribute 红苹果 (红 <-- 苹果)
7 状中结构 ADV adverbial 非常美丽 (非常 <-- 美丽)
8 动补结构 CMP complement 做完了作业 (做 --> 完)
9 并列关系 COO coordinate 大山和大海 (大山 --> 大海)
10 介宾关系 POB preposition-object 在贸易区内 (在 --> 内)
11 左附加关系 LAD left adjunct 大山和大海 (和 <-- 大海)
12 右附加关系 RAD right adjunct 孩子们 (孩子 --> 们)
13 独立结构 IS independent structure 两个单句在结构上彼此独立
14 核心关系 HED head 指整个句子的核心
本文使用哈工大LTP进行三元组提取,具体参考
https://blog.csdn.net/weixin_44243926/article/details/90263582
代码参考,感谢这位大牛的代码,如有侵权立马相告
https://github.com/liuhuanyong/EventTriplesExtraction
主要对后面进行了改写:
提取摘要部分(满足app显示,摘要不超过9字):
1.运用标题
标题不超过9字(不去停用词/去停用词)
# title
# 不用停用词
titlelen = title_extract(title)
if len(titlelen) <= 9:
return "title", titlelen
# 用停用词
titlelen = title_extract(title, True)
if len(titlelen) <= 9:
return "title", titlelen
# title extract
result = extract(title)
if result != None and len(result) > 0:
return "title extract", result
return None
2.三元组提取
# title extract
svos = extractor.triples_main(title)
# 三元组
for svo in svos:
newtitle = ''.join(svo)
if len(newtitle) <= 9:
return newtitle
# 三元组去停用词
for svo in svos:
newtitle = ''.join(svo)
newtitle = title_extract(newtitle, stopword=True)
if len(newtitle) <= 9:
return newtitle
# 三元组中的词语(大于4小于9的最长词)
result = []
for svo in svos:
svo = [i for i in svo if len(i) >= 4 and len(i) <= 9]
if svo != []:
result.extend(svo)
if result != []:
return max(result, key=len)
最后还可以加上关键词提取的方法提取文章摘要,关键词提取的方法暂时未列出,主要依靠tfidf、词长、位置、实体词加权的方法实现,找出大于4小于9的最长词。
结果评估:
人工评估结果如下: