如何用Newspaper3k和Python生成单词云

344 阅读9分钟

继续我们对Newspaper3k的介绍,我们现在可以利用我们的基本知识,实现我们可以用这个库来做的事情的可能性。

在这里,我将为你演示一个项目,它从一组不同的新闻机构的文章中挑选出最常用的词,并在NLP和Matplotlib的帮助下显示结果的词云。

让我们开始吧。

简介

在这篇文章中,我们将从几个不同的新闻来源中抓取一系列的文章,一旦我们从每篇文章中提取了关键词,我们就可以使用Newspaper3k从每篇文章中获得的关键词创建一个显示当天最重要话题的词云。

词云可能不是分析文本数据的最深入的方法,但是,可以成为分析文本数据和发现经常出现的单词或常见的单词模式的一个非常有吸引力的简单手段。例如,如果你能得到一个公众人物的演讲或著作的文本,你可以很容易地用词云来可视化所涉及的最重要的话题。 为了更进一步,公司可以把它与情感分析结合起来,找出他们的哪些产品被写得最多,以及对它们的正面或负面评价是多少。

例如,这里是梵蒂冈六年前发布的通谕 "Laudato Si "中的一个词云。 该文件大约有250页,但是我们可以通过查看文件中使用最多的100个词来快速了解该通谕的要点。

根据我们所分析的文本,我们甚至可以通过查看词云来确定文件的基本主题或论点。 从本文的词云中我们可以看到,我们可以猜测该通谕涉及地球和人类的问题,存在某种问题,必须采取一些措施来帮助地球,也许是为了 "我们 "或人类的利益,也许也是为了上帝。正如我们所看到的,在Newspaper3k和数据分析的帮助下创建文字云可以在一张图片中给我们提供很多关于文本的信息。

顺便说一下,让我们假设耶稣在那份报纸上被提及一两次。😉

现在我们看到了这里的可能性,让我们开始制作我们自己的词云吧。

II.从不同的新闻来源中搜罗一组文章

鉴于最近所有关于美国从阿富汗撤军的新闻,我们将在这个项目中重点关注关于美国的新闻。 我们将从以下新闻来源收集RSS提要。代码中会有链接,所以你不必去搜索它们。

正如我们在之前的文章中提到的,RSS订阅让我们可以快速而轻松地搜刮文章链接,尤其是今天的新闻。 如果这是你对网络搜刮或Newspaper3k的第一次介绍,我鼓励你阅读它,以便你在开始之前了解RSS订阅是如何工作的,如何搜刮它们,以及你可能需要下载的python库。 链接中的视频还向你展示了如何设置一个虚拟环境,从将运行代码的文件夹中运行该程序。

让我们开始吧。

首先,我们将导入一些必要的库,并收集我们所有的feeds,把它们放到一个列表中。

导入请求

from bs4 import BeautifulSoup

from newspaper import Article

import csv

feeds = [

'www.nbcnews.com/rss',

'www.theguardian.com/us/rss'。

'www.rt.com/rss/usa/'。

'abcnews.go.com/abcnews/ush…

'www.cbsnews.com/latest/rss/…

'rss.nytimes.com/services/xm…'

]

现在让我们来搜刮文章。 幸运的是,这里所有的RSS提要都可以被搜刮得一模一样。

文章 = []

对于feeds中的feed。

响应 = requests.get(feed)

webpage = response.content

soup = BeautifulSoup(webpage, features='xml')

# 每篇文章的链接都会在一个项目标签中找到

items = soup.find_all('item')

#提取链接

for items in items:

link = item.find('link').text

articles.append(link)

在RSS提要中,每篇文章的链接都会包含在它自己的标签中。 我们可以简单地寻找每一个标签的实例,并在标签中收集链接。

现在我们有了文章列表,是时候使用Newspaper3k库来抓取每一篇文章了。 然后我们将把数据存储在CSV文件中。 对于这篇文章,我们将保存URL、文章关键词和文本(以备我们想对文本做进一步分析)。

数据 = []

for url in articles:

info = Article(url)

info.download()

info.parse()

info.nlp()

keywords = info.keywords

文本 = info.text

#保存URL、关键字和文本

save = [url, keywords, text].

data.append(save)

with open('MyCSV.csv', 'w') as csv_file:

# 设置CSV文件的列标签

label = ['URL', 'Keywords', 'Text']

# 把数据写进CSV文件

writer = csv.writer(csv_file)

writer.writerow(label)

writer.writerows(data)

csv_file.close()

III.从数据中显示词云

现在我们已经存储了所有的数据,现在我们可以让乐趣开始,创建我们的词云。

在我们从所有的文章中开发出大的词云之前,我将向你展示如何从一篇文章中快速创建一个词云。

首先,如果你的电脑上没有Jupyter笔记本,下面的命令可以安装它。

conda install -c conda-forge notebook

pip install notebook

然后,下面的命令将打开Jupyter notebooks。

jupyter notebook

然后,Jupyter将在你的浏览器中打开,你可以开始工作。

I. 创建简单的文字云

让我们首先再次安装必要的库。 我们将需要pandas来读取CSV数据,我们将导入wordcloud库来创建我们的词云图像,我们将需要Matplotlib来显示词云。 如果你需要安装这三个库,这就足够了。

pip install pandas

pip install matplotlib

pip install wordcloud

现在是代码。

