nlk学习笔记 新闻摘要自动提取

一、关键字

1.项目概述

主要完成一个相对简单的 “关键字提取” 算法,可以提取英文新闻中关键的消息

2.项目构思

拥有关键词最多的句子就是最重要的句子。我们把句子按照关键词数量的多少排序,取前 n 句,即可汇总成我们的摘要。

所以我们的工作可以分为如下步骤:

  • 给在文章中出现的单词按照算法计算出重要性
  • 按照句子中单词的重要性算出句子的总分
  • 按照句子的总分给文章中的每个句子排序
  • 取出前 n 个句子作为摘要

3.项目技术栈

from nltk.tokenize import sent_tokenize, word_tokenize
from nltk.corpus import stopwords
from collections import defaultdict
from string import punctuation
from heapq import nlargest

nltk.tokenize 是 NLTK 提供的分词工具包。所谓的分词 tokenize 实际就是把段落分成句子,把句子分成一个个单词的过程。我们导入的 sent_tokenize() 函数对应的是分段为句。 word_tokenize() 函数对应的是分句为词。

stopwords 是一个列表,包含了英文中那些频繁出现的词,如 amisare

defaultdict 是一个带有默认值的字典容器。

puctuation 是一个列表,包含了英文中的标点和符号。

nlargest() 函数可以很快地求出一个容器中最大的 n 个数字。

 4.实现思路

词频统计

首先我们先要统计出每个词在文章中出现的次数,在统计出次数之后,我们可以知道出现次数最多的词的出现次数 m 。

我们把每个词 wi 出现的次数 mi 除以 m ,算出每个词的 “重要系数”。

重要性高的词就是我们的关键词。

def compute_frequencies(word_sent):freq = defaultdict(int)for s in word_sent:for word in s:if word not in stopwords:freq[word] += 1m = float(max(freq.values()))for w in list(freq.keys()):freq[w] = freq[w]/mif freq[w] >= max_cut or freq[w] <= min_cut:del freq[w]return freq

获得摘要

现在每个单词(stopwords 和出现频率异常的单词除外)都有了 “重要性” 这样一个量化描述的值。我们现在需要统计的是一个句子中单词的重要性。只需要把句子中每个单词的重要性叠加就行了。

def summarize(text, n):sents = sent_tokenize(text)assert n <= len(sents)word_sent = [word_tokenize(s.lower()) for s in sents]freq = compute_frequencies(word_sent)ranking = defaultdict(int)for i, word in enumerate(word_sent):for w in word:if w in freq:ranking[i] += freq[w]sents_idx = rank(ranking, n)return [sents[j] for j in sents_idx]

 二、TextRank 算法

1.项目概述及项目构思

PageRank 算法

PageRank 是根据网页之间相互的超链接计算网页重要性 的技术,是 Google 的创始人拉里 · 佩奇和谢尔盖 · 布林于 1998 年在斯坦福大学发明了这项技术。

于是我们就可以列出一张邻接矩阵来描述推荐出去 (Out) 的箭头,别的界面推荐进来 (In) 的箭头。形成一个邻接矩阵。每一代表的是你推荐的页面 (Out) 。如 A 列,代表的就是 A 推荐的页面。如表格所描述的,A 谁也没有推荐。每一代表的是谁推荐了你 (In)。如 A 行,代表的就是推荐 A 的页面。如表格所描述的,D 推荐了 A。有了这张邻接矩阵作为基础,我们就能够计算 PageRank 的核心:每一个页面的分数 S

                                        𝑆(𝑉𝑖)=(1−𝑑)+𝑑∗∑𝑗∈In(𝑉𝑖)1lout(𝑉𝑗)|𝑆(𝑉𝑗)

我们会发现,每一个页面的分数 𝑆(𝑉𝑖)都是依赖于别的页面的分数 𝑆(𝑉𝑗)的。我们需要对每个页面的分数进行初始化。

