自动文本摘要

2018 年 10 月 27 日 AI研习社

本文为 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 这个模块提供了堆队列算法(也就是优先队列算法)的一种实现。

import bs4 as bs
import urllib.request
import re
import nltk
import heapq

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

nltk.download('stopwords')
nltk.download('punkt')



图1


步骤2:抽取数据

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

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功能让各种语法看上去更好一些。

print(soup.prettify)

图3

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

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()将大段文本分割成了一个个句子。

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分割后的输出)


stop_words  #list

图 6(停用词列表)


步骤4:建立直方图

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

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

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

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

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。

# 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文章的摘要。

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


AI研习社每日更新精彩内容,点击文末【阅读原文】即可观看更多精彩内容:

良心推荐:一份 20 周学习计算机科学的经验贴(附资源)

多目标追踪器:用OpenCV实现多目标追踪(C++/Python)

为计算机视觉生成大的、合成的、带标注的、逼真的数据集

悼念保罗·艾伦,除了他科技圈还有哪些大佬值得信仰?

等你来译:

深度网络揭秘之防止过拟合 

有关活动识别的新数据集  

如何开发多步空气污染时间序列预测的自回归预测模型 

用Excel来阐释什么是多层卷积 


号外号外~

想要获取更多AI领域相关学习资源,可以访问AI研习社资源板块下载,

所有资源目前一律限时免费,欢迎大家前往社区资源中心

http://ai.yanxishe.com/page/resources  下载喔~


全球AI+智适应教育峰会

 

免费门票开放申请!

雷锋网联合乂学教育松鼠AI以及IEEE教育工程和自适应教育标准工作组,于11月15日在北京嘉里中心举办全球AI+智适应教育峰会。美国三院院士、机器学习泰斗Michael Jordan、机器学习之父Tom Mitchell已确认出席,带你揭秘AI智适应教育的现在和未来。

扫码免费注册


登录查看更多
21

相关内容

【实用书】Python技术手册,第三版767页pdf
专知会员服务
229+阅读 · 2020年5月21日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
【WWW2020-UIUC】为新闻故事生成具有代表性的标题
专知会员服务
26+阅读 · 2020年3月18日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
173+阅读 · 2020年1月1日
 图像内容自动描述技术综述
专知会员服务
84+阅读 · 2019年11月17日
基于句子嵌入的无监督文本摘要(附代码实现)
【文本摘要】BottleSum——文本摘要论文系列解读
深度学习自然语言处理
10+阅读 · 2019年12月10日
知识图谱的自动构建
DataFunTalk
55+阅读 · 2019年12月9日
面试题:文本摘要中的NLP技术
七月在线实验室
15+阅读 · 2019年5月13日
用深度学习做文本摘要
专知
24+阅读 · 2019年3月30日
文本分析与可视化
Python程序员
8+阅读 · 2019年2月28日
独家 | 基于TextRank算法的文本摘要(附Python代码)
数据派THU
14+阅读 · 2018年12月21日
干货|当深度学习遇见自动文本摘要
全球人工智能
9+阅读 · 2017年7月26日
Arxiv
29+阅读 · 2020年3月16日
Learning in the Frequency Domain
Arxiv
11+阅读 · 2020年3月12日
Arxiv
3+阅读 · 2019年3月1日
Arxiv
3+阅读 · 2018年12月18日
Conditional BERT Contextual Augmentation
Arxiv
8+阅读 · 2018年12月17日
VIP会员
相关VIP内容
相关资讯
基于句子嵌入的无监督文本摘要(附代码实现)
【文本摘要】BottleSum——文本摘要论文系列解读
深度学习自然语言处理
10+阅读 · 2019年12月10日
知识图谱的自动构建
DataFunTalk
55+阅读 · 2019年12月9日
面试题:文本摘要中的NLP技术
七月在线实验室
15+阅读 · 2019年5月13日
用深度学习做文本摘要
专知
24+阅读 · 2019年3月30日
文本分析与可视化
Python程序员
8+阅读 · 2019年2月28日
独家 | 基于TextRank算法的文本摘要(附Python代码)
数据派THU
14+阅读 · 2018年12月21日
干货|当深度学习遇见自动文本摘要
全球人工智能
9+阅读 · 2017年7月26日
相关论文
Top
微信扫码咨询专知VIP会员