Python+Django实现智能职位推荐系统:协同过滤算法实践

Python+Django实现智能职位推荐系统:协同过滤算法实践

1. 项目概述:基于协同过滤的智能职位推荐系统

这个Python+Django开发的猎聘网职位推荐系统,本质上是一个融合了数据采集、算法处理和可视化展示的完整数据科学项目。我在实际开发中发现,这类系统最核心的价值在于解决了求职者和招聘方之间的信息匹配效率问题——传统招聘网站往往只能提供基于关键词的简单筛选,而我们的系统能够通过用户行为数据挖掘潜在偏好。

系统采用典型的三层架构:前端用Bootstrap构建响应式界面,中间层用Django处理业务逻辑,底层使用Selenium采集的猎聘网数据作为推荐算法的输入源。其中最具技术挑战的部分是协同过滤算法的实现,需要处理用户-职位评分矩阵的稀疏性问题。我采用了一种混合式解决方案:对于新用户先用基于内容的推荐过渡,等积累足够行为数据后再切换到协同过滤。

2. 核心技术模块解析

2.1 Selenium爬虫数据采集

猎聘网的反爬机制相对严格,经过多次测试后我确定了这样的配置方案:

from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless") # 无头模式 chrome_options.add_argument("user-agent=Mozilla/5.0...") # 自定义UA driver = webdriver.Chrome(options=chrome_options) # 关键操作:随机延迟和页面滚动模拟人工操作 def scroll_and_wait(): driver.execute_script("window.scrollTo(0, document.body.scrollHeight*0.7)") time.sleep(random.uniform(1, 3)) driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") time.sleep(random.uniform(2, 4))

重要提示:实际部署时需要设置合理的爬取间隔,建议控制在20-30秒/页,避免对目标网站造成负担。我曾因过于频繁的请求导致IP被封,后来通过引入代理池解决了这个问题。

采集的数据结构设计为:

{ "job_id": "123456", "title": "Python高级开发工程师", "company": "某科技公司", "salary": "30-50k", "location": "北京", "requirements": ["Python", "Django", "MySQL"], "tags": ["五险一金", "年终奖", "弹性工作"] }

2.2 协同过滤算法实现

采用基于用户的协同过滤(UserCF)算法,核心步骤包括:

  1. 构建用户-职位评分矩阵(1-5分)
  2. 计算用户相似度(余弦相似度)
  3. 生成推荐列表

关键实现代码:

from sklearn.metrics.pairwise import cosine_similarity def calculate_similarity(user_job_matrix): # 加入拉普拉斯平滑处理零值问题 matrix = user_job_matrix.fillna(0) + 1e-9 return cosine_similarity(matrix) def generate_recommendations(user_id, similarity_matrix, n=10): similar_users = similarity_matrix[user_id].argsort()[-5:-1] # 加权聚合相似用户的偏好 recommendations = pd.Series( np.dot(similarity_matrix[user_id, similar_users], user_job_matrix.iloc[similar_users]) ).sort_values(ascending=False) return recommendations.index[:n]

实际应用中发现了两个关键改进点:

  • 加入时间衰减因子,使近期行为具有更高权重
  • 对热门职位进行降权处理,避免推荐结果过于集中

3. 系统架构与实现细节

3.1 Django后端设计

采用MTV模式组织代码结构:

recommendation_system/ ├── core/ # 核心算法 │ ├── recommender.py │ └── data_processor.py ├── jobs/ # 职位模块 │ ├── models.py │ └── views.py ├── users/ # 用户模块 │ ├── auth.py │ └── profile.py └── visualization/ # 可视化 └── views.py

数据库模型设计要点:

class Job(models.Model): source_id = models.CharField(max_length=20) # 原始网站ID title = models.CharField(max_length=200) company = models.CharField(max_length=100) salary_range = models.CharField(max_length=50) # 其他字段... class UserRating(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) job = models.ForeignKey(Job, on_delete=models.CASCADE) rating = models.SmallIntegerField(choices=[(i,i) for i in range(1,6)]) created_at = models.DateTimeField(auto_now_add=True)

3.2 前端可视化实现

使用ECharts实现动态数据展示,核心图表包括:

  1. 职位分布热力图
  2. 薪资水平分布直方图
  3. 技能需求词云图

关键JavaScript代码:

function initWordCloud() { const chart = echarts.init(document.getElementById('skills-cloud')); fetch('/api/skills-frequency/') .then(res => res.json()) .then(data => { const option = { series: [{ type: 'wordCloud', shape: 'circle', data: data.map(item => { return { name: item.skill, value: item.count, // 其他样式配置... }; }) }] }; chart.setOption(option); }); }

4. 部署与性能优化

4.1 生产环境部署方案

推荐使用Docker容器化部署:

FROM python:3.9 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["gunicorn", "--bind", "0.0.0.0:8000", "core.wsgi"]

配合Nginx配置负载均衡:

upstream django { server web1:8000; server web2:8000; } server { listen 80; location / { proxy_pass http://django; proxy_set_header Host $host; } }

4.2 性能优化技巧

  1. 缓存策略:

    • 使用Redis缓存热门推荐结果
    • 对算法计算结果设置15分钟过期时间
    from django.core.cache import cache def get_recommendations(user_id): cache_key = f"rec_{user_id}" if result := cache.get(cache_key): return result # 计算逻辑... cache.set(cache_key, result, timeout=900) return result
  2. 数据库优化:

    • 为常用查询字段添加索引
    • 使用select_related/prefetch_related减少查询次数
  3. 异步任务处理:

    • 使用Celery处理耗时操作(如数据爬取)
    @shared_task def async_crawl_jobs(keywords): crawler = JobCrawler() return crawler.run(keywords)

5. 常见问题与解决方案

5.1 冷启动问题

现象:新用户没有评分数据,无法生成推荐 解决方案:

  1. 基于注册信息推荐热门职位
  2. 采用混合推荐策略(内容+协同)
  3. 设计引导流程快速收集用户偏好

5.2 数据稀疏性问题

现象:用户-职位矩阵过于稀疏导致推荐不准 处理方法:

  1. 矩阵填充技术(均值填充/SVD分解)
  2. 引入职位内容特征作为辅助信息
  3. 使用图神经网络挖掘深层关系

5.3 实时性挑战

优化策略:

  1. 增量更新用户相似度矩阵
  2. 使用流式计算框架处理实时行为
  3. 设计分级更新机制(小时/天/周)

6. 项目扩展方向

在实际运营过程中,我发现以下几个有价值的改进方向:

  1. 多平台数据聚合:接入更多招聘网站数据(如BOSS直聘、拉勾)
  2. 智能简历匹配:实现职位需求与用户简历的自动匹配
  3. 薪酬分析功能:基于历史数据预测合理薪资范围
  4. 技能提升建议:根据目标职位推荐学习路径

这个项目最让我意外的收获是:简单的协同过滤算法经过精心调优后,在实际应用中的效果可以媲美很多复杂模型。关键在于对业务场景的深入理解——比如在计算用户相似度时,对"查看"和"投递"行为赋予不同权重,这种业务逻辑的融入比算法本身的选择更重要。