Python數(shù)據(jù)可視化-使用Python繪制詞云圖

經(jīng)常有朋友問(wèn)怎么使用Python繪制詞云圖?今天我們展示一個(gè)簡(jiǎn)單的demo,有興趣的朋友可以嘗試跟著DIY哦~

1. 前期準(zhǔn)備

在繪制詞云圖之前,我們要先安裝所需的第三方庫(kù)。

  • 安裝jieba:conda install -c conda-forge jieba
  • 安裝wordcloud:conda install -c conda-forge wordcloud

2. 準(zhǔn)備需要分析的內(nèi)容

這里你可以直接使用你已經(jīng)準(zhǔn)備好的內(nèi)容,在這個(gè)demo中,我們通過(guò)獲取pubmed上以lung cancer為關(guān)鍵詞搜索的前10頁(yè)的文章題目作為分析的內(nèi)容。這里我們采用requests獲取網(wǎng)頁(yè)信息,然后使用beautiful soup進(jìn)行網(wǎng)頁(yè)結(jié)構(gòu)分析。

import re
import jieba
import jieba.analyse
import codecs
import wordcloud
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt

page = 10 # 設(shè)置獲取前10頁(yè)的內(nèi)容
start_url = ('https://pubmed.ncbi.nlm.nih.gov/?term=lung+cancer') # 設(shè)置搜索網(wǎng)址與關(guān)鍵詞lung cancer
# 循換10頁(yè)內(nèi)容,獲取頁(yè)面所有文章的題目
all_content = ''
for i in range(int(page)): 
    url = start_url + "&page=" + str(int(i)+1)
    #爬取網(wǎng)頁(yè)
    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. 詞頻統(tǒng)計(jì)

在我們進(jìn)行詞頻統(tǒng)計(jì)之前,我們還需要做一些準(zhǔn)備工作。

在這個(gè)簡(jiǎn)單的demo中,我們處理的內(nèi)容是全英文的,大家都知道英文單詞之間是以空格來(lái)間隔的,所以對(duì)計(jì)算機(jī)很友好,它可以很容易識(shí)別出每個(gè)英文單詞。但是,我們要知道,我們的中文的詞組間是沒(méi)有空格間隔的。所有,大家要注意如果你要處理的內(nèi)容是中文的,你需要先進(jìn)行中文分詞處理,中文分詞就是要告訴計(jì)算機(jī)哪些內(nèi)容是一個(gè)詞組。比如,“我是學(xué)生”這句話,通過(guò)分詞處理就變成了“我 | 是 | 學(xué)生”。如果大家有中文分詞的需求,可以進(jìn)一步參考jiba官方文檔。

接著,我們要剔除停用詞(stop words)。什么是停用詞呢?簡(jiǎn)單的說(shuō),就是處理詞頻的時(shí)候我們不需要統(tǒng)計(jì)的的詞匯,字符。比如英文中的“a,an,and,or...”;又比如中文中的“的、地、了...”。

在這個(gè)例子中,我們通過(guò)統(tǒng)計(jì),篩選了出現(xiàn)頻率最高的前100個(gè)單詞進(jìn)行下一步詞云圖的繪制。

#載入停用詞數(shù)據(jù)
stopwords = [line.strip() for line in codecs.open('stopwords.txt', 'r', 'utf-8').readlines()]

#詞頻統(tǒng)計(jì)
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實(shí)現(xiàn)圖片的顯示與題目的設(shè)置。

#生成詞云
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()

最后就得到了我們想要的詞云圖:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容