前言:
? 一切不經(jīng)過項(xiàng)目驗(yàn)證的代碼都是耍流氓,今天我們就通過一個(gè)簡單的招聘網(wǎng)站的數(shù)據(jù)歸檔(數(shù)據(jù)來源請(qǐng)參考我的上一篇文章)進(jìn)行當(dāng)前熱門崗位的大數(shù)據(jù)分析,最后以wordcloud進(jìn)行顯示。幫你分析一名合格的Python從業(yè)者到底要掌握什么樣的技能。
? 當(dāng)然,這篇文章說是大數(shù)據(jù)是有點(diǎn)嚴(yán)重夸張的,看官勿深糾。
相關(guān)代碼下載地址請(qǐng)見文末
整理歸檔文件
? 上一篇文章中,我們采集了拉勾網(wǎng)的崗位數(shù)據(jù),保存到了代碼目錄的./data中,我們要做的就是對(duì)文件進(jìn)行合并, 當(dāng)然如果你只想了解詞云的使用, 明哥也在代碼中上傳了文本文件,你可以直接跳過這一部分,進(jìn)入讀取文件部分。
我們先新建一個(gè)createTest.py文件,用于將原有的崗位文件進(jìn)行合并。代碼如下:
# -*- coding: utf-8 -*-
# 生成txt文本文章
#author
import os
def file_name(file_dir):
for root, dirs, files in os.walk(file_dir):
return files
files = file_name('./data/')
text = ''.join([ open('./data/%s' %f,'r').read() for f in files ]
with open('lagou-job.txt','w+',encoding='utf-8') as lagou:
lagou.write(text)
關(guān)鍵函數(shù): file_name(),傳入指定目錄文件,返回目錄下的文件名列表,因?yàn)閐ata目錄中我只保存了崗位語言件,所以不需要再進(jìn)行過濾。
text = ''.join([ open('./data/%s' %f,'r').read() for f in files ] 循環(huán)讀出所有的文件,并合并成一個(gè)字符串。
最后寫入到名為lagou-job.txt 文件當(dāng)中。
執(zhí)行命令
python3 createTxt.py
執(zhí)行結(jié)果如下。
讀取數(shù)據(jù)文件
text=''
with open('./lagou-job.txt','r') as f:
text=f.read()
f.close()
print(text[:100])
輸出結(jié)果:
職位描述:崗位職責(zé):1.展開機(jī)器學(xué)習(xí)/深度學(xué)習(xí)等相關(guān)領(lǐng)域研究和開發(fā)工作;2.負(fù)責(zé)從事深度學(xué)習(xí)框架搭建,包括機(jī)器學(xué)習(xí)、圖像處理等的算法和系統(tǒng)研發(fā);3.支持公司相關(guān)產(chǎn)品深度學(xué)習(xí)相關(guān)研究;崗位要求:1.機(jī)器
jieba分詞
上面的輸出結(jié)果肯定不是我們想要的東西,那么我們就要通過第三方模塊“jeba”分詞功能來進(jìn)行處理。
#cell-2
import jieba
words = jieba.lcut(text)
cuted=' '.join(words)
print(cuted[:100])
輸出被空格分開的文本:
崗位職責(zé) : 1 . 參與 分布式 爬蟲 和 數(shù)據(jù) 采集 系統(tǒng) 的 架構(gòu)設(shè)計(jì) 和 開發(fā) ; 2 . 負(fù)責(zé) 網(wǎng)絡(luò) 數(shù)據(jù) 抓取 規(guī)劃 、 清洗 以及 匯總 的 開發(fā) 工作 ;
安裝wordcloud和matplotlib
推薦直接用pip3 install wordcloud進(jìn)行安裝。
conda的安裝比較慢,一般明哥在安裝的時(shí)候都是搭建一套虛擬環(huán)境,最后用pip進(jìn)行安裝。
如果是conda則要使用-c切換通道為conda-forge,命令是
conda install -c conda-forge wordcloud可能比較慢,耐心等就好。
matplotlib視覺化模塊官方網(wǎng)址
安裝命令pip3 install matplotlib或conda install matplotlib。
生成詞云對(duì)象
from wordcloud import WordCloud
fontpath='/System/Library/Fonts/STHeiti Medium.ttc' #當(dāng)前字體文件為MAC下所有,如果WIN環(huán)境下,請(qǐng)?zhí)鎿Q文件路徑
wc = WordCloud(font_path=fontpath, # 設(shè)置字體
background_color="white", # 背景顏色
max_words=1000, # 詞云顯示的最大詞數(shù)
max_font_size=500, # 字體最大值
min_font_size=20, #字體最小值
random_state=42, #隨機(jī)數(shù)
collocations=False, #避免重復(fù)單詞
width=1600,height=1200,margin=10, #圖像寬高,字間距,需要配合下面的plt.figure(dpi=xx)放縮才有效
)
wc.generate(cuted)
首先,默認(rèn)情況wordcloud是不支持中文顯示的,所以要先添加一個(gè)中文字體文件,一般是.ttf或.ttc格式,你可以使用本機(jī)中文字體進(jìn)行替代,(網(wǎng)上大部分都是收費(fèi),或因版權(quán)問題被下架了)
WordCloud(...)命令包含了很多參數(shù),其中就包含了我們上面設(shè)定的字體路徑font_path。
注意這里width=1600,height=1200,margin=100圖像寬高只是原始圖像的大小,至于后面顯示出來的時(shí)候可能還會(huì)被放縮。它的更多參數(shù)可以查看 wordcloud官方WordCloud方法說明
顯示詞云圖
我們用matplotlib的imshow就是image-show把圖片顯示出來。
import matplotlib.pyplot as plt
plt.figure(dpi=200) #通過這里可以放大或縮小
plt.imshow(wc, interpolation='catrom',vmax=1000)
plt.axis("off") #隱藏坐標(biāo)
可以得到如下圖效果:
去除冗余單詞
我們可以利用jieba的del_word方法去掉冗余單詞。
#cell-2
import jieba
removes =['熟悉', '技術(shù)', '經(jīng)驗(yàn)']
for w in removes:
jieba.del_word(w)
words = jieba.lcut(text)
cuted = ' '.join(words)
print(cuted[:100])
這里用for循環(huán)依次刪除了各個(gè)冗余詞,也可不用for循環(huán),改為lcut之后對(duì)words進(jìn)行處理:
words = jieba.lcut(text)
words = [w for w in words if w not in removes]
整體運(yùn)行,得到下圖:
區(qū)分中英文
如果我們只關(guān)注英文技術(shù)點(diǎn),比如python,tensorflow等,那就忽略中文內(nèi)容。
使用正則表達(dá)式來匹配提取哪些由az小寫字母和AZ大寫字母加上0~9數(shù)字組成的單詞。
修改cell-2如下:
#cell-2
import jieba
words = jieba.lcut(text)
import re
pattern = re.compile(r'^[a-zA-Z0-1]+$')
words = [w for w in words if pattern.match(w)]
cuted = ' '.join(words)
print(cuted[:100])
完整執(zhí)行,得到下圖:
我們可以從這個(gè)圖中看到人工智能技術(shù)相關(guān)職位所需要的掌握的主要技能。
改變?cè)煨?/h2>
我們讓單詞按照特定的造型來排列。首先我們需要一張?jiān)煨蛨D片,下面是一張AI文字造型圖片,請(qǐng)把它右鍵另存為mask.png文件。
[圖片上傳失敗...(image-9f6c5b-1586125153452)]
前面在wc = WordCloud(font_path=fontpath...中有很多參數(shù)可以設(shè)置,其中就有mask遮罩參數(shù),可以指定一張讀取的圖片數(shù)據(jù),根據(jù)官方說明,這個(gè)數(shù)據(jù)應(yīng)該是nd-array格式,這是一個(gè)多維數(shù)組格式(N-dimensional Array)。
我們使用PIL模塊中的Image.open('...')可以讀取圖片,然后利用numpy來轉(zhuǎn)換為nd-arry格式。
修改cell-3,讀取圖片并增加mask參數(shù):
#cell-3
from wordcloud import WordCloud
fontpath='SourceHanSansCN-Regular.otf'
import numpy as np
from PIL import Image
aimask=np.array(Image.open("mask.png"))
wc = WordCloud(font_path=fontpath, # 設(shè)置字體
background_color="white", # 背景顏色
max_words=1000, # 詞云顯示的最大詞數(shù)
max_font_size=100, # 字體最大值
min_font_size=5, #字體最小值
random_state=42, #隨機(jī)數(shù)
collocations=False, #避免重復(fù)單詞
mask=aimask, #造型遮蓋
width=1600,height=1200,margin=2, #圖像寬高,字間距,需要配合下面的plt.figure(dpi=xx)放縮才有效
)
wc.generate(cuted)
完整執(zhí)行后得到下圖:
可以看到原本圖片上白色的部分被留空,有顏色的部分才會(huì)放置單詞。
改進(jìn)顏色
默認(rèn)情況圖片上文字的顏色都是隨機(jī)的,我們可以使用圖片來控制文字的顏色。
WordCloud方法提供了一個(gè)color_func顏色函數(shù)的參數(shù),用一個(gè)函數(shù)來改變每個(gè)詞的顏色,在這里我們直接使用上面深色的AI圖片顏色來控制。
from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
fontpath='/System/Library/Fonts/STHeiti Medium.ttc'
import numpy as np
from PIL import Image
aimask=np.array(Image.open("mask.png"))
genclr=ImageColorGenerator(aimask)
wc = WordCloud(font_path=fontpath, # 設(shè)置字體
background_color="white", # 背景顏色
max_words=1000, # 詞云顯示的最大詞數(shù)
max_font_size=100, # 字體最大值
min_font_size=5, #字體最小值
random_state=42, #隨機(jī)數(shù)
collocations=False, #避免重復(fù)單詞
mask=aimask, #造型遮蓋
color_func=genclr,
width=1600,height=1200,margin=2, #圖像寬高,字間距,需要配合下面的plt.figure(dpi=xx)放縮才有效
)
wc.generate(cuted)
在上面,我們引入了from wordcloud import ImageColorGenerator方法,它是直接用來生成一個(gè)color_func顏色函數(shù)的,它括號(hào)里需要一個(gè)nd-array多維數(shù)組的圖像,恰好我們上面的aimask就是這個(gè)格式,直接用就可以。
重新運(yùn)行得到最開始看到的圖,
和原圖對(duì)比,就能看到文字顏色的規(guī)律了:
匯總
- 生成文件
- 讀取文件
- jieba分詞
- 利用re正則表達(dá)式選出英文單詞
- 生成詞云對(duì)象,利用圖片遮罩形狀和改變顏色
- 使用Matplotlib來顯示圖片
作者相關(guān):
本系列教程及源碼地址:點(diǎn)擊訪問
最后:如果你正在學(xué)習(xí)Python的路上,或者準(zhǔn)備打算學(xué)習(xí)Python、明哥會(huì)陪著你陪你一起共同進(jìn)步!
手打不易,有用的話,請(qǐng)記得關(guān)注轉(zhuǎn)發(fā)。