爬取boss直聘上海市人工智能招聘信息+LDA主题建模

爬取boss直聘上海市人工智能招聘信息

import time
import tqdm
import random
import requests
import json
import pandas as pd
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

用edge模拟登录boss网站

browser = webdriver.Edge()
time.sleep(5)
browser.get('https://www.zhipin.com/web/geek/job?query=%E6%99%BA%E8%83%BD&city=101020100&page=1')

设置搜索的网站,然后遍历每个列表的网站元素,获取url

base_url = 'https://www.zhipin.com/web/geek/job?query=%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%AE%9E%E4%B9%A0%E7%94%9F&city=101020100&page={}'max_clicks = 10  # 设置最大点击次数
click_count = 1  # 记录已经点击的次数
urls = []while click_count <= max_clicks:page_url = base_url.format(click_count)browser.get(page_url)time.sleep(8)try:li_list = browser.find_elements_by_xpath('//div[@class="search-job-result"]/ul/li')for li in li_list:link_element = li.find_element_by_xpath('.//div[@class="job-card-body clearfix"]')link_element=link_element.find_element_by_tag_name('a')link_href = link_element.get_attribute('href')print(link_href)urls.append(link_href)except Exception as e:print("Exception occurred:", str(e))click_count += 1  # 增加点击次数计数器
df = pd.DataFrame({'url': urls})
df.to_csv("./urls.csv", index=False)

遍历刚爬取的网页,用xpath语句定位招聘信息

contents=[]
df=pd.read_csv(r'urls5.csv')
for index, row in df.iterrows():url = row['url']  try:browser.get(url)print(url)time.sleep(6)content_e=browser.find_element_by_xpath('//div[@class="job-detail"]')content_e=content_e.find_element_by_xpath('.//div[@class="job-detail-section"]')content_e=content_e.find_element_by_xpath('.//div[@class="job-sec-text"]').textprint(content_e)contents.append(content_e)except:pass
df_=pd.DataFrame({'content': contents})
df_.to_excel(r'招聘信息5.xlsx',index=False)

LDA主题建模

数据集为爬取的boss直聘上海市的人工智能相关岗位招聘信息。

import numpy as np
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
import matplotlib.pyplot as plt
# from gensim.models.word2vec import Word2Vec
import matplotlib
from pylab import xticks,yticks,np
import  time
from sklearn.feature_extraction.text import  CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
import warnings
from gensim import corpora, models
from gensim.models import CoherenceModel
warnings.filterwarnings("ignore")
import codecs
import re
import pyLDAvis.gensim
from gensim.models import LdaModel
import pandas as pd
from gensim.corpora import Dictionary
from gensim import corpora, models
# pip install gensim,re,jieba,pylab
# #这里注意gensim的版本要一致,如果报错请查看网上教程

1 读入数据,文本清洗(去除非中文字符,将只有1个字符的数据删除,删除重复行)

df = pd.read_csv(r"招聘信息.csv")
def extract_chinese(text):chinese_pattern = re.compile(r'[\u4e00-\u9fa5]+') chinese_words = chinese_pattern.findall(text)  return ' '.join(chinese_words)  df['content'] = df['content'].apply(extract_chinese)
df['content'] = df['content'].apply(lambda x: ' '.join([word for word in x.split() if len(word) > 1]))
df.drop_duplicates(inplace=True)
df.head()

这边还可以通过snownlp库进行简单的情感分类

from snownlp import SnowNLP# 定义情感分类函数
def classify_sentiment(sentiment):if sentiment >= 0.5:return 'positive'else:return 'negative'def classify_sentiments(text):s = SnowNLP(text)sentiment = s.sentimentsreturn sentiment
# 对评论列进行情感分类
df['sentiment'] = df['content'].apply(classify_sentiments)
def classify_sentiment(sentiment_value):if sentiment_value > 0.5:return '正向'else:return '负向'# 应用分类函数
df['情感类型'] = df['sentiment'].apply(classify_sentiment)
content = df['content'].values.tolist()
content[:5]

2 开启jieba分词

import jieba
segment=[]
for line in content:try:segs = jieba.lcut(line)#分词for seg in segs:if len(seg)>1 and seg != '\r\n':segment.append(seg)except:print(line)continue
segment[:10]

