前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自动文本摘要

自动文本摘要

作者头像
AI研习社
发布于 2018-11-30 07:13:44
发布于 2018-11-30 07:13:44
1.9K00
代码可运行
举报
文章被收录于专栏:AI研习社AI研习社
运行总次数:0
代码可运行

本文为 AI 研习社编译的技术博客,原标题 : Text Summarization 翻译 | 机智的工人、乔叔叔 校对 | 志豪 整理 | 菠萝妹 原文链接: https://towardsdatascience.com/text-summarization-96079bf23e83

文本摘要

之前写过另一篇文章。现在,我将介绍一下如何做文本摘要。

读完这篇文章,你将学到

  • 什么是文本摘要
  • 如何从网上提取数据
  • 如何清洗数据
  • 如何搭建直方图
  • 怎么给句子打分
  • 如何抽取最重要的句子/或者做简单摘要

在这之前,我建议大家学习并熟悉以下内容

什么是文本摘要

文本摘要 是一种缩短文档的过程,这是为了对原始文档的要点进行总结。

摘要的主要思想是找到包含整个集合的“信息”的数据子集。这种技术在今天的工业中被广泛使用。搜索引擎就是一个例子;其他的例子包括文档、图像集合和视频的汇总。文档摘要试图通过寻找信息最丰富的句子,对整个文档进行有代表性的总结或抽象,而在图像摘要中,系统会找到最具代表性和最重要的(或最显著的)图像来做代表。对于监控视频,则会从平平无奇的环境中提取出重要的事件。

自动摘要一般有两种方法: 提取与抽象。更多内容请参考维基。

如何从网页中抽取数据?

步骤1:导入相关库/包

  • Beautiful Soup(bs)是一个能从HTML和XML文件中抽出数据的Python库。结合你喜欢的解析器,它提供了一个符合语言习惯的方式来进行浏览、搜索与修改解析树。通常它能为程序员节省几小时甚至几天的工作。
  • Urllib是一个程序包,里面含有处理URL的多个模块:

urllib.request 用来打开和读取URL

urllib.error 包含了由urllib.request抛出的各种异常处理

urllib.parse 用来解析URL

urllib.robotparser 用来解析 robots.txt 文件(Robots协议文件或爬虫协议文件)

  • re 这个模块提供了各种正则表达式匹配操作,与Perl中的类似。
  • nltk是一个基于Python的类库,是一个领先的自然语言处理的编程与开发平台。它为50多个语料和词库资源提供了易用的交互接口,比如WordNet。它同时也提供了一整套来对文本进行分类、分词、词干提取、标签化、解析、语义推理的文本处理库,以及工业级NLP库的各种封装。
  • heapq 这个模块提供了堆队列算法(也就是优先队列算法)的一种实现。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import bs4 as bs
import urllib.request
import re
import nltk
import heapq

注意检查停用词(stopword) 和文本分割器(punkt) 是不是最新的!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nltk.download('stopwords')
nltk.download('punkt')

图1

步骤2:抽取数据

我选取的是Artificial Neural Network (人工神经网络)这个维基页来进行我的工作的。根据你的需要,你可以选取任何一篇文章。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
page = urllib.request.urlopen("https://en.wikipedia.org/wiki/Artificial_neural_network").read()
soup = bs.BeautifulSoup(page,'lxml')
print(page)     #print the page

图2

你可以看到我们将网页内容抽取下来了,但是它看上去很乱。我们可以用BeautifulSoup库来解析文档并且用一种漂亮的方式来抽取文本。我也利用prettify功能让各种语法看上去更好一些。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(soup.prettify)

图3

注意:大多数维基文章的内容是写在标签下面的,但是在这点上,不同的网站有不同处理,例如,一些网站就是将网页内容写在< div >标签下面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
text = ""
for paragraph in soup.find_all('p'):
    text += paragraph.text
print(text)

图4

步骤3:数据清洗

数据清洗是在记录集、数据表、数据库中监测并纠正(或说去除)损坏或者不准确数据的一个过程。它是指找出不完整、不正确、不准确或者不相关的部分数据,然后进行替换、修改或者删除这些脏数据或者不合格数据。

行1:我试图去除文本中类似于[1],[2] 样子的上标索引(请看上面的文本输出)。

行2:我去除了所有额外的空格,只留下必要的一个空格。

行3: 转换成小写字母。

行4,5,6: 我去除了所有额外的标点符号、数字、额外的空格。

行7:利用sent_tokenize()将大段文本分割成了一个个句子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
text = re.sub(r'\[[0-9]*\]',' ',text)            
text = re.sub(r'\s+',' ',text)    
clean_text = text.lower()
clean_text = re.sub(r'\W',' ',clean_text)
clean_text = re.sub(r'\d',' ',clean_text)
clean_text = re.sub(r'\s+',' ',clean_text)
sentences = nltk.sent_tokenize(text)
stop_words = nltk.corpus.stopwords.words('english')
print(sentences)    

图5(Tokennization分割后的输出)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stop_words  #list

图 6(停用词列表)

步骤4:建立直方图

行1: 创建一个空的字典word2count

行2:利用for循环并利用word_tokenize方法将clean _text分割成多个词并放入word变量中。

行3:检查某个词word是否“没有出现在”停用词stop_words列表中。然后再判断该词是否“没有在”字典的键值中1,否则就在字典中将该词的计数加1。

行4: 计算每个直方的权重(请看输出,你就可以看到这些权重并不是简单计数,比如‘artificial’:0.3620689)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
word2count = {}  #line 1
for word in nltk.word_tokenize(clean_text):     #line 2
    if word not in stop_words:                  #line 3
        if word not in word2count.keys():
            word2count[word]=1
        else:
            word2count[word]+=1
for key in word2count.keys():                   #line 4
    word2count[key]=word2count[key]/max(word2count.values())

图7

步骤5: 计算句子分值

行1: 创建一个空的字典sent2score。

行2:利用for循环将一个个句子从sentence列表中放入sentence变量汇总(在步骤3,我们创建了sentences列表)

行3:转换为小写字母并将句子分割成词,放入word变量中。

行4: 利用if条件判断word是否在字典word2count的键值中word2count.keys()。

行5: 我在这里将长度设定为小于30,你可以根据需要设定为其它值。

行6: 进一步利用if-else进行条件判断,如果sentence句子“不在”字典sent2score的键值中,就将该句子作为键key放入字典sent2score并将值value置为word2count字典中该词的计数。否则就将该句对应的键值(即句子的分值)加1。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Calculate the score

         

sent2score = {}

for sentence in sentences:

    for word in nltk.word_tokenize(sentence.lower()):

        if word in word2count.keys():

            if len(sentence.split(' '))<30:

                if sentence not in sent2score.keys():

                     sent2score[sentence]=word2count[word]

                else:

                    sent2score[sentence]+=word2count[word]

请看句子的分值

图8

如何只抽取分值最高的几个句子 短摘要

步骤6:找出最适合的句子

我利用heapq包来找出了7个最适合的句子来作为维基的这篇ANN文章的摘要。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
best_sentences = heapq.nlargest(7,sent2score,key=sent2score.get)

for sentences in best_sentences:

    print(sentences,'\n')

最适合的7个句子作为人工神经网络的摘要。

今天就到这里吧。源代码在Github上找到,也非常高兴能够听到任何问题或反馈。

希望你能喜欢这篇文章,不要忘记给这篇文章点赞并分享给他人。

想要继续查看该篇文章相关链接和参考文献?

戳链接:

