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

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
云原生网关 MSE Higress,422元/月
函数计算FC,每月15万CU 3个月
简介: 【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来获取页面的正文文本。然后对文本进行分句:使用上述程序,将文章文本按句子分割。最后获得摘要。

目录
相关文章
|
6天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
8天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1562 10
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
11天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
737 27
|
8天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
225 3
|
14天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
779 5
|
2天前
|
Python
【10月更文挑战第10天】「Mac上学Python 19」小学奥数篇5 - 圆和矩形的面积计算
本篇将通过 Python 和 Cangjie 双语解决简单的几何问题:计算圆的面积和矩形的面积。通过这道题,学生将掌握如何使用公式解决几何问题,并学会用编程实现数学公式。
108 60
|
1天前
|
人工智能
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
115 1
|
3天前
|
Java 开发者
【编程进阶知识】《Java 文件复制魔法:FileReader/FileWriter 的奇妙之旅》
本文深入探讨了如何使用 Java 中的 FileReader 和 FileWriter 进行文件复制操作,包括按字符和字符数组复制。通过详细讲解、代码示例和流程图,帮助读者掌握这一重要技能,提升 Java 编程能力。适合初学者和进阶开发者阅读。
104 61
|
14天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】