3 应用停用词表

np.recfromtxt(r'./stop_words.utf8',encoding='utf-8')
words_df=pd.DataFrame({'segment':segment})
stopwords = np.recfromtxt(r'./stop_words.utf8',encoding='utf-8')
words_df = words_df[~words_df.segment.isin(stopwords)]
words_df.head()
words_df.head(20)
words_stat=words_df.groupby(by=['segment'])['segment'].agg([("计数",np.size)])
words_stat=words_stat.reset_index().sort_values(by=["计数"],ascending=False)
words_stat.head()
words_stat.iloc[4]

4 文本词云图

from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
mask_pic = np.array(Image.open(r"./1234.jpeg"))
wordcloud = WordCloud(width=300, height=200,scale=4,mask=mask_pic,font_path='simhei.ttf',background_color='white',max_font_size=80)
word_frequence = {x[0]:x[1] for x in words_stat.head(220).values}
wordcloud=wordcloud.fit_words(word_frequence)
plt.axis('off')
image = wordcloud.to_image()
wordcloud.to_file('词云.png')  # 保存图片
image.show()
words_stat.to_csv(r'文本频率表.csv',index=False)

5 TF_IDF词语权重表

comments = content
segmented_comments = []
for comment in comments:words = jieba.cut(comment)filtered_words = [word for word in words if word not in stopwords]segmented_comments.append(" ".join(filtered_words))
tfidf_vectorizer = TfidfVectorizer(max_features=1000)# 使用评论数据拟合TF-IDF向量化器并转换数据
tfidf_matrix = tfidf_vectorizer.fit_transform(segmented_comments)# 获取特征词列表
feature_names = tfidf_vectorizer.get_feature_names_out()# 将TF-IDF矩阵转换为DataFrame,并加上特征词作为列名
tfidf_df = pd.DataFrame(tfidf_matrix.toarray(), columns=feature_names)# 计算每个特征词的平均TF-IDF权重
avg_tfidf = tfidf_df.mean().sort_values(ascending=False)
print(avg_tfidf)
avg_tfidf.to_csv(r'./词语权重表.csv')

 6 LDA建模曲线图 

stop_words_file = './stop_words.utf8'
stop_words = set()
with codecs.open(stop_words_file, 'r', 'utf-8') as f:for word in f:stop_words.add(word.strip())
texts = [list(filter(lambda x: x not in stop_words, jieba.cut(text.replace(" ", "").strip()))) for text in content]
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
def lda_model_values(num_topics, corpus, dictionary):x = [] # x轴perplexity_values = [] # 困惑度coherence_values = []  # 一致性model_list = [] # 存储对应主题数量下的lda模型,便于生成可视化网页for topic in range(num_topics):print("主题数量:", topic+1)lda_model = models.LdaModel(corpus=corpus, num_topics=topic+1, id2word =dictionary, chunksize = 2000, passes=20, iterations = 400)model_list.append(lda_model)x.append(topic+1)perplexity_values.append(lda_model.log_perplexity(corpus))coherencemodel = models.CoherenceModel(model=lda_model, texts=texts, dictionary=dictionary, coherence='c_v')coherence_values.append(coherencemodel.get_coherence())print("该主题评价完成\n")return model_list, x, perplexity_values, coherence_values
# 调用准备函数
model_list, x, perplexity_values, coherence_values = lda_model_values(8, corpus, dictionary) # 绘制困惑度和一致性折线图
fig = plt.figure(figsize=(15,5))
plt.rcParams['font.sans-serif']=['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False 
ax1 = fig.add_subplot(1, 2, 1)
plt.plot(x, perplexity_values, marker="o")
plt.title("主题建模-困惑度")
plt.xlabel('主题数目')
plt.ylabel('困惑度大小')
xticks(np.linspace(1, 8,8, endpoint=True)) # 保证x轴刻度为1ax2 = fig.add_subplot(1, 2, 2)
plt.plot(x, coherence_values, marker="o")
plt.title("主题建模-一致性")
plt.xlabel("主题数目")
plt.ylabel("一致性大小")
xticks(np.linspace(1,8,8 ,endpoint=True))plt.show()# plt.savefig('主题建模一致性_困惑度曲线.png')

 7 LDA气泡图 

lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=3, passes = 10,random_state=42)
#将这里的num_topics换成上述观测到的最佳建模主题数,数值应该取困惑度小同时一致性高的拐点,注意纵坐标!!!
#每次生成的曲线图和LDA气泡图可能不一样,因为该算法为无监督算法,所以每次训练的语料不一样
topic_list=lda.print_topics()
print(topic_list)result_list =[]
for i in lda.get_document_topics(corpus)[:]:listj=[]for j in i:listj.append(j[1])bz=listj.index(max(listj))result_list.append(i[bz][0])
print(result_list)
topic_data = pd.DataFrame(columns=['主题', '关键词', '概率分数'])for topic in topic_list:topic_num, topic_terms = topicterms = topic_terms.split('+')for term in terms:probability, word = term.split('*')word = word.strip()probability = probability.strip()topic_data = pd.concat([topic_data, pd.DataFrame({'主题': [topic_num], '关键词': [word], '概率分数': [probability]})], ignore_index=True)
topic_data = topic_data.groupby('主题')['关键词'].apply(lambda x: ' '.join(x)).reset_index()
topic_data['关键词'] = topic_data['关键词'].replace('"', '', regex=True)# 将 DataFrame 导出到 Excel 文件
topic_data.to_excel('主题关键词概率分数.xlsx', index=False)
pyLDAvis.enable_notebook()
data = pyLDAvis.gensim.prepare(lda, corpus, dictionary)
pyLDAvis.save_html(data, './topic.html')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/482034.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目快过:知识蒸馏 | 目标检测 |FGD | Focal and Global Knowledge Distillation for Detectors

