初学者教程:第一只爬虫——爬取招聘信息(三)

内容概要:

初学者教程:第一只爬虫——爬取招聘信息(一)

    思路概述,一个简单的介绍。

初学者教程:第一只爬虫——爬取招聘信息(二)

    基础实现。介绍爬虫的代码具体实现,如何将爬到的数据解析、保存下来

初学者教程:第一只爬虫——爬取招聘信息(三)

    进阶应用。与机器学习结合,使用logistic分类器,训练一个分类模型,用于区分某一条新的招聘信息是否适合自己


2018-06-26更新:

本文环境:python2,出现编码问题一般是python2和python3的原因

另外,由于年代已久,智联招聘主页已经更新了,这个代码不能直接跑了

刚看到csdn的通知,我迁移一下代码,迁移好了更新链接。不过,这个代码是我多年前写的,现在看着有点不忍直视。大家想看就看吧

以上



源代码下载:

https://gitee.com/ecla_molly/get_constent.py


在前面两篇教程中,我们学习了如何从网上爬取信息。下面我们会迎来最激动人心的时刻:训练一个model,让它自动分类数据。

由于是面向初学者的教程,这里暂时不对算法进行更详细的介绍。感兴趣的话可以阅读[逻辑回归]。

我们使用的函数库是Dato家的Graphlab Creat(https://dato.com/products/create/),非商业的个人和学生可以申请免费使用。当然,也可以使用其它的库。这样,我们就不关心算法具体的实现,把它当成一个黑盒子,仅仅关心数据的处理。


在训练model之间,我们需要得到一些已经被标注好的数据。也就是机器学习用到的‘教材’。很多同学在学习算法的时候,往往会把注意力集中在算法本身。其实,高质量的数据、大量的数据,是十分重要的。它会对最后的训练结果产生很大的影响。(这也就是我这只算法助理工作的内容微笑


使用Excel打开刚刚生成的get_constent.txt文件。一个小技巧是可以把信息都复制到B列,可以方便地在A列标注我们的判断。(其实也可以尝试海投简历,HR约面试的标1,没约的标0。闭嘴)标好之后,删掉B列,将文件另存为成‘data_label.txt’。同时,也收集招聘中重要的关键词,比如图像、嵌入式、DSP、测试报告、视觉、本科。我收集到了60多个关键词(特征值)。把关键词(特征值)存储在‘word_lib.txt’中。



好了,现在,我们所有的数据都已经准备完毕了。下面开始写代码。


同样的,首先进行编码的设置。并且import graphlab库。

<span style="font-size:18px;">#! /usr/bin/env python
#coding=utf-8

import sys
import graphlab
reload(sys)
sys.setdefaultencoding('utf-8')</span>


接下来,把刚刚存储的信息导入到程序中

<span style="font-size:18px;">#导入数据和标签
data_file = open('get_constent.txt').readlines() 
data_value = open('data_labelt.txt').readlines()
url_value = open('save_url.txt').readlines()
selected_feature = open('word_lib.txt').readlines()

for i in range(len(data_value)):
    data_value[i]=data_value[i].split('\n')[0]
for i in range(len(selected_feature)):
    selected_feature[i]=selected_feature[i].split('\n')[0]
for i in range(len(selected_feature)):
    url_value[i]=url_value[i].split('\n')[0]</span>

中间有一段裁切,是因为读取出来的数据中包含换行符,需要删掉。其实也可以用replace('\n','')来删除
#建立SFRame表格
recruit_data = graphlab.SFrame({'constent':data_file,'value':data_value,'url':url_value})

下面是我们刚刚建立的特征值文件起作用的时候了:

#对特征值进行统计,建立特征值表格
def feature_count(data):
    if fea in data:
        return 1
    else:
        return 0
    
for fea in selected_feature:
    recruit_data[fea] = recruit_data['constent'].apply(feature_count) 
通过这段代码,我们建立了一些新的列,列的名称就是刚刚收集的特征值。如果招聘信息里面出现了这个词,我们就设此列的值为1,否则为0.

接下来就是训练model了
    

train_data,test_data = recruit_data.random_split(0.8,seed=0)
recruit_model = graphlab.logistic_classifier.create(train_data,target='value',features=selected_feature)

这里,调用graphlab建立了一个model。下面可以对它进行一些测试
print '-------------------------------'
sum_value = 0
for d_value in data_value:
    sum_value += int(d_value)
va1 = float(sum_value)/len(recruit_data)
print 'the base line is :'+str(va1)

test_data['predicted_value'] = recruit_model.predict(test_data,output_type = 'probability')
print test_data['value','predicted_value'].head()

可以看到训练的结果以及正确率。


计算baseline的方法是统计最大类别出现的概率(似乎暴露了我彪悍的自信)。也就是说,分类器把所有结果预测为最大类别后的正确率。这是衡量分类器好坏的一个重要的标准。可以看出,这个分类器也就是比baseline好了十个百分点而已。

最后使用print函数来将得分比较高的招聘信息对应的链接输出。便可以访问链接、投递简历啦!大笑


使用命令

recruit_model['coefficients'].sort('value',ascending=False).save('coeffi.csv', format='csv')
可以输出model的参数(从高到低排列)

可以看到各个特征值的权重。然后会发现很多特征值的权重都是零。原因是我设了60个参数之多,却只标注了130个样本。而参数越多,充分训练所需的样本越多。所以,为了提高正确性,可以多多标注数据。另一方面,我在标注的时候,判断一个工作是否能胜任,显然是十分草率的(从标1的比例高达54%就能看出)。所以,这批数据无论是质量还是数量都有待提高。



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值