一个抽取式摘要的应用示例

本文涉及的产品
函数计算FC,每月15万CU 3个月
可观测监控 Prometheus 版,每月50GB免费额度
注册配置 MSE Nacos/ZooKeeper,182元/月
简介: 【10月更文挑战第4天】本文介绍了生成式和抽取式两种摘要算法。生成式摘要通过自然语言生成技术,使用机器学习模型生成新的、精简的句子;抽取式摘要则从文档中提取最能代表内容的句子。文中详细描述了基于TF-IDF的抽取式摘要算法的实现过程,包括计算TF、IDF、句子权重,以及提取摘要的具体步骤。通过示例代码展示了如何实现一个简单的抽取式摘要系统。

1 简介

摘要算法简介。
sysmodel.png

  • 生成式摘要算法分析

生成式摘要(Generative Summarization)不同于抽取式摘要,它不仅是简单地提取文章中的现有句子,还能够生成新的、精简的句子,总结并概括文章内容。

生成式摘要通常基于自然语言生成(NLG)技术,使用机器学习模型,如序列到序列模型(Seq2Seq)、变压器(Transformer) 以及预训练语言模型(如BERT、GPT、T5)等。

编码器-解码器架构:

    编码器:将输入的文章序列(文本)转换为隐藏的向量表示。
    解码器:基于编码器的输出生成新的句子,生成摘要。

注意力机制(Attention Mechanism):

    在解码过程中,解码器动态关注输入序列的不同部分,这使得模型能够更好地理解文章的上下文和句子之间的依赖关系。

预训练模型:

现代生成式摘要模型(如GPT-3、T5)通过大规模文本数据进行预训练,学习语言的结构和上下文,摘要生成的效果会更加精确。

  • 抽取式摘要 (Extractive Summarization)

这是一种自动摘要方法,其核心是从文档中提取出最能代表全文内容的句子或片段。常见的方法包括以下几种:

词频法(Term Frequency, TF):计算文档中每个词的频率,选择包含高频词的句子作为摘要。

TF-IDF(Term Frequency-Inverse Document Frequency):结合词频和逆文档频率来衡量一个词在文档中的重要性,选取重要词汇较多的句子。

基于图的算法(如TextRank):将句子看作图中的节点,根据句子之间的相似度构建图,利用PageRank算法排序,选出重要句子。

LDA主题模型:通过隐含狄利克雷分布 (Latent Dirichlet Allocation) 模型,确定文档的主题,从中抽取与主题相关的句子。

深度学习方法:使用BERT等预训练语言模型,通过句子向量化和相似性计算,选取最有代表性的句子。

2 抽取式摘要算法的例子

这里我们将实现一个基于TF-IDF的抽取式摘要算法。该算法会计算每个句子的TF-IDF得分,选择得分最高的句子作为摘要。

    package main

    import (
        "fmt"
        "math"
        "strings"
    )

计算TF的函数 calculateTF 和 IDF的函数

    func calculateTF(sentence string, word string) float64 {
        words := strings.Fields(sentence)
        count := 0
        for _, w := range words {
            if strings.ToLower(w) == strings.ToLower(word) {
                count++
            }
        }
        return float64(count) / float64(len(words))
    }

    // 计算IDF
    func calculateIDF(sentences []string, word string) float64 {
        totalDocuments := len(sentences)
        wordCount := 0
        for _, sentence := range sentences {
            if strings.Contains(strings.ToLower(sentence), strings.ToLower(word)) {
                wordCount++
            }
        }
        if wordCount == 0 {
            return 0
        }
        return math.Log(float64(totalDocuments) / float64(wordCount))
    }

计算句子权重(TF-IDF)

    func calculateSentenceWeight(sentence string, sentences []string) float64 {
        words := strings.Fields(sentence)
        score := 0.0
        for _, word := range words {
            tf := calculateTF(sentence, word)
            idf := calculateIDF(sentences, word)
            score += tf * idf
        }
        return score
    }

提取摘要

    func extractSummary(sentences []string, n int) []string {
        sentenceWeights := make(map[string]float64)
        for _, sentence := range sentences {
            sentenceWeights[sentence] = calculateSentenceWeight(sentence, sentences)
        }

        // 按句子权重排序
        sortedSentences := sortSentencesByWeight(sentenceWeights)

        // 返回权重最高的n个句子
        return sortedSentences[:n]
    }

简单的排序函数

    func sortSentencesByWeight(sentenceWeights map[string]float64) []string {
        type sentencePair struct {
            Sentence string
            Weight   float64
        }
        var pairs []sentencePair
        for sentence, weight := range sentenceWeights {
            pairs = append(pairs, sentencePair{Sentence: sentence, Weight: weight})
        }

根据权重降序排序

        sort.Slice(pairs, func(i, j int) bool {
            return pairs[i].Weight > pairs[j].Weight
        })

        var sortedSentences []string
        for _, pair := range pairs {
            sortedSentences = append(sortedSentences, pair.Sentence)
        }
        return sortedSentences
    }

输入示例文本并提取摘要

    func main() {

        // 示例文本
          text := `
         以逗号分隔的示例文本
  `
  sentences := strings.Split(text, ",") // 简单句子分割 提取摘要,假设我们提取前3个重要句子
  var summarys []string
  summarys = append(summarys, "哈里斯特朗普首次辩论 交锋表现或定输赢")
  summary := extractSummary(sentences, 3)
  summary = append(summarys, summary...)
  fmt.Println("摘要:....")
  for _, sentence := range summary {
      fmt.Println(sentence)
  }
    }

应用到文章示例
要对
进行抽取操作,需要首先获取文章的文本内容,然后运行该程序。

3 示例文本的提取

这里准备了一份以逗号分隔的示例文本如下

        哈里斯特朗普首次辩论 交锋表现或定输赢
          (华盛顿综合电)美国民主党总统候选人哈里斯与共和党对手特朗普的第一场、且可能是两人之间唯一一场电视辩论星期二(9月10日)举行,一般认为,这场辩论不会像特朗普与总统拜登之前的交锋那么戏剧性,但仍有可能对选举胜负起到关键影响,
      哈里斯与特朗普定于星期二到宾夕法尼亚州费城,参与由美国广播公司(ABC)主持的电视辩论,这是两人在这场总统竞选中第一次面对面碰头,也是选民首次有机会看到两人同台较劲,加上宾州是少数摇摆州中竞争最激烈的一个,使此次辩论备受关注,
      罗格斯大学传播与信息学院助理教授克里斯蒂(Erin Christie)告诉法新社:“两位候选人截然不同,两人此前从未见过面,这将是一场非常有启发性的辩论,甚至可能成为选举成败的关键,”

      拜登一个多月前因与特朗普辩论表现不佳,加剧人们对他的年龄和健康的担忧而被迫退选,哈里斯取代拜登上阵后,已抹去特朗普在民调中的优势,但她自认处于劣势,在辩论前五天里都呆在费城附近的匹兹堡备战,
      哈里斯少说少错策略 对比特朗普强势攻击哈里斯投入总统选战后虽然迅速受看好,但能够介绍和推销自己的时间已经不多,
      周二的辩论是她更明确地阐述政策立场,同时加强对特朗普攻势的绝佳机会,预料,哈里斯团队将建议她继续采取言简意赅、稳扎稳打、少说少错的策略,哈里斯将依靠曾任检察官的经验与冷静尖锐的风格,应对特朗普这名被定罪的重罪犯,以及他做出的性别和种族歧视攻击,
      对特朗普来说,这是他重夺优势的最好机会,预料他会在辩论中继续采取咄咄逼人的姿态,但据美国政治新闻网站Politico报道,一些共和党人担心,特朗普可能会搞砸这次机会,特别是如果他把重点放在攻击哈里斯这个人,而不是她的政策表现上,面对哈里斯这位印度裔女对手,如果特朗普攻击过火,可能会引起反效果,

      特朗普周六(7日)在另一摇摆州威斯康辛的竞选集会上,就再次以侮辱性言辞猛烈攻击哈里斯,他也把拜登和哈里斯政府描绘成由左翼独裁者领导的“流氓政权”,称两人从世界各地引进了杀人犯、侵犯儿童者和连环强奸犯,同时把执法武器化,以监禁政治对手,
      哈里斯周六访问一家香料店时则强调团结的重要性,与特朗普形成鲜明对比,被问及她最希望在辩论中传达什么信息时,哈里斯说:“是时候翻过分裂的一页了,是时候让我们的国家团结起来——规划一条新的前进道路了,”
      哈里斯也说,她对共和党籍前副总统切尼与切尼的女儿利兹表态支持她感到荣幸,并强调“把国家置于党派之上很重要”,
      民调差距微小 选举结果仍难料
      《纽约时报》和锡耶纳学院星期天(8日)公布的全国民调结果显示,特朗普以48%的支持率领先哈里斯的47%,但这一差距仍在误差范围内,目前,特朗普在七个战场州不是与哈里斯不相上下,就是以微幅优势领先,这意味着胜负仍然难料,
      尽管人们对总统候选人辩论会在多大程度上影响民调看法不一,但毫无疑问,辩论有时会引发政治地震,密歇根大学教授卡尔(Aaron Kall)以拜登6月与特朗普的辩论为例,向半岛电视台指出:“总统辩论无法让你赢得选举,但绝对有可能让你落败,”
      在6月辩论中,特朗普刻意抹黑拜登,主办方美国有线电视新闻网(CNN)被指未及时纠错,加上拜登本身表现不好,使他最终被迫退选,目前,美国多家媒体机构已为报道此次辩论做好准备,尤其是要更快地纠正特朗普可能抛出的谎言,