就这样一步一步算出每一个顶点的值,然后接着从 𝐴页面开始继续算,一遍一遍迭代,直到每个页面的分数都不再变化为止。这样,我们就得到了每一个页面的评分 𝑆 。

当我们把 PageRank 应用到我们的文本当中去的时候,我们首先会发现的问题是,句子和句子之间 如何相互 “推荐”?

                         𝑆𝑖𝑚𝑖𝑙𝑎𝑟𝑖𝑡𝑦(𝑆𝑖,𝑆𝑗)=||{𝑤𝑘|𝑤𝑘∈𝑆𝑖&𝑤𝑘∈𝑆𝑗}||log(|𝑆𝑖|)+log(||𝑆𝑗||)

相当于是在求两个句子之间的相似度,也就是推荐程度。根据推荐程度便可以列出一张邻接矩阵。

在此基础上,我们可以应用新的 PageRank 算法来完成分数的计算

                        𝑊𝑆(𝑉𝑖)=(1−𝑑)+𝑑∗∑𝑉𝑗∈In(𝑉𝑖)𝑤𝑗𝑖∑𝑉𝑘∈𝑂𝑢𝑡(𝑉𝑗)𝑤𝑗𝑘𝑊𝑆(𝑉𝑗)

至此我们进一步迭代,计算出第二句和第三句的 分数 ,然后继续从第一句开始计算。直到最终每一句的分数不再变化为止。

3.项目技术栈

from nltk.tokenize import sent_tokenize, word_tokenize
from nltk.corpus import stopwords
import math
from itertools import product, count
from string import punctuation
from heapq import nlargest

4.思路

计算相似性

def calculate_similarity(sen1, sen2): counter = 0for word in sen1: if word in sen2: counter += 1return counter / (math.log(len(sen1)) + math.log(len(sen2)))

创建相似度邻接矩阵

def create_graph(word_sent): num = len(word_sent)board = [[0.0 for _ in range(num)] for _ in range(num)]for i,j in product(range(num), repeat = 2): if i != j:board[i][j] = calculate_similarity(word_sent[i], word_sent[j])return board

根据 PageRank 算法,算出句子分数

def weighted_pagerank(weight_graph): scores = [0.5 for _ in range(len(weight_graph))]old_scores = [0.0 for _ in range(len(weight_graph))]while different(scores, old_scores): for i in range(len(weight_graph)): old_scores[i] = scores[i]for i in range(len(weight_graph)): scores[i] = calculate_score(weight_graph, scores, i)return scoresdef different(scores, old_scores): flag = Falsefor i in range(len(scores)): if math.fabs(scores[i] - old_scores[i]) >= 0.0001: flag = Truebreakreturn flagdef calculate_score(weight_graph, scores, i):length = len(weight_graph)d = 0.85added_score = 0.0for j in range(length):fraction = 0.0denominator = 0.0fraction = weight_graph[j][i] * scores[j]for k in range(length):denominator += weight_graph[j][k]added_score += fraction / denominatorweighted_score = (1 - d) + d * added_scorereturn weighted_score

 找出分数最高的两个句子

def Summarize(text,n):sents = sent_tokenize(text)word_sent = [word_tokenize(s.lower()) for s in sents]for i in range(len(word_sent)):for word in word_sent[i]:if word in stopwords:word_sent[i].remove(word)similarity_graph = create_graph(word_sent)scores = weighted_pagerank(similarity_graph)sent_selected = nlargest(n, zip(scores, count()))sent_index = []for i in range(n):sent_index.append(sent_selected[i][1])return [sents[i] for i in sent_index]

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/631126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据黑市:数字时代的黑暗面

在当今数字时代&#xff0c;我们的个人信息已经成为一种宝贵的资源。然而&#xff0c;令人担忧的是&#xff0c;一个隐藏在网络深处的数据黑市正在悄悄兴起。在这个市场中&#xff0c;我们的个人数据被无情地售卖&#xff0c;包括我们的姓名、地址、电话号码、电子邮件地址&…