公开时间&#xff1a;2022年3月9号 项目地址&#xff1a;https://github.com/yzd-v/FGD 论文地址&#xff1a;https://arxiv.org/pdf/2111.11837 知识蒸馏已成功地应用于图像分类。然而&#xff0c;目标检测要复杂得多&#xff0c;大多数知识蒸馏方法都失败了。本文指出&#…

【Linux】匿名管道通信场景——进程池

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

Sybase数据恢复—Sybase数据库无法启动,Sybase Central连接报错的处理案例

Sybase数据库数据恢复环境&#xff1a; Sybase数据库版本&#xff1a;SQL Anywhere 8.0。 Sybase数据库故障&分析&#xff1a; Sybase数据库无法启动。 错误提示&#xff1a; 使用Sybase Central连接报错。 数据库数据恢复工程师经过检测&#xff0c;发现Sybase数据库出现…

分布式FastDFS存储的同步方式

目录 一&#xff1a;FatsDFS的结构图 二&#xff1a;FatsDFS文件同步 前言&#xff1a; 1&#xff1a;同步日志所在目录 2&#xff1a;binlog格式 3&#xff1a;同步规则 4&#xff1a;binlog同步过程 1 &#xff1a;获取组内的其他Storage信息 tracker_report_thread_e…

【绘图】数据可视化(python)

对于数据绝对值差异较大&#xff08;数据离散&#xff09; 1. 对数坐标直方图&#xff08;Histogram with Log Scale&#xff09; import pandas as pd import matplotlib.pyplot as plt import numpy as np# 示例数据 data {count: [10, 20, 55, 90, 15, 5, 45, 80, 1000, …

使用Dify与BGE-M3搭建RAG(检索增强生成)应用-改进一,使用工作流代替Agnet

文章目录 前言Agent vs 工作流编写工作流 前言 在上一篇中&#xff0c;我们实现了一个基本的基于Dify的RAG的示范。 使用Dify与BGE-M3搭建RAG&#xff08;检索增强生成&#xff09;应用 这个效果确实很差。 我们一起来看看&#xff0c;该怎么改进。 今天我们就尝试一下&…

【Linux课程学习】:文件第二弹---理解一切皆文件,缓存区

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 Linux学习笔记&#xff1a; https://blog.csdn.net/d…

【iOS】《Effective Objective-C 2.0》阅读笔记(一)

文章目录 前言了解OC语言的起源在类的头文件中尽量少引入其他头文件多用字面量语法&#xff0c;少用与之等价的方法字面量数值字面量数组字面量字典 多用类型常量&#xff0c;少用#define预处理指令用枚举法表示状态、选项、状态码 总结 前言 最近开始阅读一些iOS开发的相关书籍…