import pandas as pd

from wordcloud import WordCloud, STOPWORDS

import matplotlib.pyplot as plt

现在我们需要做的是从我们刚刚保存的CSV文件中加载数据,并创建一个数据框架。 确保不要加载第一行,因为它只有每一列的标题。

# 载入数据框架

# converters={'keywords': eval} → 将每一行的关键词转换为一个列表

df = pd.read_csv('MyCSV2.csv', converters={' Keywords': eval})

#如果你想看看你有多少行的数据

print(df.shape[0])

#如果你希望显示数据

df.head

下面是我的数据的前几行的样子。

像我们为 "关键词 "列所做的那样设置转换器是必要的,可以将每一行的关键词转换成我们最初保存在CSV文件中的列表。 如果不这样做,每一行的关键词将只是一个大字符串,处理起来会很麻烦。

为了让你知道如何从一篇文章中创建一个词云,我们将首先从一篇文章中创建一个词云。 因为没有必要从一篇文章的关键词中打印一个词云,我们将直接从文章的文本中开发词云。

我们包括一组已经包含在Wordcloud库中的'止损词',这些止损词可以去除像'the'、'we'等会给词云增加杂乱的无用词。 如果你想添加更多的止损词,可以输入stopwords.add("你的词")。

# 从一条评论开始。

text = df.Text[177]

# text = " ".join(i for i in keywords)

print(df.URL[177])

www.rt.com/usa/532248-…

# stopwords只是一组要剔除的词

# 如果没有手动设置STOPWORDS,那么将使用这个默认列表

stopwords = set(STOPWORDS)

#如果你想添加到止损词列表中,这里我添加了一些新闻来源

stopwords.update(['s', 't', 'rt', 'co', 'abc', 'nbc', 'cbs', 'nytimes'] )

# 创建并生成一个基本的词云图像。

wordcloud = WordCloud(stopwords=stopwords,max_words=50,background_color="white").generation(text)

# 显示生成的图像。

plt.figure(figsize=[10,10])

plt.imshow(wordcloud)

plt.axis("off")

plt.show()

这就是我的这篇文章的词云的样子。

我们可以看到,这篇文章是关于内华达州或亚利桑那州的一些水短缺。

现在我们知道了如何从一篇文章中创建一个基本的词云,现在让我们扩展一下,从一大批文章中找到当天最重要的关键话题。

我们没有必要从每篇文章的文本中进行分析(尽管如果你愿意,你可以这样做),所以我们只需从所有提取的关键词中创建一个词云。

首先,我们需要收集所有的关键词,把它们放到一个单一的列表中,然后把它们从列表中全部取出来,格式化为一个大的文本。 用一点 "python-fu "就可以轻松完成。

#for row(i) in df.Keywords

# for keyword(j) in i

#附加上j

keywords = [j for i in df.Keywords for j in I]。

#将所有的关键词连接成一个单一的字符串 text

text = " ".join(i for i in keywords)

#print(text)

现在我们有了一个所有关键词的全文,准备做成一个词云。

# collocation=False,这样重复的词就不会作为更大的短语的一部分出现(如'总统拜登')。

wordcloud = WordCloud(stopwords=stopwords,max_words=100,background_color="white",collocations=False).generation(text)

# 显示生成的图像。

plt.figure(figsize=[10,10])

plt.imshow(wordcloud)

plt.axis("off")

plt.show()

正如我们所看到的,使用最多的关键词恰好涉及到当今美国最重要的话题。特别是阿富汗的事件占据了头条。

II.用我们的词云搞点创意

为了好玩,我将向你展示如何在创建你的词云时获得一点乐趣。 它不仅仅是简单地看起来像上面的那个。

既然我们是在处理美国的新闻,为什么我们不以美国国旗的形状和颜色来创建一个词云呢?

首先,找到一张国旗的图片,然后将其保存为PNG文件。 以下是我所用图片的链接。

cdn.britannica.com/33/4833-004…

现在我们将把它加载到我们的程序中,创建一个看起来像美国国旗的词云。

如果你没有numpy和Pillow,你将需要管道安装它。

现在我们的代码。

import numpy as np

从PIL中导入Image

from wordcloud import ImageColorGenerator

# 生成一个词云图像

frame = np.array(Image.open("usa.png"))

wordcloud = WordCloud(stopwords=stopwords, background_color="white", max_words=500, collocations=False, mask=frame).generation(text)

# 从图像中创建着色

image_colors = ImageColorGenerator(frame)

plt.figure(figsize=[15,15])

#将颜色方案添加到词云中

plt.imshow(wordcloud.recolor(color_func=image_colors))

plt.axis("off")

plt.show()

我们利用图像并创建一个掩码,或者说一个框架,根据一个与我们放入的图像相对应的数值数组来指示单词的位置和颜色。 然后,该掩码被包含在Wordcloud对象中。 最后,我们从ImageColorGenerator获得必要的颜色,然后进入我们的新词云。

在这种情况下,我增加了几百个额外的词,以填补国旗的空白,这样你就可以看到程序是如何将这些词与国旗的形状和轮廓相匹配的。

这就是我们现在的新 "美国 "字云。

请欣赏!

如果你想获得我使用的代码和CSV的链接,我已经把它放在我的GitHub上。

The postHow to Generate a Word Cloud with Newspaper3k and Pythonfirst appeared onFinxter.