正好中秋節(jié)见间,為了應(yīng)景米诉,便利用
Python
來(lái)網(wǎng)上爬些中秋詩(shī)句來(lái)制作詞云,詞云可基于文本內(nèi)容的詞頻進(jìn)行可視化研究,是比較常見(jiàn)的文本分析可視化方法魏身。
按照慣例弛针,先上效果圖削茁。
一、制作步驟
- 1.數(shù)據(jù)爬取及清洗
- 2.數(shù)據(jù)加載制作詞云慰丛,主要包括分詞-統(tǒng)計(jì)詞頻-去停用詞-制作詞云
二瘾杭、數(shù)據(jù)爬取及清洗
2.1 詩(shī)句標(biāo)題列表爬取
爬蟲(chóng)目標(biāo)是古詩(shī)文網(wǎng),選擇中秋主題贤笆,跳轉(zhuǎn)到https://so.gushiwen.org/gushi/zhongqiu.aspx
鏈接讨阻,要先把這個(gè)列表頁(yè)面的所有詩(shī)句爬取下來(lái)钝吮。
看看響應(yīng)結(jié)果內(nèi)容,有兩個(gè)數(shù)據(jù)是我們需要的棘催,分別是href
中的屬性內(nèi)容耳标,需要用它來(lái)請(qǐng)求后續(xù)的具體詩(shī)句,還有就是詩(shī)句標(biāo)題纲仍。
定位在
div
為typecont
的標(biāo)簽,爬取的結(jié)果如下:
/shiwenv_632c5beb84eb.aspx
水調(diào)歌頭·明月幾時(shí)有(蘇軾)
/shiwenv_e38b61012996.aspx
中秋月(晏殊)
/shiwenv_4d2028af6aed.aspx
西江月·世事一場(chǎng)大夢(mèng)(蘇軾)
/shiwenv_2e73c8b1e52f.aspx
天竺寺八月十五日夜桂(皮日休)
/shiwenv_76c8331c8937.aspx
...
2.2 詩(shī)句內(nèi)容爬取
在拿到所有的詩(shī)句標(biāo)題列表之后明棍,根據(jù)其請(qǐng)求規(guī)律https://so.gushiwen.org/shiwenv_632c5beb84eb.aspx
寇僧,也就是https://so.gushiwen.org/
+href
進(jìn)行拼接來(lái)請(qǐng)求具體詩(shī)句內(nèi)容沸版,我們要做的對(duì)詩(shī)文列表進(jìn)行遍歷爬下所有數(shù)據(jù)即可视粮。
定位
div
為sons
標(biāo)簽下的div
為contson
標(biāo)簽橙凳,就可取出,拿到后把詩(shī)文合并為一行即可钓觉。具體爬取內(nèi)容打印如下:
水調(diào)歌頭·明月幾時(shí)有(蘇軾)::丙辰中秋坚踩,歡飲達(dá)旦,大醉批幌,作此篇嗓节,兼懷子由赦政。明月幾時(shí)有?把酒問(wèn)青天恢着。不知天上宮闕掰派,今夕是何年。我欲乘風(fēng)歸去靡羡,又恐瓊樓玉宇略步,高處不勝寒。起舞弄清影绽诚,何似在人間?(何似 一作:何時(shí)恩够;又恐 一作:惟 / 唯恐)轉(zhuǎn)朱閣蜂桶,低綺戶,照無(wú)眠扑媚。不應(yīng)有恨钦购,何事長(zhǎng)向別時(shí)圓?人有悲歡離合葵萎,月有陰晴圓缺唱凯,此事古難全。但愿人長(zhǎng)久卷雕,千里共嬋娟票从。(長(zhǎng)向 一作:偏向)
中秋月(晏殊)::十輪霜影轉(zhuǎn)庭梧,此夕羈人獨(dú)向隅浸间。未必素娥無(wú)悵恨吟榴,玉蟾清冷桂花孤吩翻。
...
2.3 具體代碼示例
Python爬蟲(chóng)需要兩個(gè)工具,
- Requests 庫(kù)细移,一款比較好用的HTTP庫(kù)熊锭,用于網(wǎng)絡(luò)請(qǐng)求缔刹。
- BeautifulSoup 庫(kù) 劣针,一款優(yōu)秀的HTML/XML解析庫(kù)捺典。
這些庫(kù)安裝方式為pip install bs4
从祝、pip install requests
from bs4 import BeautifulSoup
import requests
def Get_url():
url = 'https://so.gushiwen.org/gushi/zhongqiu.aspx'
head = {}
head['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
req = requests.get(url, headers=head)
soup = BeautifulSoup(req.content)
# print(req.text)
file=r'mid-autumn.txt'
# 獲取textarea標(biāo)簽中的內(nèi)容
for i in soup.find_all('div',class_='typecont'):
a = i.find_all('a')
span = i.find_all('span')
for index in range(0, len(a)):
print(a[index].attrs['href'])
print(span[index].text)
url2 = 'https://so.gushiwen.org/'
url3 = url2 + a[index].attrs['href']
req2 = requests.get(url3, headers=head)
soup2 = BeautifulSoup(req2.content)
song = soup2.find_all('div',class_='sons')
content = song[0].find_all('div',class_='contson')
print(content[0].text)
file=r'yongshi3.txt'
with open(file,'a+') as f:
# 以[題目::詩(shī)]的格式寫(xiě)入文件
f.write(span[index].text.strip()+"::"+content[0].text.replace("\n", "")+'\n')
f.close()
if __name__ == '__main__':
Get_url()
三牍陌、詞云制作
要先進(jìn)行分詞才能對(duì)每個(gè)詞進(jìn)行頻數(shù)統(tǒng)計(jì)毒涧, Python
下安裝分詞器命令為pip install jieba
,安裝后直接import jieba
即可仿吞。
import jieba
content = '丙辰中秋捡偏,歡飲達(dá)旦,大醉你虹,作此篇彤避,兼懷子由。明月幾時(shí)有挟伙?把酒問(wèn)青天模孩。不知天上宮闕榨咐,今夕是何年。我欲乘風(fēng)歸去块茁,又恐瓊樓玉宇,高處不勝寒永淌。起舞弄清影,何似在人間谭跨?(何似 一作:何時(shí)李滴;又恐 一作:惟 / 唯恐)轉(zhuǎn)朱閣所坯,低綺戶,照無(wú)眠堂湖。不應(yīng)有恨周瞎,何事長(zhǎng)向別時(shí)圓?人有悲歡離合酱讶,月有陰晴圓缺彼乌,此事古難全。但愿人長(zhǎng)久灶挟,千里共嬋娟毒租。(長(zhǎng)向 一作:偏向)'
segs = jieba.lcut(content)
print("/".join(segs))
可以看看分詞結(jié)果:
丙辰/中秋/稚铣,/歡飲/達(dá)旦/,/大醉/墅垮,/作此/篇/惕医,/兼懷子/由/。/明月/幾時(shí)/有/算色?/把酒/問(wèn)青天/抬伺。/不知/天上/宮闕/,/今夕/是/何年/灾梦。/我/欲/乘風(fēng)/歸去/峡钓,/又/恐/瓊樓玉宇/妓笙,/高處不勝/寒/能岩。/起舞/弄清/影/寞宫,/何似/在/人間/?/(/何似/ /一作/:/何時(shí)/捧灰;/又/恐/ /一作/:/惟/ /// /唯恐/)/轉(zhuǎn)朱閣/淆九,/低綺戶/,/照無(wú)眠/毛俏。/不/應(yīng)有/恨/,/何事/長(zhǎng)向/別時(shí)圓/饲窿?/人有/悲歡離合/煌寇,/月/有/陰晴圓/缺/,/此事/古難全/逾雄。/但愿人長(zhǎng)久/阀溶,/千里/共/嬋娟/。/(/長(zhǎng)向/ /一作/:/偏向/)
然后我們還需要的是制作詞云用的庫(kù)鸦泳,也要先安裝pip install wordcloud
银锻,對(duì)數(shù)據(jù)進(jìn)行分詞和去停用詞后的操作其實(shí)就是對(duì)這個(gè)工具的使用了,完整的示例如下:
import jieba
import pandas as pd
import numpy as np
from imageio import imread
from wordcloud import WordCloud,ImageColorGenerator
import matplotlib.pyplot as plt
from gensim import corpora, models, similarities
import gensim
#定義停用詞
stopwords=pd.read_csv("./stopwords.txt",index_col=False,quoting=3,sep="\t",names=['stopword'], encoding='utf-8')
#stopwords=stopwords['stopword'].values
#加載語(yǔ)料
df = pd.read_csv('./mid-autumn.csv', encoding='utf-8')
print(df.head(5))
#刪除nan行
df.dropna(inplace=True)
lines = df.content.values.tolist()
print(lines[0].split('::')[1])
#用jieba進(jìn)行分詞操作
segment=[]
#分詞
for line in lines:
try:
line = line.split('::')[1]
segs = jieba.lcut(line)
segs = [v for v in segs if not str(v).isdigit()] #過(guò)濾數(shù)字
segs = list(filter(lambda x:x.strip(), segs)) #過(guò)濾空格
#segs = list(filter(lambda x:x not in stopwords, segs)) #去掉停用詞
for seg in segs:
if len(seg)>1 and seg!='\r\n':
segment.append(seg)
except Exception:
print(line)
continue
#分詞后加入一個(gè)新的DataFrame
words_df=pd.DataFrame({'segment':segment})
#安裝關(guān)鍵字groupby分組統(tǒng)計(jì)詞頻做鹰,并按照計(jì)數(shù)降序排序
words_stat=words_df.groupby(by=['segment'])['segment'].agg({"計(jì)數(shù)":np.size})
words_stat=words_stat.reset_index().sort_values(by=["計(jì)數(shù)"],ascending=False)
#分組之后去掉停用詞
words_stat=words_stat[~words_stat.segment.isin(stopwords.stopword)]
#print(words_stat)
#下面是重點(diǎn)击纬,繪制wordcloud詞云,這一提供2種方式
#第一種是默認(rèn)的樣式
#定義wordcloud中字體文件的路徑
simhei = "./car.ttf"
wordcloud=WordCloud(font_path=simhei,background_color="white",max_font_size=80)
word_frequence = {x[0]:x[1] for x in words_stat.head(1000).values}
wordcloud=wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud)
wordcloud.to_file(r'wordcloud_1.jpg') #保存結(jié)果
#第二種是自定義圖片
text = " ".join(words_stat['segment'].head(100).astype(str))
abel_mask = imread(r"./china.jpg") #這里設(shè)置了一張中國(guó)地圖
wordcloud2 = WordCloud(background_color='white', # 設(shè)置背景顏色
mask = abel_mask, # 設(shè)置背景圖片
max_words = 3000, # 設(shè)置最大現(xiàn)實(shí)的字?jǐn)?shù)
font_path = simhei, # 設(shè)置字體格式
width=2048,
height=1024,
scale=4.0,
max_font_size= 100, # 字體最大值
random_state=42).generate(text)
# 根據(jù)圖片生成詞云顏色
image_colors = ImageColorGenerator(abel_mask)
wordcloud2.recolor(color_func=image_colors)
# 以下代碼顯示圖片
plt.imshow(wordcloud2)
plt.axis("off")
plt.show()
wordcloud2.to_file(r'wordcloud_2.jpg') #保存結(jié)果
第二種自定義的效果如下圖:
代碼已經(jīng)對(duì)應(yīng)爬取的數(shù)據(jù)都已上傳github
钾麸,對(duì)應(yīng)鏈接為WordCloud更振。
因?yàn)榕廊〉墓旁?shī)文網(wǎng)的數(shù)據(jù),如有違規(guī)請(qǐng)通知?jiǎng)h掉饭尝。