前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫(104)教你词云分析拉勾网数百个职位招聘详

爬虫(104)教你词云分析拉勾网数百个职位招聘详

作者头像
公众号---人生代码
发布2020-05-18 15:29:25
4940
发布2020-05-18 15:29:25
举报
文章被收录于专栏:人生代码人生代码

昨天我们分析了某 girl 的 QQ 空间,之后想想还是不过瘾啊,感觉还可以深度挖掘词云这个库,于是在网上找了一个实际例子又来波

首先需要下载 拉勾网数百个职位招聘详数据,这里小编已经为大家准备好了

https://pan.baidu.com/s/1HG7rcgeLTpcemo-oT_KebA

密码 bvb8

我们需要读取这个文件

读取并打印出前面100个字符

代码语言:javascript
复制
text=''
with open('./lagou-job1000-ai-details.txt','r') as f:
    text=f.read()
    f.close()
print(text[:100])

jieba 分词

代码语言:javascript
复制
#cell-2
import jieba
words = jieba.lcut(text)
cuted=' '.join(words)
print(cuted[:100])

生成词云对象

首先,默认情况wordcloud是不支持中文显示的,所以要先添加一个中文字体文件,一般是.ttf或.otf格式,你可以从网上搜索‘字体下载’找到想要的字体。上面代码中使用的是

代码语言:javascript
复制
#cell-3
from wordcloud import WordCloud
fontpath='SourceHanSansCN-Regular.otf'

wc = WordCloud(font_path=fontpath,  # 设置字体
               background_color="white",  # 背景颜色
               max_words=1000,  # 词云显示的最大词数
               max_font_size=500,  # 字体最大值
               min_font_size=20, #字体最小值
               random_state=42, #随机数
               collocations=False, #避免重复单词
               width=1600,height=1200,margin=10, #图像宽高,字间距,需要配合下面的plt.figure(dpi=xx)放缩才有效
              )
wc.generate(cuted)

WordCloud(...)命令包含了很多参数,其中就包含了我们上面设定的字体路径font_path。 注意这里width=1600,height=1200,margin=100图像宽高只是原始图像的大小,至于后面显示出来的时候可能还会被放缩。它的更多参数可以查看下面链接wordcloud官方WordCloud方法说明

显示词云图

我们用matplotlib的imshow就是image-show把图片显示出来

代码语言:javascript
复制
#cell-4
import matplotlib.pyplot as plt
plt.figure(dpi=100) #通过这里可以放大或缩小
plt.imshow(wc, interpolation='catrom',vmax=1000)
plt.axis("off") #隐藏坐标plt.show()
wc.to_file('py_book.png')

去除冗余单词

我们可以利用jieba的del_word功能去掉冗余单词。 修改cell-2代码:

代码语言:javascript
复制
#cell-2
import jieba

removes =['熟悉', '技术', '职位', '相关', '工作', '开发', '使用','能力','优先','描述','任职']
for w in removes:
    jieba.del_word(w)

words = jieba.lcut(text)
cuted = ' '.join(words)
print(cuted[:100])

这里用for循环依次删除了各个冗余词,也可不用for循环,改为lcut之后对words进行处理:

代码语言:javascript
复制
words = jieba.lcut(text)
words = [w for w in words if w not in removes]

区分中英文

如果我们只关注英文技术点,比如python,tensorflow等,那就忽略中文内容。 使用正则表达式来匹配提取哪些由az小写字母和AZ大写字母加上0~9数字组成的单词。 修改cell-2如下:

代码语言:javascript
复制
#cell-2
import jieba
words = jieba.lcut(text)
import re
pattern = re.compile(r'^[a-zA-Z0-1]+$')
words = [w for w in words if pattern.match(w)]
cuted = ' '.join(words)
print(cuted[:100])

改变造型

我们让单词按照特定的造型来排列。首先我们需要一张造型图片,下面是一张AI文字造型图片,请把它右键另存为ai-mask.png文件。

