开发者社区> jusun> 正文

【机器学习】机器学习中的文本摘要入门指南

简介: 鱼羊 编译整理 量子位 出品 | 公众号 QbitAI 如果你是科研狗,一定有过被摘要支配的恐惧。 如果你想在浩如烟海的互联网信息里寻找重点,一定想要快速排除多余的内容。 基于机器学习的自动文本摘要工具,将一键解放你的双手,化身抓重点小能手,为你捕捉关键,排除冗余。
+关注继续查看
鱼羊 编译整理 量子位 出品 | 公众号 QbitAI

如果你是科研狗,一定有过被摘要支配的恐惧。

如果你想在浩如烟海的互联网信息里寻找重点,一定想要快速排除多余的内容。

9c1aaf49e9e9566f6424e233b76f7809.jpeg

基于机器学习的自动文本摘要工具,将一键解放你的双手,化身抓重点小能手,为你捕捉关键,排除冗余。

ea5997b99506c1181381ac40650cb9db.jpeg

近日,有位叫Alfrick Opidi的小哥在入门级深度学习云平台FloydHub 上写了一篇关于自动文本摘要的入门教程,量子位对其进行了编译,希望能帮助大家理解。

自动文本摘要属于自然语言处理(NLP)的范畴,通常用机器学习算法来实现,目前实现的方法主要有两种:

抽取式

就像一支荧光笔,抽取式文本摘要就是给原始文本中的重点单词标上高亮,再将其加以组合形成摘要。b64e8400e268fdcaa2e195e18dab04e8.gif

概要式

概要式文本摘要更接近于人类的思维——通过深度学习对原始文本进行释义并提炼主旨,而后形成摘要。相比于抽取式,概要式文本摘要更像在说人话。bef8408a3ea5c30476b56ed52dde5d69.jpeg

很显然概要式的表现会比抽取式更好,然而这种算法需要复杂的深度学习技术和语言模型支撑,还面临这诸如自然语言生成这样的NLP问题。

因此抽取式方法仍然广泛流行。

鉴于本文是一篇入门指南,接下来提到的内容都是基于抽取式方法来实现的。

文本摘要基础步骤

文本摘要是如何实现的呢?

举个例子,用文本摘要机器学习算法来对下面这段文字进行处理:

夜里志明和春娇乘坐出租车去城里聚会。聚会上春娇晕倒并被送进了医院。她被诊断出患有脑损伤,医生告诉志明要一直陪着她直到她好起来。因此,志明待在医院整整陪了她三天。

第一步:把段落转成句子

首先要做的是分割段落。

  1. 夜里志明和春娇乘坐出租车去城里聚会

  2. 聚会上春娇晕倒并被送进了医院

  3. 她被诊断出患有脑损伤,医生告诉志明要一直陪着她直到她好起来

  4. 因此,志明待在医院整整陪了她三天

第二步:文本处理

接下来,删掉没什么意义的连接词、数字、标点。

就像这样:

  1. 夜里志明春娇乘坐出租车去城里聚会

  2. 聚会春娇晕倒送医院

  3. 诊断脑损伤医生告诉志明陪着好起来

  4. 志明待在医院天

第三步:标注

然后,对句子进行标记,获得句子中的所有单词:

[‘志明’,‘春娇’,‘乘坐’,‘出租车’,‘去’,‘夜里’,‘聚会’,‘城里‘,‘聚会’,‘春娇’,‘晕倒’,‘医院’,‘诊断’,‘脑’,‘损伤’,‘医生’,‘告诉’,‘志明’,‘陪’,‘好起来’,‘志明’,‘待’,‘医院’,‘天’]

第四步:评估单词的加权出现频率

现在就可以计算单词们的加权出现频率了。

计算公式是:单词加权出现频率 = 单词出现次数 / 段落中最常用单词出现次数

第五步:用加权频率替换单词

把句子中的每个单词都替换成加权频率,就可以计算这个句子的权重。比如在志明和春娇这个例子当中,第一句在整个段落中的权重是最大的,那么它就将构成摘要的主体部分。

以上是机器学习实现文本摘要的基本步骤,下面我们来看看如何在真实世界中构建摘要生成器。

亲手构建摘要生成器

使用Python的 NLTK 工具包,我们可以亲自动手创造一个文本摘要生成器,实现对Web文章的摘要生成。

来看看代码蓝图:

1# Creating a dictionary for the word frequency table

2frequency_table = _create_dictionary_table(article) 3 4# Tokenizing the sentences 5sentences = sent_tokenize(article) 6 7# Algorithm for scoring a sentence by its words 8sentence_scores = _calculate_sentence_scores(sentences, frequency_table) 910# Getting the threshold11threshold = _calculate_average_score(sentence_scores)1213# Producing the summary14article_summary = _get_article_summary(sentences, sentence_scores, 1.5 * threshold)1516print(article_summary)

第一步:准备数据

这里使用了Beautiful Soup库。

1import bs4 as BeautifulSoup

2import urllib.request   3 4# Fetching the content from the URL 5fetched_data = urllib.request.urlopen('https://en.wikipedia.org/wiki/20th_century') 6 7article_read = fetched_data.read() 8 9# Parsing the URL content and storing in a variable10article_parsed = BeautifulSoup.BeautifulSoup(article_read,'html.parser')1112# Returning 

 tags

13paragraphs = article_parsed.find_all('p')1415article_content = ''1617# Looping through the paragraphs and adding them to the variable18for p in paragraphs:  19    article_content += p.text

使用urllib.request实现网页数据的抓取,再调用BeautifulSoup来解析网页数据。

