1. 程式人生 > >Python爬取《三國演義》並且製作詞雲

Python爬取《三國演義》並且製作詞雲

前提廢話

之前關注了一個python的公眾號,每天都會推送文章,每次看都會看到他有使用wordcloud這個庫來生成好看的詞雲,於是乎,我就學習了jieba分詞和wordcloud詞雲。

這裡給win系統的小夥伴提示下,如果你的pip install wordcloud 時候出現了確實VC++檔案時,提示你需要安裝VC++,但是很多人肯定是不願意安裝的,所以,我就找到了一個直接安裝wordcloud庫的方法

wordcloud安裝

win系統下:
可以直接點選,然後找到wordcloud庫,下載對應的版本,然後放在方便的盤中,使用cmd進入該盤中,然後輸入pip install wordcloud-1.2.1-cp36-cp36m-win_amd64.whl(後面加你下載的版本即可)
這樣就成功的安裝好了

爬蟲部分

之前寒假的時候寫過一個小說下載器,之前就是通過免費小說網站直接爬取所有章節,這一部分就不詳細說明了,不懂的小夥伴可以點選檢視我之前的部落格
直接附上程式碼:

url = 'https://www.ybdu.com/xiaoshuo/2/2746/'
head = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'}
file = open('test.txt','w')

html = requests.get(url,params=head)
html.encoding='gbk'
wenzhang_select = re.compile(r'<ul class="mulu_list">(.*?)</ul>',re.S) wenzhang = wenzhang_select.search(html.text) """soup = BeautifulSoup(html,"html.parser") list_old = soup.find(class_= "mulu_list") list_new = list_old.find_all('li')""" select = re.compile(r'<li>(.+?)</li>'
) list_new = select.findall(wenzhang[0]) for i in list_new: id_select = re.compile(r'<a href="(.*?)">(.*?)</a>') one_url = url + id_select.findall(i)[0][0] one_html = requests.get(one_url,params=head) one_html.encoding = 'gbk' soup = BeautifulSoup(one_html.text,"html.parser") try: file.write(soup.find(class_ = 'h1title').h1.text + '\n') except BaseException: print('Sorry1') try: file.write((soup.find(class_ = 'contentbox').text.split('\n')[1].replace(' ','\n')) + '\n') except BaseException: print('Sorry2') file.close()

分詞和生成詞雲

這一部分,我主要想找出人名的詞頻,但是直接使用jieba的分詞,會分出來很多不是你想要的詞,所以我就找到了所有的三國裡的人名連結(當然不一定是全部人名),然後使用自定義字典對文字進行分詞,分詞後還是有很多多餘的標點、空格等等,我直接使用索引略過了那些,最後根據一張貓貓的照片生成了一般的詞雲圖和顏色與照片一致的詞雲圖。
程式碼如下:

text_read = open('test.txt').read()
jieba.load_userdict('test_dic.txt')
c = jieba.cut(text_read, cut_all=False, HMM=True)
word_list = []
for i in c:
    word_list.append(i)
word_dic = {}
for i in word_list:
    if i not in word_dic:
        word_dic[i] = 1
    else :
        word_dic[i] += 1
over_list = sorted(word_dic.items(), key = lambda x : x[1], reverse=True)

font_path = "D:\Fonts\simkai.ttf"#字型路徑
dizi_path = "D:\dizi.jpg"#底子圖片路徑

back_coloring = imread(dizi_path)#使用PIL來讀取影象

wc = WordCloud(background_color="white", #背景顏色
               font_path=font_path, #字型選擇
               max_words=1000, #最大詞數
               mask=back_coloring ,#背景圖片
               max_font_size=100, #最大字型大小
               width=1000, height=860, margin=2)

wc.fit_words(dict(over_list[20:]))

plt.figure()
#顯示圖片
plt.imshow(wc)
plt.axis("off")
plt.show()
#儲存圖片
wc.to_file(path.join(path.dirname(__file__), 'wordcloud1.png'))
#改變顏色
image_color = ImageColorGenerator(back_coloring)#從背景圖片生成顏色值
plt.imshow(wc.recolor(color_func=image_color))#使用新的顏色值佈局著色
plt.axis('off')#關閉座標軸
#繪製背景顏色的詞雲
plt.figure()
plt.imshow(back_coloring, cmap = plt.cm.gray)
plt.axis('off')
plt.show()
wc.to_file(path.join(path.dirname(__file__), 'wordcloud2.png'))

最後附上圖片

背景圖:
這裡寫圖片描述
初始詞雲:
這裡寫圖片描述
背景色詞雲:
這裡寫圖片描述
PS:
古文版的《三國演義》中出現最多的是曹操、孔明、玄德,可以看出這幾個人是書中的重點人物,有時候把一些枯燥的資料視覺化以後還是很好玩的,以後會多多嘗試。