• TF-IDF与余弦相似性的应用(三):自动摘要


    有时候,很简单的数学方法,就可以完成很复杂的任务。

    这个系列的前两部分就是很好的例子。仅仅依靠统计词频,就能找出关键词相似文章。虽然它们算不上效果最好的方法,但肯定是最简便易行的方法。

    今天,依然继续这个主题。讨论如何通过词频,对文章进行自动摘要Automatic summarization)。

    如果能从3000字的文章,提炼出150字的摘要,就可以为读者节省大量阅读时间。由人完成的摘要叫"人工摘要",由机器完成的就叫"自动摘要"。许多网站都需要它,比如论文网站、新闻网站、搜索引擎等等。2007年,美国学者的论文A Survey on Automatic Text SummarizationDipanjan Das, Andre F.T. Martins, 2007)总结了目前的自动摘要算法。其中,很重要的一种就是词频统计。

    这种方法最早出自1958年的IBM公司科学家H.P. Luhn的论文The Automatic Creation of Literature Abstracts

    Luhn博士认为,文章的信息都包含在句子中,有些句子包含的信息多,有些句子包含的信息少。"自动摘要"就是要找出那些包含信息最多的句子。

    句子的信息量用"关键词"来衡量。如果包含的关键词越多,就说明这个句子越重要。Luhn提出用""cluster)表示关键词的聚集。所谓""就是包含多个关键词的句子片段。

    上图就是Luhn原始论文的插图,被框起来的部分就是一个""。只要关键词之间的距离小于"门槛值",它们就被认为处于同一个簇之中。Luhn建议的门槛值是45。也就是说,如果两个关键词之间有5个以上的其他词,就可以把这两个关键词分在两个簇。

    下一步,对于每个簇,都计算它的重要性分值。

    以前图为例,其中的簇一共有7个词,其中4个是关键词。因此,它的重要性分值等于 ( 4 x 4 ) / 7 = 2.3

    然后,找出包含分值最高的簇的句子(比如5句),把它们合在一起,就构成了这篇文章的自动摘要。具体实现可以参见Mining the Social Web: Analyzing Data from Facebook, Twitter, LinkedIn, and Other Social Media SitesO'Reilly, 2011)一书的第8章,python代码见github

    Luhn的这种算法后来被简化,不再区分"",只考虑句子包含的关键词。下面就是一个例子(采用伪码表示),只考虑关键词首先出现的句子。

      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

    类似的算法已经被写成了工具,比如基于JavaClassifier4J库的SimpleSummariser模块、基于C语言的OTS库、以及基于classifier4JC#实现python实现

    (完)

  • 相关阅读:
    基于ABP落地领域驱动设计-04.领域服务和应用服务的最佳实践和原则
    基于ABP落地领域驱动设计-03.仓储和规约最佳实践和原则
    基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则
    基于ABP落地领域驱动设计-01.全景图
    Es6-find&map&filter&reduce
    vue之监听事件
    list map互相转换
    springcloud 返回实体类忽略属性
    Apache NetBeans IDE 12.3 双击无反应怪事
    前端--- 前端调试经验总结
  • 原文地址:https://www.cnblogs.com/Yiutto/p/5261070.html
Copyright © 2020-2023  润新知