概述
有時候我們抓不到一些文章裡面的重點,python裡jieba
庫分詞很好的為我們提供了一個好的解決方案。下面就講一個實際使用的一個例子來說明。
首先,我們要將網頁的內容請求並解析出來,下面是政府工作報告的路徑:
利用request
庫的get(url)
方法請求拿到響應的資料,發現報告文字內容大多在段落p
標籤中。可以引用BeautifulSoup
的find_all()
將p
標籤中所有標籤拿到,再獲取裡面的內容。下面先封裝一下:
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複製程式碼
詞雲的使用
使用詞雲,首先得準備一張背景圖片,這裡使用了前面比較火的小豬佩奇的圖片。
要讀入圖片,要使用matplotlib
庫中pyplot
模組的imread()
方法。
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')複製程式碼
下面是完整的程式碼:
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)複製程式碼