【萤火虫系列教程】3/5-Adobe Firefly 创意填充

003-Adobe Firefly 创意填充 创意填充 登录账号后&#xff0c;在主页点击创意填充的【生成】按钮&#xff0c;进入到创意填充页面 我们可以上传自己的图像 一键抠图 点击【背景】就可以把主图抠出来 点击【反转】就可以把背景抠出来 点击【清除】就可以恢复到图片原来…

表的增删改查 进阶(一)

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;MySql&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 数据库约束 约束类型 NOT NUll 约束 UNIQUE 约束 D…

K8S对外服务ingress

Sevice作用体现在两个方面 集群内部 不断跟踪pod的变化&#xff0c;更新endpoint中的pod对象&#xff0c;基于pod的ip地址不断发现的一种服务发现机制 集群外部 类似负载均衡器&#xff0c;把流量&#xff08;ip端口&#xff09;&#xff0c;不涉及转发url&#xff08;http ht…

STM32WLE5JC介绍

32位 ARM Cotrex-M4 CPU 32MHz晶体振荡器 32 kHz RTC振荡器与校准 20x32位备份寄存器 引导程序支持USART和SPI接口 介绍 STM32WLE5/E4xx远程无线和超低功耗器件嵌入了强大的超低功耗LPWAN兼容无线电解决方案&#xff0c;支持以下调制&#xff1a;LoRa&#xff0c;&#xff08…

设计模式-简单工厂

设计模式-简单工厂 简单工厂模式是一个集中管理对象创建&#xff0c;并根据条件生成所需类型对象的设计模式&#xff0c;有助于提高代码的复用性和维护性&#xff0c;但可能会导致工厂类过于复杂且违反开闭原则。 抽象提取理论&#xff1a; 封装对象创建过程解耦客户端与产品…

读书笔记-《数据结构与算法》-摘要8[桶排序]

桶排序和归并排序有那么点点类似&#xff0c;也使用了归并的思想。大致步骤如下&#xff1a; 设置一个定量的数组当作空桶。Divide - 从待排序数组中取出元素&#xff0c;将元素按照一定的规则塞进对应的桶子去。对每个非空桶进行排序&#xff0c;通常可在塞元素入桶时进行插入…

JAVA SECS发送Report C#处理SECS Report SECS发送事件资料大全 S6F11 建立通讯S1F13

发送S6F11非常简单&#xff0c;只需5~6行代码&#xff0c;最核心是代码清晰易懂。 任何人都可以一看就能上手&#xff0c;如果说用代码可读性作为不可替代性的壁垒就无话可说了。 private void buttonS6F11_Click(object sender, EventArgs e) {int nTransaction 0;// 数据部…

数据守护盾牌:敏感数据扫描与脱敏,让安全合规无忧

前言 在信息时代&#xff0c;数据已经成为企业和组织的核心资产&#xff0c;其价值与日俱增。然而&#xff0c;随着数据使用的普及和复杂度的提升&#xff0c;数据安全与合规问题也变得越来越突出。敏感数据的保护显得尤为重要&#xff0c;因为这些数据一旦泄露或被不当使用&a…

华为HCIE课堂笔记第十六章 Qos基本原理

第十六章 Qos基本原理 16.1 Qos背景 Qos&#xff1a;在带宽有限的情况下&#xff0c;为不同的业务需求&#xff0c;提供不同的网络的服务质量。 影响Qos的不同的因素&#xff1a; 带宽&#xff0c;链路在单位时间可以传输数据的bit数量&#xff0c;单位bps 一般上传下载速…

【高危】Google Chrome V8 < 120.0.6099.224 越界内存访问漏洞

