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

一句話歸納本文html

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


引言git

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


1.數據準備

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

這種就很是簡單了,直接Element看所需的數據節點:數組

div包着一堆p標籤,拿到p標籤裏的text就能夠了,這裏過濾掉最後一個來源:新華社bash

能夠加個print把text打出來:dom

沒錯是想要的數據,在作分詞前,經過正則把各類亂七八糟的 標點符號還有數字都替換掉:函數

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

替換結果:工具

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


2.分詞與詞頻統計

由於咱們的數據都是中文的,這裏選用號稱: 作最好的 Python 中文分詞組件jieba庫

pip命令行安裝一波庫

pip install jieba
複製代碼

使用方法也很簡單:

cut方法參數:(分詞的字符串,cut_all是否打開全模式),全模式的意思 就是會這樣匹配,好比:大傻逼,會分詞成:大傻,傻逼和大傻逼 另外這裏還作了下判斷,長度大於等於2纔算一個詞。運行下把分詞 後數組遍歷下,能夠,沒毛病。

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

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

PS:括號裏的50表明取次數最多的前50個~

輸出結果

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

運行結果

能夠,意義不大的關鍵詞都過濾掉了,關於統計頻次目前只知道 這個套路,有其餘高大上的套路的歡迎在評論區留言告知~ 接着就是頻率統計,就是出現的百分比,這個能夠知己 經過jieba庫裏的**analyse模塊解決,這個東西支持停用詞** 文件過濾,就是把不想要的分詞都丟一個文件裏,分詞時會 自動過濾,調用的函數是:extract_tags

運行結果

參數topK表明提取多少個withWeight是否帶有頻率(權重), 另外可能你對停用詞文件比較好奇,其實內容很是簡單:

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


3.生成詞雲

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

pip命令行安裝一波庫

pip install wordcloud
複製代碼

用這個庫最關鍵的就是WordCloud構造函數

參數詳解

  • 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) #輸出到文件

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

調用下這個方法,把咱們前面的分詞後的數組傳進去:

輸出結果

能夠,很是有意思,此時此刻,忽然:

官方能夠的是這樣的例子:

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

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

這個字體是隨機顏色的,感受還差點什麼,不如讓字體跟隨 着圖片的顏色?可能會感覺更深入一些!獲取一波顏色數組, 設置下就能夠了:

執行下

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


小結

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


附:最終代碼(均可以在: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加羣交易屁眼 中的一個關鍵詞便可經過;

驗證經過後回覆 加羣 便可得到加羣連接(不要把機器人玩壞了!!!)~~~ 歡迎各類像我同樣的Py初學者,Py大神加入,一塊兒愉快地交流學♂習,van♂轉py。

相關文章
相關標籤/搜索