在代码中,文本的标题被固定的添加了。这是一个取巧的方式。

  • 运行结果

      摘要:....
    哈里斯特朗普首次辩论 交锋表现或定输赢
    这意味着胜负仍然难料
    也是选民首次有机会看到两人同台较劲
    特朗普以48%的支持率领先哈里斯的47%
    

可以看到,它能筛选出几个出现频率和重要性比较大的作为文本的摘要。虽然因为逆频率的算法导致每次运行获得的摘要结果不一样。

4 小结

程序会根据TF-IDF计算每个句子的得分,并提取出最重要的几句话作为摘要。

运行摘要提取程序:运行程序并返回摘要。你可以通过这些步骤实现自动摘要、看官们可以根据该程序编写一个抓取网页内容的程序,并尝试从 标签中提取正文。你可以根据实际网页的结构调整选择器,比如选择 div, main, 或者其他更适合的标签来获取文本。

获取网页内容可以使用Go的网络库如net/http或者第三方库如colly来获取页面的正文文本。然后对文本进行分句:使用上述程序,将文章文本按句子分割。最后获得摘要。

目录
相关文章
|
机器学习/深度学习 自然语言处理 算法
【文本摘要(1)】抽取式之textrank(无监督学习):生成200字以内摘要
【文本摘要(1)】抽取式之textrank(无监督学习):生成200字以内摘要
371 0
|
存储 数据可视化 计算机视觉
树莓派计算机视觉编程:1~5
树莓派计算机视觉编程:1~5
343 0
|
9月前
|
敏捷开发 开发框架 小程序
微信纯血鸿蒙版正式发布,295天走完微信14年技术之路!
不管外界如何评价和鞭策,这款产品本身,依然需要研发团队一个键一个键敲出来,从内核,到架构,到内测,到公测,再到一轮一轮的 debug,他们要在不到一年的时间里,走完微信14 年的路。 回顾鹅厂所做过的产品里,也许从未有过一款,被如此放在放大镜下凝视。每一次上架,每一个 bug,乃至于每一个里程碑,几乎都预定当天热搜。
406 6
微信纯血鸿蒙版正式发布,295天走完微信14年技术之路!
|
存储 监控 容灾
微信技术总监谈架构:微信之道——大道至简(演讲全文)
在技术架构上,微信是如何做到的?日前,在腾讯大讲堂在中山大学校园宣讲活动上,腾讯广研助理总经理、微信技术总监周颢在两小时的演讲中揭开了微信背后的秘密。 周颢把微信的成功归结于腾讯式的“三位一体”策略:即产品精准、项目敏捷、技术支撑。微信的成功是在三个方面的结合比较好,能够超出绝大多数同行或对手,使得微信走到比较前的位置。所谓产品精准,通俗的讲就是在恰当的时机做了恰当的事,推出了重量级功能,在合适的时间以最符合大家需求的方式推出去。他认为在整个微信的成功中,产品精准占了很大一部分权重。
389 1
微信技术总监谈架构:微信之道——大道至简(演讲全文)
|
12月前
|
弹性计算 安全 API
HTTP 405 Method Not Allowed:解析与解决
本文详细解析了HTTP 405 "Method Not Allowed" 错误,包括其定义、常见原因、示例代码及解决方案。通过检查API文档、修改请求方法或更新服务器配置,可有效解决此错误,提升Web开发效率。
6091 2
|
存储 算法 数据可视化
Python 金融编程第二版(GPT 重译)(一)(1)
Python 金融编程第二版(GPT 重译)(一)
228 1
|
机器学习/深度学习 数据可视化 PyTorch
基于TorchViz详解计算图(附代码)
基于TorchViz详解计算图(附代码)
546 0
|
存储 算法 安全
微信团队分享:来看看微信十年前的IM消息收发架构,你做到了吗
好的架构是迭代出来的,却也少不了良好的设计,本文将带大家回顾微信背后最初的也是最核心的IM消息收发技术架构,愿各位读者能从中获得启发。
498 1
|
XML 关系型数据库 PostgreSQL
Pandas 2.2 中文官方教程和指南(一)(2)
Pandas 2.2 中文官方教程和指南(一)
406 0
|
存储 Unix 程序员
挑战 50 年霸主 C 语言:新语言 Hare,“异端”中的保守派
Hare 原意为野兔,它的开发者希望这种编程语言能够如野兔般拥有顽强的生命力。
513 0
挑战 50 年霸主 C 语言:新语言 Hare,“异端”中的保守派