Python分析3月政府工做報告

概述

有時候咱們抓不到一些文章裏面的重點,python裏jieba庫分詞很好的爲咱們提供了一個好的解決方案。下面就講一個實際使用的一個例子來講明。html

首先,咱們要將網頁的內容請求並解析出來,下面是政府工做報告的路徑:python

www.gov.cn/premier/201…bash

利用request庫的get(url)方法請求拿到響應的數據,發現報告文字內容大多在段落p標籤中。能夠引用BeautifulSoupfind_all()p標籤中全部標籤拿到,再獲取裏面的內容。下面先封裝一下:app

def extract_text(url):
    # 發送url請求並獲取響應文件
    page_source = requests.get(url).content
    bs_source = BeautifulSoup(page_source, "lxml")

    # 解析出全部的p標籤
    report_text = bs_source.find_all('p')

    text = ''
    # 將p標籤裏的全部內容都保存到一個字符串裏
    for p in report_text:
        text += p.get_text()
        text += '\n'

    return text複製代碼

詞雲的使用

使用詞雲,首先得準備一張背景圖片,這裏使用了前面比較火的小豬佩奇的圖片。echarts


要讀入圖片,要使用matplotlib庫中pyplot模塊的imread()方法。dom

import matplotlib.pyplot as plt
back_img = plt.imread('/peiqi.jpg') # 方法裏傳入圖片的路徑複製代碼

下面介紹詞雲的基本使用:函數

cloud = WordCloud(font_path= '/simhei.ttf',  # 如果有中文的話,這句代碼必須添加,否則會出現方框,不出現漢字
                      background_color="white",  # 背景顏色
                      max_words=5000,  # 詞雲顯示的最大詞數
                      mask=back_img,  # 設置背景圖片
                      max_font_size=100,  # 字體最大值
                      random_state=42,
                      width=360, height=591, margin=2,  # 設置圖片默認的大小,可是若是使用背景圖片的話,保存的圖片大小將會按照其大小保存,margin爲詞語邊緣距離
                      )複製代碼

由於詞雲默認是不支持中文的,須要在網上搜索支持的字體,而後將下載好的字體simhei.ttf放在項目裏面。字體

jieba分詞

下面按jieba的精確分詞模式將解析到的內容傳入,並傳入詞雲,生成圖形。優化

for li in content:
        comment_txt += ' '.join(jieba.cut(li, cut_all=False))
    wc = cloud.generate(comment_txt)
    image_colors = ImageColorGenerator(back_img)
    plt.figure("wordc")
    plt.imshow(wc.recolor(color_func=image_colors))
    wc.to_file('2019年3月政府工做報告.png')複製代碼

下面是完整的代碼:url

import matplotlib.pyplot as plt
import jieba
import requests
from bs4 import BeautifulSoup
from wordcloud import WordCloud, ImageColorGenerator

def extract_text(url):
    # 發送url請求並獲取響應文件
    page_source = requests.get(url).content
    bs_source = BeautifulSoup(page_source, "lxml")

    # 解析出全部的p標籤
    report_text = bs_source.find_all('p')

    text = ''
    # 將p標籤裏的全部內容都保存到一個字符串裏
    for p in report_text:
        text += p.get_text()
        text += '\n'

    return text

def word_cloud(content):
    comment_txt = ''
    back_img = plt.imread('/peiqi.jpg')
    cloud = WordCloud(font_path='/simhei.ttf',  # 如果有中文的話,這句代碼必須添加,否則會出現方框,不出現漢字
                      background_color="white",  # 背景顏色
                      max_words=5000,  # 詞雲顯示的最大詞數
                      mask=back_img,  # 設置背景圖片
                      max_font_size=100,  # 字體最大值
                      random_state=42,
                      width=360, height=591, margin=2,  # 設置圖片默認的大小,可是若是使用背景圖片的話,保存的圖片大小將會按照其大小保存,margin爲詞語邊緣距離
                      )
    for li in content:
        comment_txt += ' '.join(jieba.cut(li, cut_all=False))
    wc = cloud.generate(comment_txt)
    image_colors = ImageColorGenerator(back_img)
    plt.figure("wordc")
    plt.imshow(wc.recolor(color_func=image_colors))
    wc.to_file('2019年3月政府工做報告.png')

if __name__ == "__main__":
    url = 'http://www.gov.cn/premier/2019-03/16/content_5374314.htm'
    text = extract_text(url)
    word_cloud(text)複製代碼
獲得的效果以下所示:


用詞雲顯示發現顯示得並不太直觀,下面用matplotlib的柱形圖將前10關鍵詞的數量顯示出來。這裏要從新優化一下詞雲的搜索。

from collections import Counter
import numpy as np

def word_frequency(text):
    
    word_list = [] 
    count_list = [] 
    words = [word for word in jieba.cut(text, cut_all=True) if len(word) >= 2] # 返回全部分詞後長度大於等於2 的詞的列表
   # Counter是一個簡單的計數器,統計字符出現的個數

    c = Counter(words)
   for word_freq in c.most_common(10):
 # c.most_common(10) 返回一個列表,裏面每個元素是一個元祖
        word, freq = word_freq
        word_list.append(word)
        count_list.append(freq)        
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標籤
    plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號
    colors = ['#00FFFF', '#7FFFD4', '#F08080', '#90EE90', '#AFEEEE', '#98FB98', '#B0E0E6', '#00FF7F', '#FFFF00', '#9ACD32']
    index = np.arange(10)
    plt.bar(index, count_list, color=colors, width=0.5, align='center')
    plt.xticks(np.arange(10), word_list)  # 橫坐軸標籤
    for x, y in enumerate(count_list):
        # 在柱子上方1.2處標註值 
       plt.text(x, y + 1.2, '%s' % y, ha='center', fontsize=10)
    plt.ylabel('出現次數')  # 設置縱座標標籤
    prov_title = '政府報告Top10關鍵詞
'   plt.title(prov_title)    # 設置標題
    plt.savefig('/政府報告Top10關鍵詞.png')  # 保存圖片
    # 顯示
    plt.show()複製代碼

這裏用到了collections裏的Counter將前10出現的詞彙及次數統計出來,遍歷出來分別放在兩個列表裏,而後設置在柱形圖座標軸上分別顯示出來。顯示效果以下:


將詞雲的代碼換成上面的函數調用便可。

if __name__ == "__main__":
    url = 'http://www.gov.cn/premier/2019-03/16/content_5374314.htm'
    text = extract_text(url)
     # word_cloud(text)
     word_frequency(text)複製代碼


其實可視化方案能夠採用pyecharts 

pip install pyecharts複製代碼

代碼修改以下:

def word_frequency(text):
    # 返回全部分詞後長度大於等於2 的詞的列表
    word_list = []
    count_list = []
    words = [word for word in jieba.cut(text, cut_all=True) if len(word) >= 2]
    # Counter是一個簡單的計數器,統計字符出現的個數
    c = Counter(words)

    for word_freq in c.most_common(10): # c.most_common(10)是列表裏,裏面每個元素是一個元祖
        word, freq = word_freq
        word_list.append(word)
        count_list.append(freq)
        print(word, freq,sep = ':')

    from pyecharts import options as opts
    from pyecharts.charts import Pie
    def pie_base() -> Pie:
        c = (
            Pie()
                .add("", [list(z) for z in zip(word_list, count_list)])
                .set_global_opts(title_opts=opts.TitleOpts(title="政府報告關鍵詞"))
            # .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        )
        return c

    pie_base().render('temp/政府報告關鍵詞.html')複製代碼

pyecharts具備動態效果,顯示效果比matplotlib更佳.

相關文章
相關標籤/搜索