使用Python和GloVe词嵌入模型提取新闻和文章的文本摘要

简介: 使用Python和GloVe词嵌入模型提取新闻和文章的文本摘要

文章摘要是一个简短的段落,其中包含要点,并以文章本身使用的词语来表达。通常,我们仅提取那些我们认为最重要的要素/句子,这些要素/句子通常传达主要思想或必要的支撑点。

摘要不是文章的分析,摘要和分析是不同的东西。摘要在很多情况下很有用,例如,获得一篇篇幅较大的文章的要点,用通俗单词介绍一个复杂的想法,从篇幅较大的文章中获得启发等。

image.png

在学术上,提取摘要是一项具有挑战性的任务。值得庆幸的是,机器学习出现了。机器学习的自然语言处理(NLP)模块提供了许多可用于文本摘要的算法。文本摘要有两种主要方法:

创建抽象式摘要:

该技术使用高级的NLP方法来生成摘要,该摘要所使用的单词句子是全新的。这意味着,摘要是用文章中未使用的词创建的。

创建提取式摘要:

在这种技术中,最重要的单词句子被提取出来一起组建一个摘要。显而易见,摘要中使用的单词句子来自文章本身。

在本文中,我们将使用提取技术从大型新闻文章中提取4-5个重要的重要句子构建新闻简报。我们将使用一些流行和有效的策略来处理大量文本并从中提取4-5个有意义的句子。

我们将使用全局向量(也称为GloVe算法),它是单词的向量表示。用外行的话来说,我们将使用GloVe算法生成句子向量,并选择每页排名中最重要的句子。事不宜迟,让我们深入研究代码。我在此练习中使用了python。

处理新闻RSS摘要

我选择研究TimeOfIndia的RSS频道,该公司是印度最受欢迎的新闻服务之一。在本练习中,我选择了新闻的“world”部分。但是代码比较灵活,可以处理各种新闻服务的多个RSS频道。

让我们阅读RSS频道,并将新闻的链接传递到BeautifulSoup进行HTML解析。请注意,这里我仅采用了一个RSS频道,并逐步进行解析。稍后,我将这些步骤结合在一起以完美处理多个频道。

# import basic required libraries
import pandas as pd
import numpy as np
import os # for web and HTML
import requests
from bs4 import BeautifulSoup# create a dict of various
RSS feed link and their categories. Will iterate them one by one.
# Have mentioned only one feed for demo purposes
timesofindia = {'world':'http://timesofindia.indiatimes.com/rssfeeds/296589292.cms'}
for category, rsslink in timesofindia.items():
    print('Processing for category: {0}. \nRSS link: {1}'.format(category,rsslink))
    # get the webpage URL and read the html
    rssdata = requests.get(rsslink)
    #print(rssdata.content)
    soup = BeautifulSoup(rssdata.content)
    print(soup.prettify())

在BeautifulSoup解析之后,我们应该彻底检查了网页的HTML内容(通过使用如上所述的pretifiy函数),然后找到标签/样式或标签序列以进行导航,进而获取所需的新闻标题,链接和pubDate。在我们的例子中,这些元素在“item" 标签内。因此,让我们提取“item",然后遍历每个“item” 标签并提取每个单独的元素

# get all news items. It has title, description, link, guid, pubdate for each news items.
# Lets call this items and we will iterate thru it
allitems = soup.find_all('item')# print one news item/healine to check
for item in range(len(allitems)):
    print('Processing news-item #:',item)
    title = allitems[item].title.text
    link = allitems[item].guid.text
    pubdate = allitems[item].pubdate.text
    print('TITLE:',title)
    print('LINK:',link)
    print('PUBDATE:',pubdate)

输出:

Total news items found: 20

TITLE: Boris Johnson's pregnant fiancee says she is 'on the mend' from coronavirus

LINK: https://timesofindia.indiatimes.com/world/....

PUBDATE: Sun, 05 Apr 2020 17:15:04 IST

TITLE: US to airlift 22,000 Americans stranded overseas; many in India

LINK: https://timesofindia.indiatimes.com/world/.......

PUBDATE: Sun, 05 Apr 2020 14:08:04 IST

TITLE: Ecuador VP apologizes after virus corpses left on streets

LINK: https://timesofindia.indiatimes.com/world/....

PUBDATE: Sun, 05 Apr 2020 14:01:42 IST

得到的元素(例如标题,链接,发布日期)看起来符合我们的预期。让我们进入下一部分,我们将创建一个简单的函数来从链接中获取新闻文章文本。

提取新闻文章

在本节中,我们将通过分析网页的HTML链接来提取新闻文章文本。从RSS feed收到的链接中,我们将取出网页并使用BeautifulSoup 对其进行解析。

网页HTML应该进行被彻底分析,以能够识别所需新闻文本的标签。我创建了一个简单的函数来从链接中获取新闻文本。我将使用BeautifulSoup来提取特定html标签中可用的新闻文本。

