互联网科技程序员我爱编程

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

2018-10-29  本文已影响9人  zhyuzh3d

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

这一篇我们针对之前爬取的拉勾网职位信息进行词频统计,看一下出现频率最高的关键词是哪些。

如果您还没有抓取,请从这里直接下载100个json搁置职位文件 密码:tfdv

读取数据

由于我们之前是吧每个职位都存储为单个的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 读取文件列表,把细节信息合并到text
import os

text = ''
folder = '/Users/zhyuzh/Desktop/Jupyter/spiders/data/lagou_ai/jobs1000/'
files = os.listdir(folder)
jobCount = 0
for 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 plotly
import 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="拉勾网人工智能职业关键词分布")
})

输出大致如下图:


image.png

总结

汇总步骤如下:

  1. 读取文件,获得text文本
  2. 用jieba分词,获得空格隔开的文本
  3. 用nltk的FreqDist统计词频,获得词频字典对象
  4. 用most_common提取前面50个
  5. 去除单个字和标点符号,或者保留需要的单词
  6. 绘图统计

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

#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
import os

text = ''
folder = '/Users/zhyuzh/Desktop/Jupyter/spiders/data/lagou_ai/jobs1000/'
files = os.listdir(folder)
jobCount = 0
for 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-3
import jieba
words = jieba.lcut(text)  # 默认是精确模式
cuted=' '.join(words)
print(cuted[:100])

#cell-4
from 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-5
import plotly
import 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="拉勾网人工智能职业关键词分布")
})

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

每个人的智能决策新时代

如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,欢迎转载~


END

上一篇下一篇

猜你喜欢

热点阅读