基于开源文本摘要模块sumy的文本摘要生成实践

    自然语言处理领域中有很多的子任务,大类上一共分为四个板块,如下:

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即可。

      三种方法使用的是同一份数据,结果输出如下所示:

方法一结果:

方法二结果: 

方法三结果:

    从结果直观来看,第一种方法和最后一种方法的结果一致,第二种方法产生的结果略有不同,可能也是跟内部的实现原理和方法不同有关系吧,今天是一个入门式的基础实践,后面有时间继续研究学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Together_CZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值