自然语言处理领域中有很多的子任务,大类上一共分为四个板块,如下:
1. 序列标注:分词/POS Tag/NER/语义标注
2. 分类任务:文本分类/情感计算
3. 句子关系判断:Entailment/QA/自然语言推理
4. 生成式任务:机器翻译/文本摘要
在我接触NLP相关的工作以来,任务1和任务2是比较常见的,后面两种则几乎没有什么接触,今天发现了一个比较有意思的自动文本摘要生成模块sumy,这个属于最后一个任务领域里面的内容,所以就当做入门实践来学习一下,早在之前也看多阮一峰大神的博客,对自动文本摘要生成已经有了一些浅薄的了解了,这里是博客文章地址:
http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html
个人感觉讲的是非常通俗易懂的,当初就是看着伪代码实现了一版最基础的方法,下面是源代码部分的内容:
Summarizer(originalText, maxSummarySize):
// 计算原始文本的词频,生成一个数组,比如[(10,'the'), (3,'language'), (8,'code')...]
wordFrequences = getWordCounts(originalText)
// 过滤掉停用词,数组变成[(3, 'language'), (8, 'code')...]
contentWordFrequences = filtStopWords(wordFrequences)
// 按照词频进行排序,数组变成['code', 'language'...]
contentWordsSortbyFreq = sortByFreqThenDropFreq(contentWordFrequences)
// 将文章分成句子
sentences = getSentences(originalText)
// 选择关键词首先出现的句子
setSummarySentences = {}
foreach word in contentWordsSortbyFreq:
firstMatchingSentence = search(sentences, word)
setSummarySentences.add(firstMatchingSentence)
if setSummarySentences.size() = maxSummarySize:
break
// 将选中的句子按照出现顺序,组成摘要
summary = ""
foreach sentence in sentences:
if sentence in setSummarySentences:
summary = summary + " " + sentence
return summary
更多的内容建议去作者博客里面去看,我这里就不多在累述了。
接下来进入正文,sumy地址在这里。
首页截图如下所示:
作者的介绍也很清晰明了,就是一个自动文本摘要生成模块。
看过了一些基础的介绍以及API使用说明后,这里就想做一些实践,先给出来完整的代码实现:
#!usr/bin/env python
#encoding:utf-8
from __future__ import division
'''
__Author__:沂水寒城
功能:基于开源模块sumy的简单文本摘要
文本摘要方法参考学习可以借鉴阮一峰下面的文章:
http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html
'''
from sumy.nlp.stemmers import Stemmer
from sumy.utils import get_stop_words
from sumy.parsers.html import HtmlParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.parsers.plaintext import PlaintextParser
from sumy.summarizers.lsa import LsaSummarizer as Summarizer
#设置输出句子总数
SENTENCES_COUNT = 10
def urlContentSummary(url,language):
'''
基于URL内容的文本的摘要方法
'''
parser = HtmlParser.from_url(url, Tokenizer(language))
stemmer = Stemmer(language)
summarizer = Summarizer(stemmer)
summarizer.stop_words = get_stop_words(language)
for sentence in summarizer(parser.document, SENTENCES_COUNT):
print(sentence)
def plainTextSummary(data,language):
'''
基于明文数据内容的摘要方法
'''
parser = PlaintextParser.from_string(data, Tokenizer(language))
stemmer = Stemmer(language)
summarizer = Summarizer(stemmer)
summarizer.stop_words = get_stop_words(language)
for sentence in summarizer(parser.document, SENTENCES_COUNT):
print(sentence)
def fileDataSummary(files,language):
'''
基于文件数据内容的摘要方法
'''
parser = PlaintextParser.from_file(files, Tokenizer(language))
stemmer = Stemmer(language)
summarizer = Summarizer(stemmer)
summarizer.stop_words = get_stop_words(language)
for sentence in summarizer(parser.document, SENTENCES_COUNT):
print(sentence)
if __name__ == "__main__":
url="https://m.gmw.cn/baijia/2020-07/28/1301403267.html"
data="""中国应对疫情为何越发从容
07-28 08:22
最近,疫情防控的好消息不少。
先是北京,用40天的时间基本控制住了一波突发疫情,重大突发公共卫生事件应急响应级别由二级调至三级。
接着,乌鲁木齐市疾控中心表示,该市已基本控制了聚集性疫情的风险,核酸检测累计超百万人份。
同时,武汉一位进行了换肺手术的新冠肺炎患者,一度被认为“救不过来”了,在住院166天后出院了。
从这些事实可以看出,自从中国进入疫情零星散发、局部暴发风险并存的阶段后,疫情防控的反应越来越快,措施越来越准,效果越来越好,民众对于国家疫情防控水平的认可越来越高。当然,能达到这样从容不迫的阶段,也是经过了一个过程。
记得年初武汉刚刚发生疫情的时候,因为对病毒的认知不多,对疫情的走向看不清,社会上一度非常紧张。大家宅在家里,心里每天揪着,七上八下的。
武汉保卫战之后,国家宣布进入疫情防控常态化阶段,很多人还不理解,觉得疫情好不容易已经过去了,可以长松一口气了。结果,一方面境外输入案例增多,边境地区防控压力加大,一方面本土新增案例还在出现,尤其是6月初北京发生了疫情,都在不断提醒人们,不可对疫情防控麻痹大意,思想松懈不得,病毒还未退却,找准时机还会发动突袭,于是大家对疫情防控常态化的认识更加深入,更加理解。
社会上的信心,根本上来自国家已经形成了一套行之有效的疫情应对策略,工具箱里各种工具种类充足,使用空间充分。应急响应级别及时调整、诊疗方案不断更新、医务人员操作更加熟练、流行病学调查愈加缜密、各方面应对经验持续积累……于是人们看到,疫情在哪里出现苗头,就能在哪里被摁住,露头就打,不会让它肆意蔓延开来,该怎么着就怎么着,我们还怕什么?
有了这样的全民疫情防控体系,每个人身在其中,既享受到了安全,又做出了贡献。去商场,戴口罩、测体温;去上班,自觉保持社交距离;去出差,做好核酸检测……真正做到了我为人人,人人为我。如此一来,整个社会才会运行得有条不紊、克难前行。经济能在二季度回正,就是最好的证明。
没有什么能难倒中国人。也许困难刚来临的时候,确实会引发惊慌,有人会逃离,有人会绝望,有人会嘲讽,但是绝大部分中国人都能站稳脚跟,精诚团结,齐心面对。我们不后退,因为这是我们的家园;我们不颓废,因为有一大批为我们奋战的逆行者;我们有自信,因为我们能做到;我们有未来,因为我们是不屈的中国人。
作者:熊 建
声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。
来源:人民日报海外版
"""
urlContentSummary(url,'chinese')
print('='*80)
plainTextSummary(data,'chinese')
print('='*80)
fileDataSummary('test.txt','chinese')
从sumy模块的实现中看到,一共提供了三种文本数据摘要方法,分别是:基于url内容的摘要、基于明文数据的摘要和基于文件数据的摘要,我们上面的代码中分别对其进行了对比,选用的是今天百度推送的一篇新闻文章,地址如下:
https://m.gmw.cn/baijia/2020-07/28/1301403267.html
截图如下所示:
因为使用的是中文数据,所以language设置的是chinese,也可以使用英文数据,只需要将language修改为english即可。
三种方法使用的是同一份数据,结果输出如下所示:
方法一结果:
方法二结果:
方法三结果:
从结果直观来看,第一种方法和最后一种方法的结果一致,第二种方法产生的结果略有不同,可能也是跟内部的实现原理和方法不同有关系吧,今天是一个入门式的基础实践,后面有时间继续研究学习。