为了账号安全,请及时绑定邮箱和手机立即绑定

数据分析-词频统计-nltk自然语言处理

标签:
大数据

读取数据

由于我们之前是吧每个职位都存储为单个的csv文件,所以我们先把它们的details职位要求细节信息读取出来。代码如下,具体说明参照之前的文章。

#cell-1 定义读取细节的函数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 读取文件列表,把细节信息合并到textimport os

text = ''folder = '/Users/zhyuzh/Desktop/Jupyter/spiders/data/lagou_ai/jobs1000/'files = os.listdir(folder)
jobCount = 0for n in range(0, 1000):    if not files[n].find('.json') == -1:
        details = readDetail(folder + files[n])        if details.find('python') != -1 or details.find('tensorflow') != -1:
            jobCount += 1
            text += details
print('>>Got jobs:', jobCount)

jieba分词

要统计单词的出现频率,首先我们要进行切词,仍然使用jieba分词。

#cell-3使用jieba分词import jieba
words = jieba.lcut(text)  # 默认是精确模式cuted=' '.join(words)
print(cuted[:100])

这里print(cuted[:100])只输出前100个字看情况,应该得到类似这样的输出,每个词或标点被用空格分开了:
职位 描述 : 岗位职责 : 1 . 展开 机器 学习 / 深度 学习 等 相关 领域 研究 和 开发 工作 ; 2 . 负责 从事 深度 学习 框架 搭建 , 包括 机器 学习 、 图像处理 等 的

nltk词频统计

nltk全称是Natural Language Toolkit,自然语言工具包,是专门用来做文本语言分析的工具,和jieba类似,nltk包含了更多功能,但它是针对英文的,对中文来说有些功能还不太好,比如它的中文分词就不如jieba。
nltk官方网站

如果还没安装的话可以用命令conda install nltk或者pip3 install nltk进行安装。

使用下面代码统计单词出现的频率(次数):

#cell-4统计词频from nltk.probability import FreqDist
fdist = FreqDist(words)
tops=fdist.most_common(50)
print(tops)

FreqDist会根据文本进行单词统计,注意,英文每个单词中间都是有空格的,而中文字词之间没有空格,所以必须使用jieba分词之后的文本。
. most_common(50)是打印出现最多的50个单词及相应的次数。
得到类似下面的结果:
[('、', 5079), (',', 4179), ('的', 2984), (';', 2003), ('.', 1438), ('和', 1299), (':', 1175), ('等', 1105), ('。', 1085), ('学习', 1024), ('有', 945), ('/', 903), ('算法', 885), ('经验', 746), ('相关', 696), ('2', 692), ..., ('系统', 273)]

去除冗余单字

上面的输出中,我们看到很多单个的标点或汉字,肯定不是我们需要的内容,我们用下面的代码删除它们。

#cell-5去除单字delarr=[]for key in fdist:    if len(key)<2:
        delarr.append(key)for key in delarr:    del fdist[key]
    
tops=fdist.most_common(50)
print(tops)

这里注意上面用使用FreqDist方法得到的fdist其实就是一个字典,类似{'的':2984,';':2003}这样的对象,del fdist['的']的方法可以删除第一个字段。

我们先把所有要删除的字段放入delarr中,然后循环删除它。
删除之后再次打印top50,单个的词和标点就消失了:
[('学习', 1024), ('算法', 885), ('经验', 746), ('相关', 696), ('熟悉', 675), ('技术', 564), ('能力', 561), ('机器', 544), ('开发', 537), ('优先', 531), ('数据', 511), ('工作', 484), ('职位', 471), ('人工智能', 462), ('描述', 440), ('负责', 434), ('python', 381), ...,('实现', 181)]

保留有效词

我们打印100个,然后把不相关的都去除。

#cell-6 打印单词tops=fdist.most_common(100)
t=""for key in tops:
    t+='\''+key[0]+'\''
    t+=','print(t)

