一句話概括本文:
爬取2018政府工作報告,通過**jieba
**庫進行分詞後做詞頻統計,
最後使用 wordcloud
庫製作naive詞雲,非常有意思~
引言:
昨晚寫完上一篇把爬取到的資料寫入到Excel後,在回家的路上我就盤算著 折騰點有趣的東西玩玩——簡單的資料分析:分詞,統計詞頻,然後做成詞雲; 分析點什麼玩玩好呢?想起以前看到過一個梗,有人把汪峰唱過的歌的歌詞做 詞頻統計,然後自嗨作詞了一首汪峰Style的歌,2333,本來早上想弄的, 發現處理起來有些麻煩,歌詞源考慮了下爬蝦米音樂,但是有些歌詞不規範, 這個多點什麼,那個少點什麼,處理起來挺麻煩的,就放棄了,後面在 看文章的時候發現了一個有點意思的例子: Python文字分析:2016年政府工作報告有哪些高頻詞? 3月5日不是剛召開完第十三屆全國人民代表大會嗎?會後釋出了: 2018政府工作報告,作為一個積極愛國分子,寫個Python指令碼來分析 分析高頻詞,弄個詞雲學習學習,豈不美哉~開始本節內容!
1.資料準備
百度隨手搜下關鍵字,2018政府工作報告,隨手翻開一個: 2018政府工作報告全文(推薦收藏):news.ifeng.com/a/20180305/…
這種就非常簡單了,直接Element看所需的資料節點:
div包著一堆p標籤,拿到p標籤裡的text就可以了,這裡過濾掉最後一個來源:新華社
可以加個print把text打出來:
沒錯是想要的資料,在做分詞前,通過正則把各種亂七八糟的 標點符號還有數字都替換掉:
punctuation_pattern = re.compile('[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?“”、~@#¥%……&*()(\d+)]+')
result = punctuation_pattern.sub("", extract_text(news_url))
print(result)
複製程式碼
替換結果:
到此,用作分詞的字串就準備好了~
2.分詞與詞頻統計
因為我們的資料都是中文的,這裡選用號稱:
做最好的 Python 中文分片語件
的 jieba庫
- Github倉庫:github.com/fxsjy/jieba
- 官方文件:pypi.python.org/pypi/jieba/
- Python中文分詞 jieba 十五分鐘入門與進階:blog.csdn.net/fontthrone/…
pip命令列安裝一波庫:
pip install jieba
複製程式碼
使用方法也很簡單:
cut方法引數:(分詞的字串,cut_all是否開啟全模式),全模式的意思 就是會這樣匹配,比如:大傻逼,會分詞成:大傻,傻逼和大傻逼 另外這裡還做了下判斷,長度大於等於2才算一個詞。執行下把分詞 後陣列遍歷下,可以,沒毛病。
接著就到同此詞頻了,這裡的統計的話分兩個選項吧, 你看你是要統計詞出現的頻次,還是出現的頻率,這裡就先統計下 頻次吧,就是詞出現的次數,看到網上的套路都是通過:
**collections
模組的Counter
**類來實現的,Counter是一個無序的容器
型別,以字典的鍵值對形式儲存,元素為key,計數為value,一般
用來跟蹤值出現的次數。
PS:括號裡的50代表取次數最多的前50個~
輸出結果:
頻次拿到了,但是有個問題,我們發現有一些關鍵詞是沒什麼意義 的,比如推進,提高等等動詞,我們需要對資料進行過濾(貌似有 個專業名詞叫:資料清洗),最簡單的就是定義一個過濾列表, 把想過濾的詞都丟進去,分詞後遍歷一波,把在過濾列表中存在 的元素進行移除:
執行結果:
可以,意義不大的關鍵詞都過濾掉了,關於統計頻次目前只知道
這個套路,有其他高大上的套路的歡迎在評論區留言告知~
接著就是頻率統計,就是出現的百分比,這個可以知己
通過jieba庫裡的**analyse
模組解決,這個東西支援停用詞**
檔案過濾,就是把不想要的分詞都丟一個檔案裡,分詞時會
自動過濾,呼叫的函式是:extract_tags
執行結果:
引數topK代表提取多少個,withWeight是否帶有頻率(權重), 另外可能你對停用詞檔案比較好奇,其實內容非常簡單:
分詞與詞頻問題就已經解決了,接下來搞詞雲了。
3.生成詞雲
網上搜詞雲的庫基本都用的wordcloud這個庫,就直接拿這個開刀吧!
- Github倉庫:github.com/amueller/wo…
- 官方部落格:amueller.github.io/word_cloud/
- Python詞雲 wordcloud 十五分鐘入門與進階: blog.csdn.net/fontthrone/…
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,驗證資訊裡包含: Python,python,py,Py,加群,交易,屁眼 中的一個關鍵詞即可通過;
驗證通過後回覆 加群 即可獲得加群連結(不要把機器人玩壞了!!!)~~~ 歡迎各種像我一樣的Py初學者,Py大神加入,一起愉快地交流學♂習,van♂轉py。