資料處理-招聘資訊-中文分詞與詞頻統計
ofollow,noindex">智慧決策上手系列教程索引
通過前面的幾篇文章,相信大家都嘗試抓取了一些網站上招聘資訊的資料,並存儲到自己的檔案裡面了,可能是一堆 .json
或 .csv
檔案。
如果你還沒有抓到資料,請看這個 網路資料抓取-拉勾網職位列表和詳情-requests案例
為什麼要分詞?
分詞也叫切詞,cut。
以我們抓取的招聘職位的例子,我們需要了解掌握哪些技術才能找到一個人工智慧方面的工作,簡單的辦法就是看數百個職位招聘的詳情裡面哪些詞出現的次數最多,比如 Python
這個詞肯定出現頻率很高, 機器學習
和 深度學習
, tensorflow
之類的單詞出現的也應該比較高,當然還有很多其他的詞,比如 pytorch
重要嗎? coffee
重要嗎? 神經網路
重要嗎?
不能靠猜!
必須用統計資料說話,簡單的思路就是看看哪些詞出現次數最多。
可是我們並不熟悉人工智慧技術啊,也就不知道要統計哪些詞的頻率才合適。
小白就不能做研究作分析了嗎?當然可以。
我們可以用一個大詞典來作參照,讓計算機把數百條招聘詳情的文欄位落都拆成一個詞一個詞的,然後再把出現頻率最多的告訴我們就可以了~
比如把 熟悉使用 Python 進行資料處理和分析,熟練使用Numpy, Pandas, scikit-learn等科學計算庫
切成 熟悉/使用/Python/進行/資料處理/和/分析/熟悉/使用/Numpy/Pandas/scikit-learn/等/科學/計算庫
。
這就得到了 ['熟悉','使用','Python','進行','資料處理','和','分析','Numpy','Pandas','scikit-learn','等','科學','計算庫']
這些單詞,注意 熟悉
和 使用
兩個詞不重複記錄,我們把數百條招聘資訊放在一起,切割,彙總,就得到了一個包含很多很多詞的列表,這裡的每個詞至少被提及了一次。
詞袋模型BOW
分詞的目的是為了兩個事情:
- 得到一個所有用到的詞的列表,比如
['我','你','愛','學習']
。 - 可以用這個列表來表示任何一個文字語句段落,比如用上面這個詞表,
我愛你,也愛學習
就可以表示為[2,1,2,1]
,我愛你
就可以表示成[0,1,1,1]
,這裡的每個數字表示這個詞在原文裡面出現的次數,出現次數越多,頻率越高。

image.png
這就好像把一句話切成很多段,然後胡亂的扔進一個袋子裡,雖然順序已經丟失了,但是每個袋子裡某個詞的數量仍然可以統計,這就是詞袋模型Bag-Of-Words,BOW。

image.png
向量空間模型 VSM
我們知道平面向量座標是 [x,y]
,比如 [10,10]
就是右上方45度的一個點的位置;換到三維空間 [x,y,z]
立體向量我們也不怕。