漏洞描述 Google Chrome V8 是一个由Google开发的开源JavaScript引擎&#xff0c;用于Google Chrome及Chromium中。 Google Chrome 120.0.6099.224版本之前中&#xff0c;当通过runtime-object.cc的DeleteObjectPropertyFast删除对象属性时&#xff0c;可能未能正确处理内存或…

前端注释规范

编写代码注释的最佳实践 好的注释可以提高代码的可读性和可维护性&#xff0c;从而提高代码质量。 作为研发同学&#xff0c;对于代码“注释”其实并不陌生。它往往作为我们代码文档的特殊补充而存在。 提倡加注释&#xff0c;但不能滥用。我们开发流程中会有Code Review过程&a…

文件操作解析(一)

前言 很多非计科的专业并未对文件操作这点做出详细解释&#xff0c;今天复习到这里就想趁此机会记录一下自己学到的知识&#xff0c;也希望能对大家有所帮助。 一.为什么使用文件 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的 内存中&#xff0c; 如果程序退出…

selinux简介

Selinux使用详解 注&#xff1a;redhat selinux使用说明文档&#xff1a;使用 SELinux Red Hat Enterprise Linux 8 | Red Hat Customer Portal 1、说明 selinux&#xff08;security enhanced linux安全性增强的linux&#xff09; 由美国安全局nsa&#xff08;national se…

电脑屏幕横过来了怎么恢复?这4个方法好用又简单!

“我在用电脑的时候不知道为什么&#xff0c;电脑屏幕一整个都横过来了。导致我无法正常使用电脑&#xff0c;应该怎么解决这个问题呢&#xff1f;希望大家帮我出出主意&#xff01;” 在现代社会中&#xff0c;电脑已经成为了我们工作、学习和生活中不可或缺的工具。然而&…

搭建开源数据库中间件MyCat2-配置mysql数据库双主双从

mycat2官网&#xff1a;MyCat2 前言&#xff1a;mycat2下载地址无法访问&#xff0c;不知道是不是被DNS污染了&#xff0c;还是需要搭梯子访问&#xff0c;所以我只能找到1.21的版本进行安装。搭建mycat2的前提是搭建数据库主从复制。 架构&#xff1a;双主双从 配置&#xf…

[EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 Acer Aspire A515-54g 处理器 Intel i5 10210U 已驱动内存16 Gb DDR4 2400 Mhz已驱动硬盘Samsung 970 Pro 512Gb已驱动显卡Intel UHD Graphics 630已驱动声卡Realtek ALC255已驱动网卡RTL8111已驱动无线网卡蓝牙Intel AC 9462已驱动 支持系统版本 macos H…

汽车芯片「新变量」

编者按&#xff1a;汽车行业的格局重构和技术革新&#xff0c;也在推动芯片赛道进入变革周期。不同商业模式的博弈&#xff0c;持续升温。 对于智能汽车来说&#xff0c;过去几年经历了多轮硬件和软件的性能迭代&#xff0c;甚至是革新&#xff0c;如今&#xff0c;市场正在进…

云原生场景下,AIGC 模型服务的工程挑战和应对

作者&#xff1a;徐之浩、车漾 “成本”、“性能”和 “效率”正在成为影响大模型生产和应用的三个核心因素&#xff0c;也是企业基础设施在面临生产、使用大模型时的全新挑战。AI 领域的快速发展不仅需要算法的突破&#xff0c;也需要工程的创新。 大模型推理对基础设施带来…

测试开发(5)测试分类标准 :按测试对像划分、按是否查看代码划分、按开发阶段划分、按测试实施组织、按是否运行划分、按是否手工划分、按测试地域划分

接上次博客&#xff1a; 测试开发&#xff08;4&#xff09;测试用例基本要素、好处、测试用例设计方法 &#xff1a;基于需求进行测试用例的设计&#xff1b;具体的设计方法【等价类、边界值、错误猜测法、场景设计法、因果图/测试表法、正交排列】、万能公式、有效性、粒度和…