猫狗分类调试过程

一&#xff0c;下载名称为archive数据集 下载方式&#xff1a;机房共享文件夹 二、打开CatDogProject项目 配置环境&#xff1a;选择你所建的环境 三、调试运行 1&#xff0c;报错一&#xff1a;Traceback (most recent call last): File "G:/AI_Project/CatDogPro…

探索Python WebSocket新境界:picows库揭秘

文章目录 探索Python WebSocket新境界&#xff1a;picows库揭秘第一部分&#xff1a;背景介绍第二部分&#xff1a;picows库概述第三部分&#xff1a;安装picows库第四部分&#xff1a;简单库函数使用方法第五部分&#xff1a;场景应用第六部分&#xff1a;常见Bug及解决方案第…

零基础学安全--Burp Suite(4)proxy模块以及漏洞测试理论

目录 学习连接 一些思路 proxy模块 所在位置 功能简介 使用例子 抓包有一个很重要的点&#xff0c;就是我们可以看到一些在浏览器中看不到的传参点&#xff0c;传参点越多就意味着攻击面越广 学习连接 声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可…

30 基于51单片机的手环设计仿真

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;DHT11温湿度采集温湿度&#xff0c;滑动变阻器连接ADC0832数模转换器模拟水位传感器检测水位&#xff0c;通过LCD1602显示信息&#xff0c;然后在程序里设置好是否…

十一、快速入门go语言之接口和反射

文章目录 接口:one: 接口基础:two: 接口类型断言和空接口:star2: 空接口实现存储不同数据类型的切片/数组:star2: 复制切片到空接口切片:star2: 类型断言 反射 &#x1f4c5; 2024年5月9日 &#x1f4e6; 使用版本为1.21.5 接口 十、Java类的封装和继承、多态 - 七点半的菜市…

QT6学习第六天 初识QML

QT6学习第六天 创建Qt Quick UI项目使用Qt Quick DesignerQML 语法基础导入语句 import对象 object 和属性 property布局注释表达式和属性绑定QML 编码约定 设置应用程序图标 创建Qt Quick UI项目 如果你有只测试QML相关内容快速显示界面的需求&#xff0c;这时可以创建Qt Qui…

图解RabbitMQ七种工作模式生产者消费者模型的补充

文章目录 1.消费者模型2.生产者-消费者模型注意事项2.1资源释放顺序问题2.2消费者的声明问题2.3虚拟机和用户的权限问题 3.七种工作模式3.1简单模式3.2工作模式3.3发布/订阅模式3.4路由模式3.5通配符模式3.6RPC通信3.7发布确认 1.消费者模型 之前学习的这个消息队列的快速上手…

C-操作符

操作符种类 在C语言中&#xff0c;操作符有以下几种&#xff1a; 算术操作符 移位操作符 位操作符 逻辑操作符 条件操作符 逗号表达式 下标引用&#xff0c;函数调用 拓展&#xff1a;整型提升 我们介绍常用的几个 算术操作符 &#xff08;加&#xff09;&#xff…

使用 Spring Boot 和 GraalVM 的原生镜像

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;历代文学&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;高并发设计&#xf…

基于Java Springboot宠物医院微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

Tree搜索二叉树、map和set_数据结构

数据结构专栏 如烟花般绚烂却又稍纵即逝的个人主页 本章讲述数据结构中搜索二叉树与HashMap的学习&#xff0c;感谢大家的支持&#xff01;欢迎大家踊跃评论&#xff0c;感谢大佬们的支持! 目录 搜索二叉树的概念二叉树搜索模拟实现搜索二叉树查找搜索二叉树插入搜索二叉树删除…

C#使用ExcelDataReader读取Xlsx文件为DataTable对象

创建控制台项目 在NuGet中安装ExcelDataReader.DataSet 3.7.0 创建一个xlsx文件 测试代码 读取xlsx文件内容&#xff0c;为一个DataTable对象。 读取xlsx时&#xff0c;xlsx文件不能被其他软件打开&#xff0c;否则会报“进程无法访问此文件”的错。 using ExcelDataRead…