image.png
但是上面那個 我不愛學習``[2,1,2,1]
怎麼樣呢?四個數字當然是四維向量了。以此類推,就算是128維我們也不怕了。
雖然我們人類的大腦想象不出四維或更多維的空間,但數字運算我們可以參照二三維的演算法依葫蘆畫瓢就可以。
把一個句子或一段文字切割成一排單詞,進而用一個數字列表來表示,一個句子或一段文字看上去像是一個N維向量,這就是向量空間模型表示法,VSM,Vector Space Model。它是詞袋BOW模型的延續。
安裝結巴jieba
結巴就是口吃,口吃的人說話經常一個詞一個詞的卡住,恰好有國內開發者就為大家編寫了一個叫做jieba的分詞功能模組,它很強大,我們先安裝它。
開啟命令列或終端工具,輸入:
pip3 install jieba
稍等一會就能自動完成安裝。如果有提示要升級upgrade你的pip,就可以參照提示輸入命令升級。
Notebook新建一個Python 3檔案,輸入下面程式碼測試:
import jieba fc=jieba.cut('我愛你,我愛學習') print('/'.join(fc))
輸出結果 我愛你/,/我/愛/學習
和我們想的不太一樣,管他呢,反正我們安裝成功了。
統計單個招聘資訊的詞頻
先讀取一個職位資訊資料檔案,然後提取到details細節文字,轉小寫lower,再替換掉裡面的空格冗餘,然後用jieba切詞cut。
以下是程式碼,注意根據自己情況替換檔案路徑名稱:
#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 text = readDetail('./data/lagou_ai/jobs1000/362654.json') fc = jieba.cut(text) print('/'.join(fc))
這裡注意到資料檔案中包含的空格有兩種,只用 replace(' ','')
去不掉。可以先用 print(repr(details))
方法打印出來,就會看到還有 \xa0
這種空格了。可以參考下面一小段程式碼理解,其中re是正則表示式,如果沒接觸過可以先忽略它:
import re s='AA \xa0BB' print(s) print(repr(s)) print(s.replace(' ','')) print(s.replace(' ','').replace('\xa0',u'')) print(re.sub('\s+','',s))
輸出結果:
AA BB
'AA \xa0BB'
AA BB
AABB
AABB
分詞cell-1程式碼執行得到的結果類似:
職位/描述/:/*/愛奇藝/福利/:/14/薪/、/12/天年/假/,/超一流/的/行政/團隊/,/日常/活動/多多/,/沒有/996/,/週一/到/週五/及/週末/自願/加班/都/有/豐厚/的/加班/補貼/*/團隊/介紹/:/*/我們/是/一個/信仰/技術/的/團隊/,/在/這裡/,/我們/用/技術/說話/,/相信/技術/和/人工智慧/能/改變/生活/。/目前/團隊/...
關鍵詞提取
哪些詞是最重要的?不僅僅要考慮出現頻率,比如很多語氣詞助詞出現頻率高但沒有意義。
jieba提供了簡單有效的分析提取工具analyse,有兩種方式:
-
extract_tags
提取標記,使用的TF/IDF(term frequency術語頻率/Inverse document frequency反向文件頻率)演算法獲得單詞的權重。語法是jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
,其中topK是列出最重要的20個。 -
textrank
是另一種演算法,具體參照jieba官方說明,直接用就可以,jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
我們把兩個演算法都測試一下:
#cell-2 import jieba.analyse for word, weight in jieba.analyse.extract_tags(text, withWeight=True): print('%s %s' % (word, weight)) print('-'*20) for word, weight in jieba.analyse.textrank(text, withWeight=True): print('%s %s' % (word, weight))
輸出的結果是:
愛奇藝 0.2134779911232143
nlp 0.2134779911232143
團隊 0.21031455098690477
負責 0.17199107835744049
文字 0.15972947489946426
...
--------------------
負責 1.0
分析 0.8929318143543986
團隊 0.8835148710340713
技術 0.8233113604163651
搜尋 0.6789881049317539
...
看上去第一個比較好些,至少提取到了nlp這個關鍵技術點。
從批量資料中提取關鍵詞
我們先讀取100個招聘職位資料檔案,把details都連線到一起然後輸出關鍵詞。
為了避免銷售、運營等非技術職位的干擾,我們只使用包含python或tensorflow的職位。
為了避免隱藏檔案導致錯誤,判斷檔名必須包含 .json
才執行。
下面是完整程式碼:
#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 for word, weight in jieba.analyse.extract_tags(text, topK=50, withWeight=True): print('%s %s' % (word, weight))
執行得到350個有效職位,最後100關鍵詞列表(下面去除了一些無關的單詞,但仍然比較長,僅供參考):
演算法 0.16280807037359346
學習 0.12521739675971214
python 0.09640941534596774
人工智慧 0.09249022510194692
經驗 0.0903619452278592
機器 0.076475520044677
開發 0.06282155542603188
能力 0.05860484859142685
技術 0.05634099247975362
資料 0.051716054158354285
java 0.049343401555022856
c++ 0.0485842723003302
資料探勘 0.044729592655659976
模型 0.04294333614698163
應用 0.03801291673277877
團隊 0.03739400195347558
優化 0.037294334549497286
計算機 0.03615275785604267
分析 0.034857880483786303
自然語言 0.034456246568351535
程式設計 0.031659378238450595
資料分析 0.031202021961397427
平臺 0.03053176386762446
研發 0.03041435802634324
設計 0.03018368404402845
任職 0.030103547088539916
數學 0.02881462488389637
系統 0.02866245418612649
框架 0.028054525207817503
業務 0.027955582209485647
建模 0.027914137122792313
linux 0.027834739338730843
nlp 0.027834739338730843
專業 0.02687323086027644
tensorflow 0.026316480829345526
使用者 0.024837901203459484
程式語言 0.023921795978702056
研究 0.023795093950279404
spark 0.023786049980369994
識別 0.02346950050499534
產品 0.022570152356689105
專案 0.02191093140143595
文字 0.020637302404248794
碩士 0.020465162362061213
語言 0.019699604895756923
hadoop 0.01948431753711159
海量 0.018637449359492422
場景 0.01840435808542905
溝通 0.018238597080262466
caffe 0.018219102112623824
視覺 0.018215512260423124
本科 0.017933459663175007
挖掘 0.01787062300279972
架構 0.017215790470250614
語音 0.016999498912654516
ai 0.016700843603238508
基礎 0.016534794244883584
智慧 0.016519711579636144
語義 0.01593578503036449
問題 0.015268805992307172
神經網路 0.015112282160282786
理解 0.015094887961947762
計算機相關 0.014929542008955634
網際網路 0.014923956114526925
資料結構 0.014867715551689104
影象 0.014776146846297944
優秀 0.014214794317419989
總結
這篇文章非常的基礎,我們初步瞭解了利用jieba切詞和關鍵詞提取的方法,雖然得到一些資料統計結論,但其實還有很多問題,只是一個開端,後面的文章我們再慢慢深入探索。
智慧決策上手系列教程索引
每個人的智慧決策新時代
如果您發現文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,歡迎轉載~
END