前面在wc = WordCloud(font_path=fontpath...中有很多参数可以设置,其中就有mask遮罩参数,可以指定一张读取的图片数据,根据官方说明,这个数据应该是nd-array格式,这是一个多维数组格式(N-dimensional Array)。

我们使用PIL模块中的Image.open('...')可以读取图片,然后利用numpy来转换为nd-arry格式。 修改cell-3,读取图片并增加mask参数:

代码语言:javascript
复制
#cell-3
from wordcloud import WordCloud
fontpath='SourceHanSansCN-Regular.otf'

import numpy as np
from PIL import Image
aimask=np.array(Image.open("ai-mask.png"))

wc = WordCloud(font_path=fontpath,  # 设置字体
               background_color="white",  # 背景颜色
               max_words=1000,  # 词云显示的最大词数
               max_font_size=100,  # 字体最大值
               min_font_size=5, #字体最小值
               random_state=42, #随机数
               collocations=False, #避免重复单词
               mask=aimask, #造型遮盖
               width=1600,height=1200,margin=2, #图像宽高,字间距,需要配合下面的plt.figure(dpi=xx)放缩才有效
              )
wc.generate(cuted)

改进颜色

默认情况图片上文字的颜色都是随机的,我们可以使用图片来控制文字的颜色。

WordCloud方法提供了一个color_func颜色函数的参数,用一个函数来改变每个词的颜色,在这里我们直接使用上面深色的AI图片颜色来控制。

代码语言:javascript
复制
from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
fontpath='SourceHanSansCN-Regular.otf'

import numpy as np
from PIL import Image
aimask=np.array(Image.open("ai-mask.png"))

genclr=ImageColorGenerator(aimask)

wc = WordCloud(font_path=fontpath,  # 设置字体
               background_color="white",  # 背景颜色
               max_words=1000,  # 词云显示的最大词数
               max_font_size=100,  # 字体最大值
               min_font_size=5, #字体最小值
               random_state=42, #随机数
               collocations=False, #避免重复单词
               mask=aimask, #造型遮盖
               color_func=genclr,
               width=1600,height=1200,margin=2, #图像宽高,字间距,需要配合下面的plt.figure(dpi=xx)放缩才有效
              )
wc.generate(cuted)

在上面,我们引入了from wordcloud import ImageColorGenerator方法,它是直接用来生成一个color_func颜色函数的,它括号里需要一个nd-array多维数组的图像,恰好我们上面的aimask就是这个格式,直接用就可以。

重新运行得到最开始看到的图, 和原图对比,就能看到文字颜色的规律了:

汇总

读取文件

jieba分词

利用re正则表达式选出英文单词

生成词云对象,利用图片遮罩形状和改变颜色

使用Matplotlib来显示图片

完整代码如下:

代码语言:javascript
复制
#cell-1
text=''
with open('./lagou-job1000-ai-details.txt','r') as f:
    text=f.read()
    f.close()
print(text[:100])

#cell-2
import jieba
words = jieba.lcut(text)
import re
pattern = re.compile(r'^[a-zA-Z0-1]+$')
words = [w for w in words if pattern.match(w)]
cuted = ' '.join(words)
print(cuted[:500])

#cell-3
from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
fontpath='SourceHanSansCN-Regular.otf'

import numpy as np
from PIL import Image
aimask=np.array(Image.open("ai-mask.png"))

genclr=ImageColorGenerator(aimask)

wc = WordCloud(font_path=fontpath,  # 设置字体
               background_color="white",  # 背景颜色
               max_words=1000,  # 词云显示的最大词数
               max_font_size=100,  # 字体最大值
               min_font_size=5, #字体最小值
               random_state=42, #随机数
               collocations=False, #避免重复单词
               mask=aimask, #造型遮盖
               color_func=genclr,
               width=1600,height=1200,margin=2, #图像宽高,字间距,需要配合下面的plt.figure(dpi=xx)放缩才有效
              )
wc.generate(cuted)

#cell-4
import matplotlib.pyplot as plt
plt.figure(dpi=150) #通过这里可以放大或缩小
plt.imshow(wc, interpolation='catrom',vmax=1000)
plt.axis("off") #隐藏坐标
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CryptoCode 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档