简单应用抽取式摘要

举报
码乐 发表于 2024/09/10 17:12:32 2024/09/10
【摘要】 1 简介摘要算法简介。生成式摘要算法分析生成式摘要(Generative Summarization)不同于抽取式摘要,它不仅是简单地提取文章中的现有句子,还能够生成新的、精简的句子,总结并概括文章内容。生成式摘要通常基于自然语言生成(NLG)技术,使用机器学习模型,如序列到序列模型(Seq2Seq)、变压器(Transformer) 以及预训练语言模型(如BERT、GPT、T5)等。编码...

1 简介

摘要算法简介。

  • 生成式摘要算法分析

生成式摘要(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来获取页面的正文文本。然后对文本进行分句:使用上述程序,将文章文本按句子分割。最后获得摘要。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。