在当今互联网上,存在着海量的内容和网站。从这些内容中提取特定主题的信息变得非常困难,尤其是对于文本摘要项目来说。虽然谷歌会过滤搜索结果并给出前十个搜索结果,但往往无法找到需要的正确内容。文章中存在大量的冗余和重叠数据,导致大量时间的浪费。更好的方法是将大量可用的文本数据总结成更小的尺寸。
文本摘要是一种自然语言处理(NLP)技术,它从大量数据中提取文本。它之所以重要,是因为它减少了阅读时间,帮助更好地进行研究工作,并增加了可以在一个区域内容纳的信息量。文本摘要有两种方法:基于NLP的技术方法和深度学习方法。本文将介绍一种基于NLP的技术,该技术将使用NLTK库。
文本摘要的步骤包括获取数据、文本预处理、将段落转换为句子、标记句子、找到出现频率的权重、用句子中的权重替换单词、按权重降序排序句子。最后,通过这些步骤,可以对文章进行摘要。
如果想对维基百科上的文章进行摘要,需要获取想要摘要的文章的URL。将使用Web scraping的概念从URL获取数据。要使用Web scraping,需要在Python中安装beautifulsoup库。这个库将用于获取网页上的各种HTML标签内的数据。
pip install beautifulsoup4
为了解析HTML标签,还需要一个解析器,即lxml包:
pip install lxml
将尝试对维基百科上的强化学习页面进行摘要。以下是通过Web scraping获取数据的Python代码:
from bs4 import BeautifulSoup
import urllib.request
import re
from urllib.request import urlopen
# 导入所需的Web scraping库
# urllib包用于解析URL
# re是用于文本预处理的正则表达式库
# urlopen函数用于抓取数据
# read()读取URL上的数据
# 接下来,将使用BeautifulSoup对象和lxml解析器解析数据
# 在维基百科文章中,文本位于标签内
# 因此使用find_all函数检索所有包含在
标签内的文本
在抓取数据后,需要对提取的文本进行数据预处理。
首先,需要移除维基百科文章中所有的参考资料。这些参考资料都被方括号包围。以下代码将移除方括号并将它们替换为空格。
article_text = re.sub(r'[[0-9]*]', ' ', article_text)
article_text = re.sub(r's+', ' ', article_text)
article_text将包含没有方括号的文本,即原始文本。不移除任何其他单词或标点符号,因为将直接使用它们来创建摘要。执行以下代码以创建加权频率并清理文本:
formatted_article_text = re.sub('[^a-zA-Z]', ' ', article_text )
formatted_article_text = re.sub(r's+', ' ', formatted_article_text)
在这里,formatted_article_text包含格式化后的文章。将使用这个对象来计算加权频率,并将加权频率替换为article_text对象中的单词。
句子被分解成单词,这样就有单独的实体。
sentence_list = nltk.sent_tokenize(article_text)
正在标记article_text对象,因为它是未过滤的数据,而formatted_article_text对象已经格式化,没有标点符号等。
stopwords = nltk.corpus.stopwords.words('english')
word_frequencies = {}
for word in nltk.word_tokenize(formatted_article_text):
if word not in stopwords:
if word not in word_frequencies.keys():
word_frequencies[word] = 1
else:
word_frequencies[word] += 1
所有英语的停用词都存储在stopwords变量中。遍历所有句子,检查单词是否是停用词。如果单词不是停用词,那么检查它是否在word_frequencies字典中。如果它不存在,那么将其作为键插入并将其值设置为1。如果它已经存在,只需将其计数增加1。
已经计算了加权频率。现在可以通过为每个单词添加加权频率来计算每个句子的得分。
sentence_scores = {}
for sent in sentence_list:
for word in nltk.word_tokenize(sent.lower()):
if word in word_frequencies.keys():
if len(sent.split(' ')) < 30:
if sent not in sentence_scores.keys():
sentence_scores[sent] = word_frequencies[word]
else:
sentence_scores[sent] += word_frequencies[word]
sentence_scores字典已创建,它将存储句子作为键和它们的出现次数作为值。遍历所有句子,标记句子中的所有单词。如果单词存在于word_frequencies中,并且句子也存在于sentence_scores中,那么将其计数增加1,否则将其作为键插入到sentence_scores中并将其值设置为1。不考虑较长的句子,因此将句子长度设置为30。
sentence_scores字典包含句子及其得分。现在,可以使用前N个句子来形成文章的摘要。在这里,使用heapq库来挑选前7个句子来摘要文章。
import heapq
summary_sentences = heapq.nlargest(7, sentence_scores, key=sentence_scores.get)
summary = ' '.join(summary_sentences)
print(summary)
输出结果将是文章的关键句子,形成文章的摘要。
文章的文本摘要可以通过使用NLTK库和BeautifulSoup库来执行。这可以帮助节省时间。可以进一步使用更高级的深度学习技术来获得更优化的摘要。期待人们使用这种机制进行摘要。
Q1. 文本摘要有不同类型的吗?
有提取式和抽象式文本摘要方法,每种都有独特的压缩文本的方法。