資料處理-過濾冗餘的關鍵詞-plotly圖形化
ofollow,noindex">智慧決策上手系列教程索引
我們得到了很多的關鍵詞, '演算法', '學習', 'python', '熟悉', '人工智慧', '經驗', '優先', '職位', '機器', '相關',...
,其中明顯的, '熟悉'、'職位'、'優先'、'相關'
這些詞是絕對沒有意義的。我們可以把它過濾掉。
如果您還沒有抓取,請從這裡直接下載100個json擱置職位檔案 密碼:tfdv
全部程式碼如下(注意檔案目錄需要修改):
#cell-1 import jieba def readDetail(fileName): with open(fileName, 'r') as f: job = json.load(f) details = job['details'].lower() details = details.replace(' ', '').replace('\xa0', '') return details import os #cell-2 text = '' files = os.listdir('./data/lagou_ai/jobs1000/') jobCount = 0 for n in range(0, 1000): if not files[n].find('.json')==-1: details = readDetail('./data/lagou_ai/jobs1000/' + files[n]) if details.find('python') != -1 or details.find('tensorflow') != -1: jobCount += 1 text += details print('>>Got jobs:', jobCount) #cell-3 import jieba.analyse import pandas as pd result=[] for word, weight in jieba.analyse.extract_tags(text, topK=100, withWeight=True): result.append(word) print(result)
去掉冗餘單詞
上面程式碼可以輸出所有的關鍵詞陣列。我們複製它,把多餘的單詞刪除。比如我選了28個:
mylist = [ '演算法', 'python', '經驗', '機器', '深度', 'java', 'c++', '資料探勘', '自然語言', '程式設計','資料分析', '數學', 'linux', 'nlp', 'tensorflow', 'spark', '文字', '碩士', 'hadoop','caffe', '視覺', '本科', '語音', '語義', '問題', '神經網路', '資料結構', '影象']
我們新增兩個列表用於存放words和weights,修改cell-3程式碼如下:
import jieba.analyse import pandas as pd keywords = [] weights=[] mylist = [ '演算法', 'python', '經驗', '機器', '深度', 'java', 'c++', '資料探勘', '自然語言', '程式設計', '資料分析', '數學', 'linux', 'nlp', 'tensorflow', 'spark', '文字', '碩士', 'hadoop', 'caffe', '視覺', '本科', '語音', '語義', '問題', '神經網路', '資料結構', '影象' ] for word, weight in jieba.analyse.extract_tags( text, topK=100, withWeight=True): if word in mylist: keywords.append(word) weights.append(weight) print(keywords,weights)
執行後可以輸出兩個列表 ['演算法', 'python', '經驗', '機器', ...] [0.16280807037359346, 0.09640941534596774, ...
使用圖表展示
我們使用圖形化外掛plotly,plot英文是繪製圖表的意思, 官方站點幫助文件點這裡 。
命令列安裝:
conda install -f plotly
然後我們增加一個cell-4,使用下面程式碼:
#cell-4 import plotly import plotly.graph_objs as go plotly.offline.init_notebook_mode(connected=False) plotly.offline.iplot({ "data": [go.Scatter(x=keywords, y=weights)], "layout": go.Layout(title="拉勾網人工智慧職業關鍵詞分佈") })
幾點說明:
- 我們使用的是offline版本,plotly預設是online線上版本,你需要到它的官網註冊賬號進行設定等等,麻煩一些,但也可以獲得更強大功能。
- 另外,這裡使用的是
iplot(...)
而不是很多教程中看到的plot(...)
,這是因為我們需要在Jupyter Notebook中直接顯示圖表。 - go是graph object繪圖物件的意思,go.Scatter是繪製折線圖,x和y是橫向和豎向的座標list列表。
執行後得到下圖(如果你的沒有出現圖而是出現一塊空白,請嘗試重新整理頁面再試):

image.png
改為柱狀圖
稍微調整一下,用go.Bar我們就可以換為更容易理解的柱狀圖:
import plotly import plotly.graph_objs as go plotly.offline.init_notebook_mode(connected=False) plotly.offline.iplot({ "data": [go.Bar(x=keywords, y=weights)], "layout": go.Layout(title="拉勾網人工智慧職業關鍵詞分佈") })
輸出得到:

image.png
合併同類詞義
我們注意到 自然語言
和 nlp
其實是一回事, 文字、語義
也和它們直接相關;另外 深度(學習)
和 神經網路
也基本一個意思,同樣的還有 資料分析
和 資料探勘
, 影象
和 視覺
,我們把它們合併一下。
在上面新增一個新的cell-3.5,程式碼如下:
def mergeItem(wd1,wd2): newkey=wd1+'+'+wd2 n1=keywords.index(wd1) keywords[n1]=newkey n2=keywords.index(wd2) weights[n1]=weights[n1]+weights[n2] del weights[n2] del keywords[n2] return newkey mergeItem('神經網路','深度') mergeItem('資料分析','資料探勘') mergeItem('影象','視覺') a=mergeItem('自然語言','nlp') a=mergeItem(a,'文字') a=mergeItem(a,'語義')
mergeItem的思路是先找到兩個單詞在列表中的位置n1,n2,然後做單詞拼合或者數字加法,最後再把第二個單詞刪除。
從cell-3開始往下執行(或者全部執行),得到如下圖:

image.png
重新排序
上這個圖的順序有些亂,我們需要重新拍了一下。
在圖表cell-4前面新增cell-3.8
comb=zip(keywords,weights) def comp(item): return item[1] comb=sorted(comb,reverse=True,key=comp) keywords=[v for v,_ in comb] weights=[v for _,v in comb]
這個程式碼雖然少但是比較難說明:
- 首先我們有keywords和weights兩個陣列,順序一一對應,我們不能隨便的把它們單獨排序,那就亂掉了。
-
zip
方法是把兩個數組合併成一個由元組構成的新陣列,舉個例子就是comb=zip(['a','b'],[1,2])
就得到了comb是[('a',1),('b',2)]
,可以用下面程式碼測試這個效果:a=['a','b'] b=[1,2] c=zip(a,b) for m in c: print(m)
-
sorted(...)
可以對元組構成的列表進行排序,它不僅可以把[('a',10),('b',8)]
排成[('b',8),('a',10)]
,甚至能排[('a',9,100),('b',2,300)]
這樣的三維元組陣列。 - 那麼問題來了,兩維元組或者三維元組要排序,先參照第一個元素排呢?第一個a或b,第二個9或10,第三個100或300?能不能直接按照第二個排呢?
-
sorted(...,key=...)
這個key就是優先參照的元素,但要用一個函式comb來表示,這個函式接受一個引數def comb(item)
,返回一個元素return item[1]
。 - 排完序還要把
[('a',1),('b',2)]
拆解成['a','b'],[1,2]
,我們用了一個簡寫的for迴圈[v for v,_ in comb]
直接返回了comb中每個元組的第一個元素。v,_
是隻取第一個,忽略第二個,同理,_,v
是隻取第二個,忽略第一個。[關於下劃線更多用法看這裡]( Python中下劃線的作用-_.
從cell-3重新往下執行所有程式碼,得到如下圖:

image.png
關於lambada
單獨定義的函式 def comb(...)
還可以用lambada簡寫
def comp(item): return item[1] comb=sorted(comb,reverse=True,key=comp)
合併為
comb=sorted(comb,reverse=True,key=lambda k:k[1])
從上面看出, lambda 引數:返回值
,對應於 def hanshu(引數):return 返回值
這樣的格式。
全部程式碼
下面是全部程式碼:
#cell-1 定義讀取檔案方法 import jieba def readDetail(fileName): with open(fileName, 'r') as f: job = json.load(f) details = job['details'].lower() details = details.replace(' ', '').replace('\xa0', '') return details #cell-2 讀取全部檔案 import os text = '' files = os.listdir('./data/lagou_ai/jobs1000/') jobCount = 0 for n in range(0, 1000): if not files[n].find('.json')==-1: details = readDetail('./data/lagou_ai/jobs1000/' + files[n]) if details.find('python') != -1 or details.find('tensorflow') != -1: jobCount += 1 text += details print('>>Got jobs:', jobCount) #cell-3 關鍵詞提取和去除冗餘 import jieba.analyse import pandas as pd keywords = [] weights=[] mylist = [ '演算法', 'python', '經驗', '機器', '深度', 'java', 'c++', '資料探勘', '自然語言', '程式設計', '資料分析', '數學', 'linux', 'nlp', 'tensorflow', 'spark', '文字', '碩士', 'hadoop', 'caffe', '視覺', '本科', '語音', '語義', '問題', '神經網路', '資料結構', '影象' ] for word, weight in jieba.analyse.extract_tags( text, topK=100, withWeight=True): if word in mylist: keywords.append(word) weights.append(weight) print(keywords,weights) #cell-3.5 合併同類詞 def mergeItem(wd1,wd2): newkey=wd1+'+'+wd2 n1=keywords.index(wd1) keywords[n1]=newkey n2=keywords.index(wd2) weights[n1]=weights[n1]+weights[n2] del weights[n2] del keywords[n2] return newkey mergeItem('神經網路','深度') mergeItem('資料分析','資料探勘') mergeItem('影象','視覺') a=mergeItem('自然語言','nlp') a=mergeItem(a,'文字') a=mergeItem(a,'語義') #cell-3.8 重新排序 comb=zip(keywords,weights) comb=sorted(comb,reverse=True,key=lambda k:k[1]) keywords=[v for v,_ in comb] weights=[v for _,v in comb] #cell-4 繪圖視覺化 import plotly import plotly.graph_objs as go plotly.offline.init_notebook_mode(connected=False) plotly.offline.iplot({ "data": [go.Bar(x=keywords, y=weights)], "layout": go.Layout(title="拉勾網人工智慧職業關鍵詞分佈") })
智慧決策上手系列教程索引
每個人的智慧決策新時代
如果您發現文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,歡迎轉載~
END