http://ai.yanxishe.com/page/TextTranslation/1071

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Visual Studio 调试系列2 基本调试方法
在 Visual Studio 上下文中,当调试应用时,这通常意味着你在附加了调试器的情况下(即在调试器模式下)运行应用程序。 执行此操作时,调试器在运行过程中可提供许多方法让你查看代码的情况。 你可以逐步执行代码、查看变量中存储的值、设置对变量的监视以查看值何时改变、检查代码的执行路径等。
张传宁IT讲堂
2019/09/17
4.7K0
Visual Studio 调试系列2 基本调试方法
chrome调试JavaScript脚本
随着 JavaScript 应用的复杂性逐渐提高,开发者需要有力的调试工具来帮助他们快速发现问题的原因,并且能高效地修复它。Chrome DevTools 提供了一系列实用的工具使得调试 JavaScript 应用不再是一件痛苦的事。
空空云
2018/09/27
1.9K0
chrome调试JavaScript脚本
学了一年的Android,还不会调试?你白学了!
本文原创首发CSDN,本文链接 https://blog.csdn.net/qq_41464123/article/details/107141182,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本链接,尤其是脚本之家、码神岛等平台,谢谢配合。
Designer 小郑
2023/08/01
3840
学了一年的Android,还不会调试?你白学了!
使用Firefox轻松调试JS
Firefox调试JS的功能真的很不错,推荐一下! 在页面上点击右键,再点击“查看元素”,如图:
PM吃瓜
2019/08/12
6.3K0
使用Firefox轻松调试JS
使用 Chrome Devtools 调试您的 Node.js 程序
俗话说:“工欲善其事,必先利其器”,调试是每一个开发人员都要遇到的问题,选择一个合适的调试工具也尤为重要。 在 Node.js 开发过程中除了万能的 console.log 之外,本节介绍一个 Node.js 与 Chrome Devtools 结合的调试工具,以后你可以选择使用浏览器来调试 Node.js 应用程序了。
五月君
2020/12/30
3.3K0
使用 Chrome Devtools 调试您的 Node.js 程序
小程序环境搭建与开发工具的简单介绍
和其他产品的开发一样,开发小程序也需要搭建相应的环境,小程序的开发环境很简单,下载个开发工具就可以了。微信官方提供了一个小程序的开发者工具,可以在官网下载到。 官网下载地址: https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html
端碗吹水
2020/09/23
1.7K0
小程序环境搭建与开发工具的简单介绍
JavaScript 逆向爬虫中的浏览器调试常见技巧
这是「进击的Coder」的第 592 篇技术分享 作者:崔庆才 “注:本文来自《Python3网络爬虫开发实战(第二版)》一书。 ” 现在越来越多的网站也已经应用了这些技术对其数据接口进行了保护,在做爬虫时如果我们遇到了这种情况,我们可能就不得不硬着头皮来去想方设法找出其中隐含的关键逻辑了,这个过程我们可以称之为 JavaScript 逆向。 既然我们要做 JavaScript 逆向,那少不了要用到浏览器的开发者工具,因为网页是在浏览器中加载的,所以多数的调试过程也是在浏览器中完成的。 工欲善其事,必先利
崔庆才
2022/03/21
2.4K1
待补充 | ​Chrome调试工具常用功能整理
windows: ctrl + shift + i mac: cmd + opt + i
咸鱼学Python
2019/08/13
1K0
javascript断点调试
打开chrome,找到Sources,在一堆的文件夹里面找到你要调试的js文件,打开它:
全栈程序员站长
2022/08/31
3.1K0
javascript断点调试
急速 debug 实战一(浏览器-基础篇)
工欲善其事,必先利其器。最近在写代码的时候越发觉得不是代码有多难,而是当代码出了问题该如何调试,如何追溯本源,这才是最难的。
秋风的笔记
2020/10/27
3.5K0
急速 debug 实战一(浏览器-基础篇)
pycharm的调试功能_pycharm运行调试配置
Debug调试,是对于学习编程人员来说是一项重要的技能。只有当你学会 debug 了以后,才可以正确的知道程序的走向流程是如何的,DEBUG是排除程序故障的意思。debug 则是通过工具来对代码进行调试,进而一步步找出程序中出现 bug 的位置,也就是程序中具体错误代码的位置。
全栈程序员站长
2022/09/25
2.2K0
pycharm的调试功能_pycharm运行调试配置
如何用7个简单的步骤,在Firefox开发工具中调试JavaScript
本文将着重于在Firefox的开发工具中调试JavaScript代码。Firefox中的开发工具是一个非常强大的工具,可以加速您的bug查找和修复过程!
程序你好
2018/07/23
4.4K0
【实践】Chrome浏览器客户端调试从入门到奔溃
不懂CHROME前端调试工具,遇到问题就叽叽喳喳问前端,显得很不专业。辉哥利用五一节日,补补功课,引用相关优质文章,把Chrome浏览器客户端调试的方法详细讲解一遍。
辉哥
2019/05/14
3.9K0
【实践】Chrome浏览器客户端调试从入门到奔溃
Pycharm Debug调试python程序
若函数A内存在子函数a时,不会进入子函数a内执行单步调试,而是把子函数a当作一个整体,一步执行。
全栈程序员站长
2022/11/17
9200
Pycharm Debug调试python程序
1.1 熟悉x64dbg调试器
x64dbg 是一款开源、免费、功能强大的动态反汇编调试器,它能够在Windows平台上进行应用程序的反汇编、调试和分析工作。与传统的调试器如Ollydbg相比,x64dbg调试器的出现填补了Ollydbg等传统调试器的不足,为反汇编调试工作提供了更高效、更可靠的解决方案。正是因为有了这些优点,才能使其成为当今最受欢迎的反汇编调试软件之一。
王瑞MVP
2023/07/06
6970
1.1 熟悉x64dbg调试器
你还在用 console.log 调试 ?
链接 | juejin.im/post/5d18d6eb6fb9a07edc0b6cc4
JavaFish
2020/03/05
1.7K0
程序断点
程序断点是指由于有特殊事件(中断事件)发生,计算机暂停当前的任务(即程序),转而去执行另外的任务(中断服务程序),然后再返回原先的任务继续执行。所谓断点就是程序被中断的地方,这个词对于解密者来说是再熟悉不过了。那么什么又是中断呢?中断就是由于有特殊事件(中断事件)发生,计算机暂停当前的任务(即程序),转而去执行另外的任务(中断服务程序),然后再返回原先的任务继续执行。打个比方:你正在上班,突然有同学打电话告诉你他从外地坐火车过来,要你去火车站接他。然后你就向老板临时请假,赶往火车站去接同学,接着将他安顿好,随后你又返回公司继续上班,这就是一个中断过程。我们解密的过程就是等到程序去获取我们输入的注册码并准备和正确的注册码相比较的时候将它中断下来,然后我们通过分析程序,找到正确的注册码。所以我们需要为被解密的程序设置断点,在适当的时候切入程序内部,追踪到程序的注册码,从而达到crack的目的。
狼啸风云
2019/10/22
2.3K0
程序断点
调试程序时,断点是如何工作的?
断点是程序执行时的一个标记点,当程序运行到这个标记时,会暂停执行,控制权交给调试工具。
不脱发的程序猿
2024/12/30
2070
调试程序时,断点是如何工作的?
「小程序JAVA实战」 小程序远程调试(九)
PS:最后想到了什么老铁,可以查看远端的代码是不是就可以获取到借鉴他的代码了。其实微信早就想到了,不是所有的都可以的。远端调试必须知道他的APPID的,不是说直接看就可以了。
IT架构圈
2018/12/18
1.1K0
新手向:前端程序员必学基本技能——调试JS代码
VSCode 调试 JS 的方法有很多,目前比较推荐的就是无需配置的 auto-attach。
若川
2021/11/18
7990
新手向:前端程序员必学基本技能——调试JS代码
相关推荐
Visual Studio 调试系列2 基本调试方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档