得到输出'学习','算法','经验','相关','熟悉','技术','能力','机器','开发','优先','数据','工作','职位','人工智能','描述','负责','python',...,'计算',

我们手工选择要删除的,然后把这些也删除掉:

#cell-7 保留有效词usearr=['学习','算法','经验','机器','数据','人工智能','python','深度','分析','应用','模型','系统','研究','设计','优化','计算机','团队','产品','平台','研发','项目','数学','专业','处理','java','c++','框架','问题','实现','用户','基础','数据挖掘','自然语言','编程','语言','数据分析','识别','推荐','沟通','建模','实际','理解','挖掘','linux','nlp','智能','硕士','文本','视觉','场景','tensorflow','提升','需求','知识','互联网','编程语言','本科','代码','计算']for key in usearr:    if delarr2.index(key)==-1:        del fdist[key]
tops=fdist.most_common(50)
print(tops)

然后得到更好的列表:
[('学习', 1024), ('算法', 885), ('经验', 746), ('相关', 696), ('熟悉', 675), ('技术', 564), ('能力', 561), ('机器', 544), ('开发', 537), ('优先', 531),...,('实现', 181)]

绘制图表

参考上一篇文章我们使用plotly进行图表绘制:

#cell-8绘制图表import plotlyimport plotly.graph_objs as go

plotly.offline.init_notebook_mode(connected=False)

keywords=[item[0] for item in tops]
weights=[item[1] for item in tops]

plotly.offline.iplot({    "data": [go.Scatter(x=keywords, y=weights)],    "layout": go.Layout(title="拉勾网人工智能职业关键词分布")
})

输出大致如下图:


webp

image.png

总结

汇总步骤如下:

  1. 读取文件,获得text文本

  2. 用jieba分词,获得空格隔开的文本

  3. 用nltk的FreqDist统计词频,获得词频字典对象

  4. 用most_common提取前面50个

  5. 去除单个字和标点符号,或者保留需要的单词

  6. 绘图统计

汇总代码如下(使用保留词,没有使用删除表单单个字):

#cell-1def readDetail(fileName):
    with open(fileName, 'r') as f:
        job = json.load(f)
        details = job['details'].lower()
        details = details.replace(' ', '').replace('\xa0', '')        return details#cell-2import os

text = ''folder = '/Users/zhyuzh/Desktop/Jupyter/spiders/data/lagou_ai/jobs1000/'files = os.listdir(folder)
jobCount = 0for n in range(0, 1000):    if not files[n].find('.json') == -1:
        details = readDetail(folder + files[n])        if details.find('python') != -1 or details.find('tensorflow') != -1:
            jobCount += 1
            text += details
print('>>Got jobs:', jobCount)#cell-3import jieba
words = jieba.lcut(text)  # 默认是精确模式cuted=' '.join(words)
print(cuted[:100])#cell-4from nltk.probability import FreqDist
fdist = FreqDist(words)
usearr=['学习','算法','经验','机器','数据','人工智能','python','深度','分析','应用','模型','系统','研究','设计','优化','计算机','团队','产品','平台','研发','项目','数学','专业','处理','java','c++','框架','问题','实现','用户','基础','数据挖掘','自然语言','编程','语言','数据分析','识别','推荐','沟通','建模','实际','理解','挖掘','linux','nlp','智能','硕士','文本','视觉','场景','tensorflow','提升','需求','知识','互联网','编程语言','本科','代码','计算']for key in usearr:    if delarr2.index(key)==-1:        del fdist[key]
tops=fdist.most_common(50)
print(tops)#cell-5import plotlyimport plotly.graph_objs as go

plotly.offline.init_notebook_mode(connected=False)

keywords=[item[0] for item in tops]
weights=[item[1] for item in tops]

plotly.offline.iplot({    "data": [go.Scatter(x=keywords, y=weights)],    "layout": go.Layout(title="拉勾网人工智能职业关键词分布")
})



作者:zhyuzh3d
链接:https://www.jianshu.com/p/517d9afae295


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消