经常有朋友问怎么使用Python绘制词云图?今天我们展示一个简单的demo,有兴趣的朋友可以尝试跟着DIY哦~
1. 前期准备
在绘制词云图之前,我们要先安装所需的第三方库。
- 安装jieba:
conda install -c conda-forge jieba
- 安装wordcloud:
conda install -c conda-forge wordcloud
2. 准备需要分析的内容
这里你可以直接使用你已经准备好的内容,在这个demo中,我们通过获取pubmed上以lung cancer为关键词搜索的前10页的文章题目作为分析的内容。这里我们采用requests获取网页信息,然后使用beautiful soup进行网页结构分析。
import re
import jieba
import jieba.analyse
import codecs
import wordcloud
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
page = 10 # 设置获取前10页的内容
start_url = ('https://pubmed.ncbi.nlm.nih.gov/?term=lung+cancer') # 设置搜索网址与关键词lung cancer
# 循换10页内容,获取页面所有文章的题目
all_content = ''
for i in range(int(page)):
url = start_url + "&page=" + str(int(i)+1)
#爬取网页
r = requests.get(url, headers= {'user-agent':'Mozilla/5.0'})
r.raise_for_status()
r.encoding = r.apparent_encoding
html = r.text
#提取题目信息
soup = BeautifulSoup(html, 'html.parser')
for paper in soup.find_all(attrs={'class':'docsum-content'}):
name = str(paper.a).split('">')[1]
title = re.sub(r'(</a>|<b>|</b>)', '', name).strip()
all_content += title + '\n'
with open('title.txt', 'a', encoding='utf-8') as out_file:
out_file.write(title.lower() + '\n')
3. 词频统计
在我们进行词频统计之前,我们还需要做一些准备工作。
在这个简单的demo中,我们处理的内容是全英文的,大家都知道英文单词之间是以空格来间隔的,所以对计算机很友好,它可以很容易识别出每个英文单词。但是,我们要知道,我们的中文的词组间是没有空格间隔的。所有,大家要注意如果你要处理的内容是中文的,你需要先进行中文分词处理,中文分词就是要告诉计算机哪些内容是一个词组。比如,“我是学生”这句话,通过分词处理就变成了“我 | 是 | 学生”。如果大家有中文分词的需求,可以进一步参考jiba官方文档。
接着,我们要剔除停用词(stop words)。什么是停用词呢?简单的说,就是处理词频的时候我们不需要统计的的词汇,字符。比如英文中的“a,an,and,or...”;又比如中文中的“的、地、了...”。
在这个例子中,我们通过统计,筛选了出现频率最高的前100个单词进行下一步词云图的绘制。
#载入停用词数据
stopwords = [line.strip() for line in codecs.open('stopwords.txt', 'r', 'utf-8').readlines()]
#词频统计
segments = {}
words = jieba.cut(all_content)
for word in words:
if word not in stopwords:
segments[word] = segments.get(word, 0) + 1
#按照词频排序
sort_segments = sorted(segments.items(), key=lambda item:item[1], reverse=True)
words_on_list = []
for word, count in sort_segments[:99]:
words_on_list.append(word)
4. 绘制词云图
使用wordcloud绘制词云图,然后使用matplotlib实现图片的显示与题目的设置。
#生成词云
word_show = ' '.join(words_on_list)
w = wordcloud.WordCloud(font_path="msyh.ttc", width=1000, height= 700,background_color="white", max_words=100)
w.generate(word_show)
w.to_file("hot_word.jpg")
plt.figure(figsize=(8,8.5))
plt.imshow(w, interpolation='bilinear')
plt.axis('off')
plt.title('Most Popular Words in Title', fontsize=30)
plt.show()
最后就得到了我们想要的词云图: