小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

coder-pig發表於2018-03-09

一句話概括本文

爬取2018政府工作報告,通過**jieba**庫進行分詞後做詞頻統計, 最後使用 wordcloud 庫製作naive詞雲,非常有意思~


引言

昨晚寫完上一篇把爬取到的資料寫入到Excel後,在回家的路上我就盤算著 折騰點有趣的東西玩玩——簡單的資料分析:分詞,統計詞頻,然後做成詞雲; 分析點什麼玩玩好呢?想起以前看到過一個梗,有人把汪峰唱過的歌的歌詞做 詞頻統計,然後自嗨作詞了一首汪峰Style的歌,2333,本來早上想弄的, 發現處理起來有些麻煩,歌詞源考慮了下爬蝦米音樂,但是有些歌詞不規範, 這個多點什麼,那個少點什麼,處理起來挺麻煩的,就放棄了,後面在 看文章的時候發現了一個有點意思的例子: Python文字分析:2016年政府工作報告有哪些高頻詞? 3月5日不是剛召開完第十三屆全國人民代表大會嗎?會後釋出了: 2018政府工作報告,作為一個積極愛國分子,寫個Python指令碼來分析 分析高頻詞,弄個詞雲學習學習,豈不美哉~開始本節內容!

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞


1.資料準備

百度隨手搜下關鍵字,2018政府工作報告,隨手翻開一個: 2018政府工作報告全文(推薦收藏):news.ifeng.com/a/20180305/…

這種就非常簡單了,直接Element看所需的資料節點:

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

div包著一堆p標籤,拿到p標籤裡的text就可以了,這裡過濾掉最後一個來源:新華社

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

可以加個print把text打出來:

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

沒錯是想要的資料,在做分詞前,通過正則把各種亂七八糟的 標點符號還有數字都替換掉:

punctuation_pattern = re.compile('[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?“”、~@#¥%……&*()(\d+)]+')
result = punctuation_pattern.sub("", extract_text(news_url))
print(result)
複製程式碼

替換結果:

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

到此,用作分詞的字串就準備好了~


2.分詞與詞頻統計

因為我們的資料都是中文的,這裡選用號稱: 做最好的 Python 中文分片語件jieba庫

pip命令列安裝一波庫

pip install jieba
複製程式碼

使用方法也很簡單:

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

cut方法引數:(分詞的字串,cut_all是否開啟全模式),全模式的意思 就是會這樣匹配,比如:大傻逼,會分詞成:大傻,傻逼和大傻逼 另外這裡還做了下判斷,長度大於等於2才算一個詞。執行下把分詞 後陣列遍歷下,可以,沒毛病。

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

接著就到同此詞頻了,這裡的統計的話分兩個選項吧, 你看你是要統計詞出現的頻次,還是出現的頻率,這裡就先統計下 頻次吧,就是詞出現的次數,看到網上的套路都是通過:

**collections模組的Counter**類來實現的,Counter是一個無序的容器 型別,以字典的鍵值對形式儲存,元素為key,計數為value,一般 用來跟蹤值出現的次數

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

PS:括號裡的50代表取次數最多的前50個~

輸出結果

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

頻次拿到了,但是有個問題,我們發現有一些關鍵詞是沒什麼意義 的,比如推進,提高等等動詞,我們需要對資料進行過濾(貌似有 個專業名詞叫:資料清洗),最簡單的就是定義一個過濾列表, 把想過濾的詞都丟進去,分詞後遍歷一波,把在過濾列表中存在 的元素進行移除:

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

執行結果

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

可以,意義不大的關鍵詞都過濾掉了,關於統計頻次目前只知道 這個套路,有其他高大上的套路的歡迎在評論區留言告知~ 接著就是頻率統計,就是出現的百分比,這個可以知己 通過jieba庫裡的**analyse模組解決,這個東西支援停用詞** 檔案過濾,就是把不想要的分詞都丟一個檔案裡,分詞時會 自動過濾,呼叫的函式是:extract_tags

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

執行結果

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

引數topK代表提取多少個withWeight是否帶有頻率(權重), 另外可能你對停用詞檔案比較好奇,其實內容非常簡單:

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

分詞與詞頻問題就已經解決了,接下來搞詞雲了。


3.生成詞雲

網上搜詞雲的庫基本都用的wordcloud這個庫,就直接拿這個開刀吧!

pip命令列安裝一波庫

pip install wordcloud
複製程式碼

用這個庫最關鍵的就是WordCloud建構函式

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

引數詳解

  • font_path字型路徑,就是繪製詞雲用的字型,比如monaco.ttf
  • width:輸出的畫布寬度,預設400畫素
  • height:輸出的畫布寬度,預設200畫素
  • margin:畫布偏移,預設2畫素
  • prefer_horizontal : 詞語水平方向排版出現的頻率,預設0.9,垂直方向出現概率0.1
  • mask:如果引數為空,則使用二維遮罩繪製詞雲。如果 mask 非空,設定的寬高值將 被忽略,遮罩形狀被 mask,除全白(#FFFFFF)的部分將不會繪製,其餘部分會用於繪製詞雲。 如:bg_pic = imread('讀取一張圖片.png'),背景圖片的畫布一定要設定為白色(#FFFFFF), 然後顯示的形狀為不是白色的其他顏色。可以用ps工具將自己要顯示的形狀複製到一個純白色 的畫布上再儲存,就ok了。
  • scale:按照比例進行放大畫布,如設定為1.5,則長和寬都是原來畫布的1.5倍
  • color_func:生成新顏色的函式,如果為空,則使用 self.color_func
  • max_words:顯示的詞的最大個數
  • min_font_size:顯示的最小字型大小
  • stopwords:需要遮蔽的詞(字串集合),為空使用內建STOPWORDS
  • random_state:如果給出了一個隨機物件,用作生成一個隨機數
  • background_color:背景顏色,預設為黑色
  • max_font_size:顯示的最大的字型大小
  • font_step:字型步長,如果步長大於1,會加快運算但是可能導致結果出現較大的誤差
  • mode:當引數為"RGBA",並且background_color不為空時,背景為透明。預設RGB
  • relative_scaling:詞頻和字型大小的關聯性,預設5
  • regexp:使用正規表示式分隔輸入的文字
  • collocations:是否包括兩個詞的搭配
  • colormap:給每個單詞隨機分配顏色,若指定color_func,則忽略該方法
  • normalize_plurals:是否刪除尾隨的詞語

常用的幾個方法

  • fit_words(frequencies) //根據詞頻生成詞雲
  • generate(text) //根據文字生成詞雲
  • generate_from_frequencies(frequencies[, ...]) #根據詞頻生成詞雲
  • generate_from_text(text) #根據文字生成詞雲
  • process_text(text) #將長文字分詞並去除遮蔽詞 (此處指英語,中文分詞還是需要自己用別的庫先行實現,使用上面的 fit_words(frequencies) )
  • recolor([random_state, color_func, colormap]) #對現有輸出重新著色。重新上色會比重新生成整個詞雲快很多。
  • to_array() #轉化為 numpy array
  • to_file(filename) #輸出到檔案

看得我真是一臉懵逼,直接寫個最簡單的例子,幫助我們上手~

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

呼叫下這個方法,把我們前面的分詞後的陣列傳進去:

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

輸出結果

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

可以,非常有意思,此時此刻,突然:

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

官方可以的是這樣的例子:

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

嘖嘖,Too young,too simple! 先找一個膜法師專用圖,然後改一波程式碼(沒有原圖,別問我):

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

執行下(真正的粉絲...):

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

這個字型是隨機顏色的,感覺還差點什麼,不如讓字型跟隨 著圖片的顏色?可能會感受更深刻一些!獲取一波顏色陣列, 設定下就可以了:

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

執行下

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

真別問我要原圖,沒有,另外上面用到一個scipy庫,用來獲取一個顏色矩陣的, 官方示例裡還用到了另外的一個庫:matplotlib 一個很屌的視覺化繪圖模組。 本來想試試的,不過快下班了,下次吧~

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞


小結

本節試了一波Python裡的資料分析,講真,老早之前就想試試這個 東西了,通過大量的資料分析得出一些結論,比如抓取某個心儀 同事妹子朋友圈裡或者微博裡的所有資訊,做下詞頻統計分析, 可以大概猜測這個人的興趣愛好,又比如抓取某個商品的所有 評論,分析下詞頻,可以得到購買者們對此商品的客觀評價 (刷單是存在的,只能說作為一個參考依據),又比如最近是 招聘的金三銀四,HR每天都要過濾一堆簡歷,ORC識別後,分詞 統計出,過濾工作年限,是否有專案經驗等,設定一個匹配度 的機制,篩選掉匹配度不足多少的簡歷。(只是腦洞...) Python是真的好玩!最後說一句,我只是一個跑得快的香港 接著,並不想搞個大新聞,naive!

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞


附:最終程式碼(都可以在:github.com/coder-pig/R… 找到):

# 分析2018政府工作報告全文高頻詞
import jieba
import jieba.analyse
import requests
import tools as t
import re
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
from collections import Counter
import matplotlib.pyplot as plt
from scipy.misc import imread

news_url = "http://news.ifeng.com/a/20180305/56472392_0.shtml"
# 過濾掉所有中文和英文標點字元,數字
punctuation_pattern = re.compile('[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?“”、~@#¥%……&*()(\d+)]+')
exclude_words_file = "exclude_words.txt"


# 獲取網頁中的正文文字
def extract_text(url):
    report = ""
    resp = requests.get(news_url).content
    if resp is not None:
        soup = t.get_bs(resp)
        ps = soup.select('div#main_content p')
        for p in ps[:-1]:
            report += p.text
    return report


# 生成詞雲檔案
def generate_wc(content):
    path = r'fzzqhj.TTF'
    bg_pic = imread('mo.png')  # 讀取一張圖片檔案
    image_colors = ImageColorGenerator(bg_pic)  # 從背景圖片生成顏色值
    wc = WordCloud(font_path=path, background_color="white",
                   mask=bg_pic,
                   stopwords=STOPWORDS.add("said"),
                   max_font_size=40,
                   color_func=image_colors,
                   random_state=42)
    wc = wc.generate(content)
    wc.to_file('result.jpg')


if __name__ == '__main__':
    result = punctuation_pattern.sub("", extract_text(news_url))
    words = [word for word in jieba.cut(result, cut_all=False) if len(word) >= 2]
    # # 設定停用詞
    # jieba.analyse.set_stop_words(exclude_words_file)
    # # 獲取關鍵詞頻率
    # tags = jieba.analyse.extract_tags(result, topK=100, withWeight=True)
    # for tag in tags:
    #     print(tag[0] + "~" + str(tag[1]))

    exclude_words = [
        "中國", "推進", "全面", "提高", "工作", "堅持", "推動",
        "支援", "促進", "實施", "加快", "增加", "實現", "基本",
        "重大", "我國", "我們", "擴大", "繼續", "優化", "加大",
        "今年", "地方", "取得", "以上", "供給", "堅決", "力度",
        "著力", "深入", "積極", "解決", "降低", "維護", "問題",
        "保持", "萬億元", "改善", "做好", "代表", "合理"
    ]
    for word in words:
        if word in exclude_words:
            words.remove(word)
    data = r' '.join(words)
    generate_wc(data)

    # c = Counter(words)
    # for word_freq in c.most_common(50):
    #     word, freq = word_freq
    #     print(word, freq)

複製程式碼

來啊,Py交易啊

想加群一起學習Py的可以加下,智障機器人小Pig,驗證資訊裡包含: PythonpythonpyPy加群交易屁眼 中的一個關鍵詞即可通過;

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞

驗證通過後回覆 加群 即可獲得加群連結(不要把機器人玩壞了!!!)~~~ 歡迎各種像我一樣的Py初學者,Py大神加入,一起愉快地交流學♂習,van♂轉py。

小豬的Python學習之旅 —— 15.淺嘗Python資料分析:分析2018政府工作報告中的高頻詞


相關文章