第二步:数据处理

为确保抓取到的文本数据尽可能没有噪音,需要做一些基本的文本清理。这里使用了 NLTK 的 stopwords PorterStemmer 

PorterStemmer可以将单词还原为词根形式,就是说能把 cleaning, cleaned, cleaner 都还原成 clean。

此外还要创建一个字典,来存储文本中每一个单词的出现频率。

循环整个文本来消除 “a”、“the” 这样的停止词,并记录单词们的出现频率。

1from nltk.corpus import stopwords

2from nltk.stem import PorterStemmer 3def _create_dictionary_table(text_string) -> dict: 4 5    # Removing stop words 6    stop_words = set(stopwords.words("english")) 7 8    words = word_tokenize(text_string) 910    # Reducing words to their root form11    stem = PorterStemmer()1213    # Creating dictionary for the word frequency table14    frequency_table = dict()15    for wd in words:16        wd = stem.stem(wd)17        if wd in stop_words:18            continue19        if wd in frequency_table:20            frequency_table[wd] += 121        else:22            frequency_table[wd] = 12324    return frequency_table

第三步:将文章标注成句子

1from nltk.tokenize import word_tokenize, sent_tokenize

23sentences = sent_tokenize(article)

第四步:计算句子的权重

句子的权重取决于它包含的单词的出现频率。

1def _calculate_sentence_scores(sentences, frequency_table) -> dict:   

2 3    # Algorithm for scoring a sentence by its words 4    sentence_weight = dict() 5 6    for sentence in sentences: 7        sentence_wordcount = (len(word_tokenize(sentence))) 8        sentence_wordcount_without_stop_words = 0 9        for word_weight in frequency_table:10            if word_weight in sentence.lower():11                sentence_wordcount_without_stop_words += 112                if sentence[:7in sentence_weight:13                    sentence_weight[sentence[:7]] += frequency_table[word_weight]14                else:15                    sentence_weight[sentence[:7]] = frequency_table[word_weight]1617        sentence_weight[sentence[:7]] = sentence_weight[sentence[:7]] /        sentence_wordcount_without_stop_words1819    return sentence_weight

需要注意的是,长句有可能得到不必要的高分,为了避免这一点,要将 句子的总分数除以该句的单词数 

第五步:计算句子的阈值

为了进一步优化结果,要计算句子的平均分数。使用此阈值,可以避免分数较低的句子的干扰。

1def _calculate_average_score(sentence_weight) -> int:

2 3    # Calculating the average score for the sentences 4    sum_values = 0 5    for entry in sentence_weight: 6        sum_values += sentence_weight[entry] 7 8    # Getting sentence average value from source text 9    average_score = (sum_values / len(sentence_weight))1011    return average_score

如果感兴趣,FloydHub提供了进行深度学习模型训练的环境,你可以在FloydHub Notebook上运行整个代码。

还可以更上档次

以上只是机器学习中文本摘要算法的入门小知识,想要达到更上档次的效果,甚至可以把抽取式方法和概要式方法结合起来。

113bbacd7aa0ee7aecde07a6ce7f0a5c.gif

△ 图片来自Taming Recurrent Neural Networks for Better Summarization

传送门

如果还想更深入地了解机器学习中的文本摘要,不妨看看以下资源。

WikiHow,一个大规模、高质量的文本摘要数据集:

https://www.wikihow.com/Main-Page

WikiHow食用指南:

https://arxiv.org/pdf/1810.09305.pdf

用指针生成网络(Pointer-Generator Networks)实现文本摘要:

https://arxiv.org/pdf/1704.04368.pdf http://www.abigailsee.com/2017/04/16/taming-rnns-for-better-summarization.html

如何在文本摘要中使用基于预训练的编码器-解码器框架:

https://arxiv.org/pdf/1902.09243.pdf

原文链接:

https://blog.floydhub.com/gentle-introduction-to-text-summarization-in-machine-learning/

本来转自商业新知网

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
28078 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20155 0
机器学习自学指南
事实上有许多的途径可以了解机器学习,也有许多的资源例如书籍、公开课等可为所用,一些相关的比赛和工具也是你了解这个领域的好帮手。本文我将围绕这个话题,给出一些总结性的认识,并为你由程序员到机器学习高手的蜕变旅程中提供一些学习指引。
49 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23538 0
Kaggle 机器学习
Kaggle 入门 2016 年 7 月 21 日, 数据科学家 Abhishek Thakur 在 Linkedin 发表了一篇文章 Approaching (Almost) Any Machine Learning Problem. 该篇文章介绍他建立的一个自动的机器学习框架, 几乎可以解决任何机器学习问题, 项目很快也会发布出来. 这篇文章迅速火遍 Kaggle,他参加过 100 多个数据科学相关的竞赛, 积累了很多宝贵的经验. 以下是对其文章的简要翻译, 并且加入了一些个人理解。
2196 0
一文解析统计学在机器学习中的重要性
本文介绍为什么统计对于通用应用和机器学习如此重要,并大致了解各种可用的方法。
1194 0
【机器学习】机器学习算法总结
       找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大。   纵观IT行业的招聘岗位,机器学习
3787 0
何谓机器学习?
       最近我和一对夫妇共进晚餐,他们问我从事什么职业,我回应道:“机器学习。”妻子回头问丈夫:“亲爱的,什么是机器学习?”她的丈夫答道:“T-800型终结者。”在《终结者》系列电影中,T-800是人工智能技术的反面样板工程。
1042 0
+关注
13
文章
3
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载