# Function to fetch each news link to get news essay
def fetch_news_text(link):
# read the html webpage and parse it
    soup = BeautifulSoup(requests.get(link).content, 'html.parser')
    # fetch the news article text box
    # these are with element <div class="_3WlLe clearfix">
    text_box = soup.find_all('div', attrs={'class':'_3WlLe clearfix'})
    # extract text and combine
    news_text = str(". ".join(t.text.strip() for t in text_box))
    return news_text# using the above function, process text
news_articles = [{'Feed':'timesofindia',
                  'Category':category,
                  'Headline':allitems[item].title.text,
                  'Link':allitems[item].guid.text,
                  'Pubdate':allitems[item].pubdate.text,
                  'NewsText': fetch_news_text(allitems[item].guid.text)}
                     for item in range(len(allitems))]news_articles = pd.DataFrame(news_articles)
news_articles.head(3)

image.png

为了进行文本清理,我使用了文本的预处理,这些步骤是删除HTML标记,特殊字符,数字,标点符号,停用词,处理重音字符,扩展收缩,词干和词形等。

在这里,我将这些预处理步骤放到一个函数中,该函数将返回干净且标准化的语料库。

# test normalize cleanup on one article
# clean_sentences = normalize_corpus([news_articles['NewsText'][0]])
clean_sentences = normalize_corpus(news_articles['NewsText'])

产生句子向量

