数据处理-招聘信息-中文分词与词频统计

智能决策上手系列教程索引

通过前面的几篇文章,相信大家都尝试抓取了一些网站上招聘信息的数据,并存储到自己的文件里面了,可能是一堆.json.csv文件。
如果你还没有抓到数据,请看这个网络数据抓取-拉勾网职位列表和详情-requests案例

为什么要分词?

分词也叫切词,cut。
以我们抓取的招聘职位的例子,我们需要了解掌握哪些技术才能找到一个人工智能方面的工作,简单的办法就是看数百个职位招聘的详情里面哪些词出现的次数最多,比如Python这个词肯定出现频率很高,机器学习深度学习,tensorflow之类的单词出现的也应该比较高,当然还有很多其他的词,比如pytorch重要吗?coffee重要吗?神经网络重要吗?

不能靠猜!
必须用统计数据说话,简单的思路就是看看哪些词出现次数最多。

可是我们并不熟悉人工智能技术啊,也就不知道要统计哪些词的频率才合适。
小白就不能做研究作分析了吗?当然可以。

我们可以用一个大词典来作参照,让计算机把数百条招聘详情的文字段落都拆成一个词一个词的,然后再把出现频率最多的告诉我们就可以了~

比如把熟悉使用 Python 进行数据处理和分析,熟练使用Numpy, Pandas, scikit-learn等科学计算库切成熟悉/使用/Python/进行/数据处理/和/分析/熟悉/使用/Numpy/Pandas/scikit-learn/等/科学/计算库
这就得到了['熟悉','使用','Python','进行','数据处理','和','分析','Numpy','Pandas','scikit-learn','等','科学','计算库']这些单词,注意熟悉使用两个词不重复记录,我们把数百条招聘信息放在一起,切割,汇总,就得到了一个包含很多很多词的列表,这里的每个词至少被提及了一次。

词袋模型BOW

分词的目的是为了两个事情:

  1. 得到一个所有用到的词的列表,比如['我','你','爱','学习']
  2. 可以用这个列表来表示任何一个文字语句段落,比如用上面这个词表,我爱你,也爱学习就可以表示为[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,就可以参照提示输入命令升级。

结巴jieba官方Github项目网址,有详细教程

Notebook新建一个Python 3文件,输入下面代码测试:

import jieba
fc=jieba.cut('我爱你,我爱学习')
print('/'.join(fc))

输出结果我爱你/,/我/爱/学习和我们想的不太一样,管他呢,反正我们安装成功了。

统计单个招聘信息的词频

先读取一个职位信息数据文件,然后提取到details细节文字,转小写lower,再替换掉里面的空格冗余,然后用jieba切词cut。

如果您还没有抓取,请从这里直接下载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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 刚开车到南通,接到我吕四一个学生的电话,请我第二天晚上吃饭,地点:吕四杏花村大酒店 我犯难了,因为本打算在南通呆几...
    千秋笔阅读 377评论 0 5
  • 厨刀是人类历史进程中最接地气的刀种了,早在原始社会,人们就开始学会用石块、兽骨打制刀具,既是攻守兼备的武器,也是日...
    老刀记阅读 498评论 0 0
  • 今天在家休息了一天,虽然手机上,仍然进行日常工作,但不出门,就是宅宅的。吃红薯的第四天,基本上已经了解自己一天要吃...
    hml蔓阅读 182评论 5 4