一句話歸納本文:html
爬取2018政府工做報告,經過**jieba
**庫進行分詞後作詞頻統計, 最後使用 wordcloud
庫製做naive詞雲,很是有意思~python
引言:git
昨晚寫完上一篇把爬取到的數據寫入到Excel後,在回家的路上我就盤算着 折騰點有趣的東西玩玩——簡單的數據分析:分詞,統計詞頻,而後作成詞雲; 分析點什麼玩玩好呢?想起之前看到過一個梗,有人把汪峯唱過的歌的歌詞作 詞頻統計,而後自嗨做詞了一首汪峯Style的歌,2333,原本早上想弄的, 發現處理起來有些麻煩,歌詞源考慮了下爬蝦米音樂,可是有些歌詞不規範, 這個多點什麼,那個少點什麼,處理起來挺麻煩的,就放棄了,後面在 看文章的時候發現了一個有點意思的例子: Python文本分析:2016年政府工做報告有哪些高頻詞? 3月5日不是剛召開完第十三屆全國人民表明大會嗎?會後發佈了: 2018政府工做報告,做爲一個積極愛國分子,寫個Python腳原本分析 分析高頻詞,弄個詞雲學習學習,豈不美哉~開始本節內容!github
百度隨手搜下關鍵字,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)
複製代碼
替換結果:工具
到此,用做分詞的字符串就準備好了~
由於咱們的數據都是中文的,這裏選用號稱: 作最好的 Python 中文分詞組件
的 jieba庫
pip命令行安裝一波庫:
pip install jieba
複製代碼
使用方法也很簡單:
cut方法參數:(分詞的字符串,cut_all是否打開全模式),全模式的意思 就是會這樣匹配,好比:大傻逼,會分詞成:大傻,傻逼和大傻逼 另外這裏還作了下判斷,長度大於等於2纔算一個詞。運行下把分詞 後數組遍歷下,能夠,沒毛病。
接着就到同此詞頻了,這裏的統計的話分兩個選項吧, 你看你是要統計詞出現的頻次,仍是出現的頻率,這裏就先統計下 頻次吧,就是詞出現的次數,看到網上的套路都是經過:
**collections
模塊的Counter
**類來實現的,Counter是一個無序的容器 類型,以字典的鍵值對形式存儲,元素爲key,計數爲value,通常 用來跟蹤值出現的次數。
PS:括號裏的50表明取次數最多的前50個~
輸出結果:
頻次拿到了,可是有個問題,咱們發現有一些關鍵詞是沒什麼意義 的,好比推動,提升等等動詞,咱們須要對數據進行過濾(貌似有 個專業名詞叫:數據清洗),最簡單的就是定義一個過濾列表, 把想過濾的詞都丟進去,分詞後遍歷一波,把在過濾列表中存在 的元素進行移除:
運行結果:
能夠,意義不大的關鍵詞都過濾掉了,關於統計頻次目前只知道 這個套路,有其餘高大上的套路的歡迎在評論區留言告知~ 接着就是頻率統計,就是出現的百分比,這個能夠知己 經過jieba庫裏的**analyse
模塊解決,這個東西支持停用詞** 文件過濾,就是把不想要的分詞都丟一個文件裏,分詞時會 自動過濾,調用的函數是:extract_tags
運行結果:
參數topK表明提取多少個,withWeight是否帶有頻率(權重), 另外可能你對停用詞文件比較好奇,其實內容很是簡單:
分詞與詞頻問題就已經解決了,接下來搞詞雲了。
網上搜詞雲的庫基本都用的wordcloud這個庫,就直接拿這個開刀吧!
pip命令行安裝一波庫:
pip install wordcloud
複製代碼
用這個庫最關鍵的就是WordCloud構造函數:
參數詳解:
經常使用的幾個方法:
看得我真是一臉懵逼,直接寫個最簡單的例子,幫助咱們上手~
調用下這個方法,把咱們前面的分詞後的數組傳進去:
輸出結果:
能夠,很是有意思,此時此刻,忽然:
官方能夠的是這樣的例子:
嘖嘖,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,驗證信息裏包含: Python,python,py,Py,加羣,交易,屁眼 中的一個關鍵詞便可經過;
驗證經過後回覆 加羣 便可得到加羣連接(不要把機器人玩壞了!!!)~~~ 歡迎各類像我同樣的Py初學者,Py大神加入,一塊兒愉快地交流學♂習,van♂轉py。