我们将使用GloVe词嵌入来生成句子的向量表示。对于本练习,我使用的是经过预先训练的Wikipedia 2014 + Gigaword 5 GloVe向量(https://nlp.stanford.edu/projects/glove/)

# define dict to hold a word and its vector
word_embeddings = {}# read the word embeddings file ~820MB
f = open('.\\GloVe\\glove.6B\\glove.6B.100d.txt', encoding='utf-8')
for line in f:
    values = line.split()
    word = values[0]
    coefs = np.asarray(values[1:], dtype='float32')
    word_embeddings[word] = coefs
f.close()# check the length
len(word_embeddings) # 400000

在这个集合中,我们有40万个单词嵌入进去。这些单词嵌入的大小为822 MB。大小可能会因嵌入tokens而异。嵌入越多,精度越高。让我们使用这些单词嵌入为归一化的句子创建向量。对于一个句子,我们将首先获取每个单词的向量,然后取所有句子/词向量分数的平均值,最终得出这个句子的合并向量分数。

# create vector for each sentences
# list to hold vector
sentence_vectors = []# create vector for each clean normalized sentence
for i in clean_sentences:
    if len(i) != 0:
        v = sum([word_embeddings.get(w, np.zeros((100,))) for w in i.split()])/(len(i.split())+0.001)
    else:
        v = np.zeros((100,))
    sentence_vectors.append(v)print('Total vectors created:',len(sentence_vectors))

取前N个句子

向量只是平面上的有方向的线段。使用余弦相似度方法,将发现句子之间的相似度。向量间的余弦角越小则越相似。在文章中,我们可以每隔一个句子计算一个余弦角。在这里,也可以使用其他方法,例如欧几里得距离,它们之间距离越小,向量越相似。

接下来,让我们将这个余弦相似度矩阵转换成一个图形,其中节点代表句子,边界将代表句子之间的相似度得分。在此图上,将应用PageRank算法得出每个句子的排名。

import networkx as nx
# build graph and get pagerank
nx_graph = nx.from_numpy_array(sim_mat)
scores = nx.pagerank(nx_graph)
# print final values of sentences
scores

输出:

{0: 0.0651816121717921,
 1: 0.0642861521750098,
 2: 0.06399116048715114,
 3: 0.06432009432128397,
 4: 0.06385988469675835,
 5: 0.06400525631019922,
 6: 0.06520921510891638,
 7: 0.06320537732857809,
 8: 0.06298228524215846,
 9: 0.06399491863786076,
 10: 0.0640726538022174,
 11: 0.06349704017361839,
 12: 0.06357060319536506,
 13: 0.057627597033478764,
 14: 0.058463972076477785,
 15: 0.05173217723913434}

由于我们在第一篇文章中得到了16个句子,因此我们得到了16个分数,每个句子一个。我们根据上面计算的排名选择前N个句子。

最后步骤和结论

如上所述,最终文本需要经过一些处理才能呈现。这些处理可以是将每个句子的首字母大写,从每篇文章的开头删除位置名称,删除多余的空格/制表符/标点符号,更正换行符等。.

最后,我们可以将所有这些步骤放在一起以创建摘要引擎/脚本。可将该脚本安排为每天早晨在选定的RSS频道上运行,并将新闻摘要发送到你的收件箱。这样,您无需遍历所有文章来了解最新信息。或者,你可以创建一个漂亮的HTML页面/小部件以显示主要出版物的新闻摘要。请注意,在上面,我使用了单个RSS频道,但是在创建管道时,可以指定更多的RSS频道。另外,我使用了一些打印语句来显示中间值,可以将这些中间值删除以获得无缝的体验。

希望您喜欢这篇文章。如果您想对其中的任何方法分享任何建议,请随时在评论中说。读者的反馈/评论始终是作家的灵感。

目录
相关文章
|
6天前
|
机器学习/深度学习 算法 测试技术
Python中实现多层感知机(MLP)的深度学习模型
Python中实现多层感知机(MLP)的深度学习模型
19 0
|
2天前
|
机器学习/深度学习 数据采集 前端开发
【Python机器学习专栏】模型泛化能力与交叉验证
【4月更文挑战第30天】本文探讨了机器学习中模型泛化能力的重要性,它是衡量模型对未知数据预测能力的关键。过拟合和欠拟合影响泛化能力,而交叉验证是评估和提升泛化能力的有效工具。通过K折交叉验证等方法,可以发现并优化模型,如调整参数、选择合适模型、数据预处理、特征选择和集成学习。Python中可利用scikit-learn的cross_val_score函数进行交叉验证。
|
2天前
|
机器学习/深度学习 数据可视化 前端开发
【Python机器学习专栏】机器学习模型评估的实用方法
【4月更文挑战第30天】本文介绍了机器学习模型评估的关键方法,包括评估指标(如准确率、精确率、召回率、F1分数、MSE、RMSE、MAE及ROC曲线)和交叉验证技术(如K折交叉验证、留一交叉验证、自助法)。混淆矩阵提供了一种可视化分类模型性能的方式,而Python的scikit-learn库则方便实现这些评估。选择适合的指标和验证方法能有效优化模型性能。
|
2天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】机器学习中的模型融合技术
【4月更文挑战第30天】模型融合,即集成学习,通过结合多个模型提升预测性能。常见方法包括:Bagging(如Random Forest)、Boosting(如AdaBoost、XGBoost)和Stacking。Python中可使用`scikit-learn`实现,例如BaggingClassifier示例。模型融合是机器学习中的强大工具,能提高整体性能并适应复杂问题。
|
2天前
|
机器学习/深度学习 Python
【Python 机器学习专栏】模型选择中的交叉验证与网格搜索
【4月更文挑战第30天】交叉验证和网格搜索是机器学习中优化模型的关键技术。交叉验证通过划分数据集进行多次评估,如K折和留一法,确保模型性能的稳定性。网格搜索遍历预定义参数组合,寻找最佳参数设置。两者结合能全面评估模型并避免过拟合。Python中可使用`sklearn`库实现这一过程,但需注意计算成本、过拟合风险及数据适应性。理解并熟练应用这些方法能提升模型性能和泛化能力。
|
2天前
|
机器学习/深度学习 数据可视化 TensorFlow
【Python 机器学习专栏】使用 TensorFlow 构建深度学习模型
【4月更文挑战第30天】本文介绍了如何使用 TensorFlow 构建深度学习模型。TensorFlow 是谷歌的开源深度学习框架,具备强大计算能力和灵活编程接口。构建模型涉及数据准备、模型定义、选择损失函数和优化器、训练、评估及模型保存部署。文中以全连接神经网络为例,展示了从数据预处理到模型训练和评估的完整流程。此外,还提到了 TensorFlow 的自动微分、模型可视化和分布式训练等高级特性。通过本文,读者可掌握 TensorFlow 基本用法,为构建高效深度学习模型打下基础。
|
2天前
|
算法 数据挖掘 Python
Python贝叶斯MCMC:Metropolis-Hastings、Gibbs抽样、分层模型、收敛性评估
Python贝叶斯MCMC:Metropolis-Hastings、Gibbs抽样、分层模型、收敛性评估
|
2天前
|
机器学习/深度学习 算法 数据挖掘
【Python 机器学习专栏】Python 中的线性回归模型详解
【4月更文挑战第30天】本文介绍了Python中的线性回归模型,包括基本原理、实现步骤和应用。线性回归假设因变量与自变量间存在线性关系,通过建立数学模型进行预测。实现过程涉及数据准备、模型构建、参数估计、评估和预测。常用的Python库有Scikit-learn和Statsmodels。线性回归简单易懂,广泛应用,但对异常值敏感且假设线性关系。其扩展形式如多元线性、多项式回归和正则化方法能适应不同场景。理解并运用线性回归有助于数据分析和预测。
|
2天前
|
Python
Python随机波动性SV模型:贝叶斯推断马尔可夫链蒙特卡洛MCMC分析英镑/美元汇率时间序列数据|数据分享
Python随机波动性SV模型:贝叶斯推断马尔可夫链蒙特卡洛MCMC分析英镑/美元汇率时间序列数据|数据分享
|
2天前
|
机器学习/深度学习 自然语言处理 算法
【Python机器学习专栏】文本数据的特征提取与表示
【4月更文挑战第30天】本文探讨了文本特征提取与表示在机器学习和NLP中的重要性。介绍了词袋模型、TF-IDF和n-gram等特征提取方法,以及稀疏向量和词嵌入等表示方式。Python中可利用sklearn和gensim库实现这些技术。有效的特征提取与表示有助于将文本数据转化为可处理的数值形式,推动NLP和机器学习领域的进步。