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

本文涉及的产品
应用实时监控服务-用户体验监控,每月100OCU免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【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字以内摘要
266 0
|
8月前
|
SQL 关系型数据库 测试技术
查询数据技巧摘要
【5月更文挑战第11天】 SQL 提效技巧摘要,利用 SQL 特性减少程序模板,如在数据位置处理,优化性能,学习如 `FOR-EACH` 循环和 `NULL` 处理等。
81 0
|
8月前
|
机器学习/深度学习 自然语言处理 关系型数据库
第2章 知识抽取:概述、方法
第2章 知识抽取:概述、方法
第2章 知识抽取:概述、方法
|
机器学习/深度学习 自然语言处理
【论文速递】ACL 2022 - 查询和抽取:将事件抽取细化为面向类型的二元解码
事件抽取通常被建模为一个多分类问题,其中事件类型和论元角色被视为原子符号。这些方法通常仅限于一组预定义的类型。
154 1
|
人工智能 自然语言处理 搜索推荐
插件推荐:一键提取视频和网页摘要Glarity
插件推荐:一键提取视频和网页摘要Glarity
329 0
插件推荐:一键提取视频和网页摘要Glarity
|
自然语言处理
|
XML 存储 数据处理
1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)、文本分类等
1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)、文本分类等
1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)、文本分类等
|
XML 存储 JSON
2.基于Label studio的训练数据标注指南:(智能文档)文档抽取任务、PDF、表格、图片抽取标注等
2.基于Label studio的训练数据标注指南:(智能文档)文档抽取任务、PDF、表格、图片抽取标注等
|
JSON 自然语言处理 数据挖掘
4.基于Label studio的训练数据标注指南:情感分析任务观点词抽取、属性抽取
4.基于Label studio的训练数据标注指南:情感分析任务观点词抽取、属性抽取
|
机器学习/深度学习 自然语言处理 知识图谱