Анализ данных Xiaobai — полный анализ ссылок на вакансии Python

Python анализ данных

делаю это недавноPythonПроект анализа работы, фон для этого из-за контактаPythonтак долго, не такPythonИметь полное представление о положении. Поэтому с помощью этого анализа мы хотим понятьPythonКакие должности актуальны, каковы различия в спросе в разных городах, какая зарплата, какие требования к опыту работы и т.д. Анализируемые ссылки включают в себя:

  • Сбор данных

  • Очистка данных

  1. аномальное время создания
  2. необычный уровень заработной платы
  3. Необычный опыт работы
  • Статистический анализ
  1. Рыночные данные
  2. Одномерный анализ
  3. 2D перекрестный анализ
  4. Многомерное бурение
  • Анализ текста
  1. предварительная обработка текста
  2. облако слов
  3. Анализ ассоциации роста FP
  4. Анализ тематической модели LDA

Разделено на две статьи. Первая часть знакомит с содержанием первых трех частей, а вторая часть посвящена анализу текста.

0. Сбор данных

Умную женщину трудно приготовить без риса.В большинстве случаев мы используем бизнес-данные компании для анализа данных, поэтому нам не нужно заботиться о сборе данных. Однако некоторые исследования данных, которые мы проводим в свободное время, требуют самостоятельного сбора данных.爬虫.

Данные, используемые в этом обмене, были просканированы с Lagou.com. Он в основном разделен на три части: определение того, как получить данные, запись сканера для захвата данных, а также форматирование и сохранение захваченных данных вMongoDB. Эту часть сбора данных я представил отдельно в статье ранее, и исходный код тоже открыт.Я не буду повторяться здесь.Друзья, которые хотят знать, могут прочитать предыдущую статью."Работа по скалолазанию на питоне".

1. Очистка данных

Получив данные, не спешите их анализировать. Сначала нам нужно получить общее представление о данных и удалить некоторые аномальные записи в процессе, чтобы они не повлияли на последующие статистические результаты.

Например, предположим, что имеется 101 должность, из которых 100 имеют нормальную зарплату в 10 000, а другая зарплата имеет ненормальное значение в 1 000 000. Если вычислить выбросы, средняя зарплата составит 29,7 к, а средняя зарплата будет рассчитана путем исключения выбросов. это 29,7к Это 10к, разница между ними почти в 3 раза.

Поэтому мы должны обратить внимание на качество данных, прежде чем проводить анализ, особенно когда объем данных относительно невелик. Количество позиций, проанализированных в этом анализе, составляет около 1w, что является относительно небольшим объемом данных, поэтому на этапе очистки данных требуется много времени.

Начнем с очистки данных и перейдем к этапу кодирования.

1.0 Фильтрация вакансий, связанных с python

Импорт общих библиотек

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pymongo import MongoClient

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  #解决seaborn中文字体显示问题
%matplotlib inline

отMongoDBчитать данные

mongoConn = MongoClient(host='192.168.29.132', port=27017)
db = mongoConn.get_database('lagou')
mon_data = db.py_positions.find()
# json转DataFrame
jobs = pd.json_normalize([record for record in mon_data])

Предварительный просмотр данных

jobs.head(4)

распечататьjobsинформация о ранге

jobs.info()

Всего было прочитано 1,9w постов, но не все из них были связаны сPythonСвязанный. Итак, первое, что нам нужно сделать, это отфильтроватьPythonСвязанные вакансии, используя правило, которое содержится в названии или тексте работыpythonнить

# 抽取职位名称或者职位正文里包含 python 的
py_jobs = jobs[(jobs['pName'].str.lower().str.contains("python")) | (jobs['pDetail'].str.lower().str.contains("python"))]

py_jobs.info()

После скрининга осталось всего 10 705 позиций, и мы продолжаем чистить эти позиции.

1.1 Очистить выбросы по времени создания

Целью очистки измерения «время создания работы» является, главным образом, предотвращение появления некоторых должностей с особенно возмутительным временем создания, например: есть должности, набранные в 2000 году.

# 创建一个函数将职位创建时间戳转为月份
import time
def timestamp_to_date(ts):
    ts = ts / 1000
    time_local = time.localtime(ts)
    return time.strftime("%Y-%m", time_local)
    
# 增加'职位创建月份'一列
py_jobs['createMon'] = py_jobs['createTime'].map(timestamp_to_date)

# 按照职位id、创建月份分组计数
py_jobs[['pId', 'createMon']].groupby('createMon').count()

图片

вакансии по месяцам

Создайте функцию timestamp_to_date для преобразования времени создания задания в месяц создания задания, а затем сгруппируйте счетчики по месяцу создания задания. Судя по результатам, время создания рабочих мест не особенно возмутительно, то есть выбросов нет. Тем не менее, я фильтрую по времени создания рабочих мест и храню данные только за три месяца 10, 11 и 12, потому что на эти три месяца приходится основная часть рабочих мест, и я хочу сосредоточиться только на новых рабочих местах.

# 只看近三个月的职位
py_jobs_mon = py_jobs[py_jobs['createMon'] > '2020-09']

1.2 Убрать выбросы по зарплате

Очистка заработной платы проводится в первую очередь для предотвращения особо запредельных окладов на определенных должностях. В этом разделе в основном рассматриваются три характеристики: выбросы с высокой заработной платой, выбросы с низкой заработной платой и выбросы с большим разбросом заработной платы.

Сначала укажите все зарплаты

py_jobs_mon[['pId', 'salary']].groupby('salary').count().index.values

Возьмите выбросы с высокой зарплатой в качестве примера и посмотрите, есть ли выбросы

# 薪资高的离群值
py_jobs_mon[py_jobs_mon['salary'].isin(['150k-200k', '100k-150k'])]

图片

Отклонения от высоких зарплат

Конечно же, необычная должность нашлась, и новый стажер действительно дал150k-200k, очевидно, нужно очистить.

Точно так же мы можем найти необычные позиции и для других характеристик.

图片

Очистка выбросов в соответствии с опытом работы, которая будет представлена ​​в разделе 1.3, аналогична Во избежание слишком длинного кода я не буду размещать здесь код. Короче говоря, после очистки по этим 3 атрибутам осталось 9715 позиций.

После завершения очистки данных мы официально входим в ссылку анализа.Анализ делится на две части, статистический анализ и анализ текста.Первый должен делать статистику по числовым показателям, а второй - анализировать текст. Обычно мы больше всего соприкасаемся с первыми, что позволяет нам понять анализируемый объект с макро-ракурса. Анализ текста также имеет незаменимое значение, на котором мы сосредоточимся в следующей статье.

2. Статистический анализ

Помимо уточнения цели анализа, нам также необходимо понять, для кого предназначены результаты анализа. В этом анализе я должен ориентироваться на школьников, потому что они действительно хотят знатьPythonположение человека. Поэтому наше аналитическое мышление должно развиваться в соответствии с тем, что они хотят видеть, и не может быть случайных нагромождений данных без правил.

2.0 Рыночные данные

Данные для статистического анализа, как правило, расширяются от грубых до мелких в соответствии с детализацией данных.Данные с самой грубой степенью детализации представляют собой число без каких-либо условий фильтрации и не разбитое по какому-либо измерению. В нашем проекте это фактически общее количество позиций, и выше мы тоже видели 9715. Если мы сравним позиции Java и PHP, мы сможем сделать некоторые выводы, но просто смотреть на общее количество, очевидно, не имеет практического значения.

Итак, далее нам нужно выполнить мелкозернистое разбиение по измерению.

2.1 Одномерный анализ

Мы начинаем от грубого к тонкому и сначала анализируем его по одному измерению. Для студента, какие самые срочные данные он хочет знать? Думаю, это распределение количества рабочих мест между разными городами. Потому что первый вопрос, который студенты должны рассмотреть при выборе места работы, — это какой город выбрать, а еще один момент, который следует учитывать при рассмотрении вопроса о том, какой город — это количество рабочих мест Чем больше рабочих мест, тем лучше перспективы.

# 城市
fig = plt.figure(dpi=85)
py_jobs_final['city'].value_counts(ascending=True).plot.barh()

图片

Количество рабочих мест по городам

В Пекине больше всего рабочих мест, вдвое больше, чем в Шанхае, занявшем второе место. В Гуанчжоу меньше всего рабочих мест, меньше, чем в Шэньчжэне.

После того, как вы определились, в каком городе развиваться, следующее, что нужно учитывать, — какую позицию занять. мы все знаемPythonОн имеет широкий спектр применения, и, естественно, я хочу видеть разные типыPythonРаспределение рабочих мест

# 按照p1stCat(一级分类)、p2ndCat(二级分类)分组计数
tmp_df = py_jobs_final.groupby(['p1stCat', 'p2ndCat']).count()[['_id']].sort_values(by='_id')
tmp_df = tmp_df.rename(columns={'_id':'job_num'})
tmp_df = tmp_df[tmp_df['job_num'] > 10]

tmp_df.plot.barh(figsize=(12,8), fontsize=12)

p1stCatиp2ndCatЭто галочка, а не моя метка.

图片

Из данных мы пришли к выводу, что потребность вPythonСреди должностей навыков тестирование занимает первое место, разработка данных занимает второе место, а разработка бэкэнда относительно невелика, что также соответствует нашему восприятию.

Здесь мы смотрим показатель – это количество должностей, конечно, можно посмотреть и среднюю зарплату.

Из двух измерений классификации городов и должностей мы имеемPythonПозиция имеет общее понимание. Нужно ли смотреть на другие измерения, такие как зарплата и опыт работы, и эти два измерения также волнуют всех. На мой взгляд, из одного измерения достаточно города и классификации должностей, а остальные не имеют практического эталонного значения. Поскольку заработная плата должна быть связана с определенным типом должности, заработная плата должностей искусственного интеллекта, естественно, высока, аналогично, опыт работы также связан с категорией должности.Когда большие данные только начинаются, опыт работы должности, естественно низкий. Следовательно, эти два измерения не имеют опорного значения из одного измерения.Должно быть осмысленно смотреть на определенные типы позиций. Когда мы проводим статистический анализ, мы не должны загромождать данные, а должны четко понимать логику данных и их ценность для лиц, принимающих решения.

2.1 Двумерный перекрестный анализ

Для студента, когда он определил город, в котором он работает, и понимает распределение различных должностей, какие данные нам нужно показать ему, чтобы предоставить ему решение о карьере?

Для студентов, которые хотят поехать в Пекин для развития, он хочет знать распределение различных типов должностей в Пекине, условия заработной платы, требования к опыту работы и какие компании набирают сотрудников. Точно так же студенты, которые хотят поехать в Шанхай, Шэньчжэнь и Гуанчжоу, имеют схожие потребности. Таким образом, мы определили параметры и показатели, которые необходимо проанализировать: город, категория работы, и они должны пересекаться. Показатели это количество должностей, средняя зарплата, опыт работы и компания.Первые три легко сказать, а вот четвертый нужно охарактеризовать количественным показателем.Здесь я выбираю размер компании.

Размеры уже есть. Нам нужно подготовить индикаторы. Например, в нашем наборе данных столбец зарплаты15k-20kТакой текст нам нужно обработать в числовой тип. Возьмите зарплату в качестве примера, напишите функцию, чтобы превратить ее в число

# 薪资转为数字
def get_salary_number(salary):
    salary = salary.lower().replace('k', '')
    salary_lu = salary.split('-')
    lower = int(salary_lu[0])
    if len(salary_lu) == 1:
        return lower
    upper = int(salary_lu[1])
    
    return (lower + upper) / 2

Опыт работы и размер компании также обрабатываются с помощью аналогичной логики.Чтобы сэкономить место, я буду субсидировать код.

# 将3个文本列转为数字
py_jobs_final['salary_no'] = py_jobs_final['salary'].map(get_salary_number)
py_jobs_final['work_year_no'] = py_jobs_final['workYear'].map(get_work_year_number)
py_jobs_final['csize_no'] = py_jobs_final['cSize'].map(get_csize_number)

Как представить данные с помощью параметров и показателей? Большинство данных, которые мы обычно отображаем, являются двумерными, абсцисса — это измерение, а ордината — индикатор. Поскольку мы хотим отображать двухмерные индикаторы пересечения, мы должны использовать для их отображения трехмерную графику. Здесь мы используемAxes3Dрисовать

# 只选择 开发|测试|运维类 一级分类下,测试、数据开发、人工智能、运维、后端开发 二级分类
job_arr = ['测试', '数据开发', '人工智能', '运维', '后端开发']
py_jobs_2ndcat = py_jobs_final[(py_jobs_final['p1stCat'] == '开发|测试|运维类') & (py_jobs_final['p2ndCat'].isin(job_arr))]

%matplotlib notebook

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  
# 画3d柱状图
city_map = {'北京': 0, '上海': 1, '广州': 2, '深圳': 3} # 将城市转为数字,在坐标轴上显示
idx_map = {'pId': '职位数', 'salary_no': '薪资(单位:k)', 'work_year_no': '工作经验(单位:年)', 'csize_no': '公司规模(单位:人)'}

fig = plt.figure()
for i,col in enumerate(idx_map.keys()):
    if col == 'pId':
        aggfunc = 'count'
    else:
        aggfunc = 'mean'
    jobs_pivot = py_jobs_2ndcat.pivot_table(index='p2ndCat', columns='city', values=col, aggfunc=aggfunc)
    
    ax = fig.add_subplot(2, 2, i+1, projection='3d')
    for c, city in zip(['r', 'g', 'b', 'y'], city_map.keys()):
        ys = [jobs_pivot[city][job_name] for job_name in job_arr]
        cs = [c] * len(job_arr)
        
        ax.bar(job_arr, ys, zs=city_map[city], zdir='y', color=cs)
    
    ax.set_ylabel('城市')
    ax.set_zlabel(idx_map[col])
    ax.legend(city_map.keys())

plt.show()

Сначала я выбрал только топ-5 категорий вакансий, а затем вычислил каждый показатель в цикле, рассчитывая показатели с помощьюDataFrameПерспектива в (pivot_table), легко агрегировать двухмерные индикаторы, получить нужные данные и, наконец, отобразить измерения и индикаторы в виде трехмерной гистограммы.

图片

Взяв в качестве примера Пекин, можно увидеть, что зарплата на должностях искусственного интеллекта самая высокая, разработка данных и внутренняя разработка аналогичны, а тестирование, эксплуатация и обслуживание относительно низкие. Искусственный интеллект обычно предъявляет более низкие требования к опыту работы, чем другие должности, ведь это развивающаяся позиция, что также соответствует нашему восприятию. Средний размер компаний, нанимающих должности искусственного интеллекта, меньше, чем другие должности, что указывает на то, что появляется больше стартапов в области ИИ, а компаний, занимающихся тестированием и разработкой данных, больше.В конце концов, небольшим компаниям вряд ли нужно тестирование, а у малых компаний нет большой объем данных.

Одна вещь, которую я должен напомнить всем, это то, что кроме количества позиций, абсолютные значения других показателей смещены, что связано с нашей логикой. Однако метод обработки, используемый разными позициями, одинаков, поэтому показатели между разными позициями сопоставимы, то есть абсолютное значение не имеет значения, но отношение частичного порядка разных позиций имеет смысл.

2.3 Многомерное бурение

Когда студент определился с городом и работой, что еще он хочет знать? Например, он может захотеть узнать зарплату, требования к опыту работы и размер компании в Пекине, должности искусственного интеллекта в разных отраслях или Пекин, должности искусственного интеллекта, требования к зарплате и опыту работы в компаниях разных размеров.

图片

Это предполагает пересечение трех измерений. Теоретически мы можем проводить перекрестный анализ по любому измерению, но чем больше у нас измерений, тем меньше наше поле зрения и тем более мы сосредоточены. В этом случае мы часто фиксируем значения одних измерений, чтобы проанализировать ситуацию с другими измерениями.

На примере Пекина рассмотрим распределение заработной платы для разных должностей и требований к опыту работы.

tmp_df = py_jobs_2ndcat[(py_jobs_2ndcat['city'] == '北京')]
tmp_df = tmp_df.pivot_table(index='workYear', columns='p2ndCat', values='salary_no', aggfunc='mean').sort_values(by='人工智能')
tmp_df

图片

Для того, чтобы увидеть данные более наглядно, мы рисуем двухмерную диаграмму рассеяния, размер кода точки, сколько зарплата

[plt.scatter(job_name, wy, c='darkred', s=tmp_df[job_name][wy]*5) for wy in tmp_df.index.values for job_name in job_arr]

图片

Эти данные можно сравнивать как по горизонтали, так и по вертикали. При горизонтальном сравнении мы видим, что уровень заработной платы искусственного интеллекта, как правило, выше, чем на других должностях при том же опыте работы, при вертикальном сравнении мы видим, что заработная плата на должностях с искусственным интеллектом увеличивается с увеличением рабочего года, чем на других должностях. выше (круги становятся больше других).

Поэтому очень важно в какую строку вводить.

Конечно, если вы чувствуете, что недостаточно сосредоточены, можете продолжать тренировку. Например, если вы хотите увидеть ситуацию с зарплатой в Пекине, рабочие места с искусственным интеллектом, индустрию электронной коммерции и различные размеры компаний, логика обработки одинакова.

Мы продолжаем знакомить вас с тем, как использовать интеллектуальный анализ текста дляPythonАнализ работы. Он будет включать в себя некоторые алгоритмы интеллектуального анализа данных, но я надеюсь, что эта статья предназначена для новичков в алгоритмах, она не будет затрагивать принципы алгоритмов и может быть использована для решения бизнес-задач.

3.0 Предварительная обработка текста

Цель предварительной обработки текста такая же, как и очистка данных, представленная в предыдущей статье, которая состоит в том, чтобы преобразовать данные в то, что нам нужно.Этот шаг в основном состоит из двух шагов: сегментация слов и удаление стоп-слов.

Основываясь на том, что мы сделали в предыдущей статьеpy_jobs_finalDataFrame для последующей обработки, сначала посмотрите текст поста

py_jobs_final[['pId', 'pDetail']].head(2)

图片

Тело работыpDetailСодержание — это «должностные обязанности» и «должностные требования», которые мы часто видим. На картинке выше мы видим, что требования к вакансии содержат html-теги, такие как:<br>,Это потому чтоpDetailИзначально он должен отображаться на веб-странице, поэтому в нем будут html-теги, но, к счастью, у нас есть основа краулера, используйтеBeautifulSoupМодули легко утилизировать

from bs4 import BeautifulSoup# 使用BeautifulSoup 去掉html标签, 只保留正文内容,并转小写py_jobs_final['p_text'] = py_jobs_final['pDetail'].map(lambda x: BeautifulSoup(x, 'lxml').get_text().lower())py_jobs_final[['pId', 'pDetail', 'p_text']].head(2)

图片

После удаления тегов html используйтеjiebaМодуль токенизирует текст.jiebaПредусмотрены три режима для сегментации слов, полный режим, точный режим и режим поисковой системы. Конкретная разница будет понятна, глядя на пример.

import jieba
job_req = '熟悉面向对象编程,掌握java/c++/python/php中的至少一门语言;'

# 全模式
seg_list = jieba.cut(job_req, cut_all=True)
# 精确模式
seg_list = jieba.cut(job_req, cut_all=False)
# 搜索引擎模式
seg_list = jieba.cut_for_search(job_req)

图片

полный режим

图片

точный режим

图片

режим поисковой системы

Разница очевидна с первого взгляда, и для этого анализа я использовал точный режим.

py_jobs_final['p_text_cut'] = py_jobs_final['p_text'].map(lambda x: list(jieba.cut(x, cut_all=False)))

py_jobs_final[['pId', 'p_text', 'p_text_cut']].head()

图片

После сегментации слов мы обнаружили, что оно содержит много знаков препинания и несколько бессмысленных служебных слов, которые не помогают нашему анализу, поэтому следующее, что нам нужно сделать, это удалить стоп-слова.

# stop_words.txt里包含1208个停用词
stop_words = [line.strip() for line in open('stop_words.txt',encoding='UTF-8').readlines()]

# 添加换行符
stop_words.append('\n')

# 去停用词
def remove_stop_word(p_text):
    if not p_text:
        return p_text
    
    new_p_txt = []
    for word in p_text:
        if word not in stop_words:
            new_p_txt.append(word)
    
    return new_p_txt

py_jobs_final['p_text_clean'] = py_jobs_final['p_text_cut'].map(remove_stop_word)
py_jobs_final[['pId', 'p_text_cut', 'p_text_clean']].head()

После трех предыдущих шаговp_text_cleanКолонки чистые и готовы к последующему анализу.

3.1 Отношения FP-Growth с горнодобывающей ассоциацией

Первый текстовый анализ, который я сделал, заключался в том, чтобы определить ассоциативные отношения. Пример, который каждый может придумать, когда дело доходит до анализа ассоциаций, - это «пиво и подгузники». Здесь я также хочу использовать эту идею, чтобы выкопать разныеPythonПозиция, слова которой имеют сильную корреляцию. Используемый алгоритм майнингаmlxtendмодульныйFP-Growth,FP-GrowthРеализовать коэффициент майнинга правил ассоциацииAprioriБыстрее.

from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import fpgrowth

# 构造fp-growth需要的输入数据
def get_fpgrowth_input_df(dataset):
    te = TransactionEncoder()
    te_ary = te.fit(dataset).transform(dataset)
    return pd.DataFrame(te_ary, columns=te.columns_)

Давайте сначала углубимся в категорию «искусственный интеллект».

ai_jobs = py_jobs_final[(py_jobs_final['p1stCat'] == '开发|测试|运维类') & (py_jobs_final['p2ndCat'] == '人工智能')]

ai_fpg_in_df = get_fpgrowth_input_df(ai_jobs['p_text_clean'].values)

ai_fpg_df = fpgrowth(ai_fpg_in_df, min_support=0.6, use_colnames=True)

min_supportПараметр используется для установки минимальной поддержки, а также сохранения частых наборов элементов, частота которых превышает это значение. Например, в 100 заказах на покупку есть 70 заказов, содержащих «пиво», 75 заказов «подгузники» и 1 заказ «яблоко».min_support=0.6В случае "пиво" и "памперс" останутся, "яблоко" выбросят, т.к.1/100 < 0.6.

посмотриai_fpg_dfрезультат

Я только принял участие здесь,itemsetsСтолбец представляет собой частый набор элементов, тип замороженного набора, который содержит 1 или более элементов.support— частота частых наборов элементов, которая здесь больше 0,6. строка 0(python)Представляет 99,6% рабочих местpythonЭто слово в строке 16 представляет 93,8% вакансий.pythonи算法Одновременно.

С ними мы можем рассчитать корреляцию по формуле Байеса, например: я вижу, что есть c++, тогда я хочу увидеть внешний видpythonНасколько высока вероятность должности, на которой от вас требуется знание C++, по формуле условной вероятностиp(c++|python) = p(c++,python) / p(python)Выполните следующие расчеты

# python概率
p_python = ai_fpg_df[ai_fpg_df['itemsets'] == frozenset(['python'])]['support'].values[0]

# c++ 和 python 联合概率
p_python_cpp = ai_fpg_df[ai_fpg_df['itemsets'] == frozenset(['python', 'c++'])]['support'].values[0]

# 出现python的条件下,出现c++的概率
print('p(c++|python) = %f' % (p_python_cpp / p_python))

Результат составил 64%. То есть рабочие места искусственного интеллекта требуют использованияpython, существует вероятность 64%, что требуется C++. Аналогично, мы также можем видетьpythonсвязь с другими словами

pythonи算法Степень корреляции 94%, что соответствует ожиданиям, ведь отсев идет на позиции искусственного интеллекта. Появлятьсяpythonрабочие места, появляются机器学习и深度学习Вероятность примерно одинаковая, как 69%, появляются机器学习Вероятность чуть выше, около 70%, вроде бы спрос на эти две позиции не особо плохой. И да经验Требования кажутся достаточно жесткими, с вероятностью появления 85%.

Аналогично, посмотрим数据开发анализ работы

Одно отличие, которое ясно видно, заключается в том, что классификация искусственного интеллекта сpythonЧастично техническая категория с высокой корреляцией,机器学习,深度学习а такжеc++. И слова в разработке данных, очевидно, больше ориентированы на бизнес, например, здесь业务,分析. То есть, если в работе упоминаетсяpythonТогда вероятность того, что его упомянут, составляет более 60%.业务или分析, в конце концов, данные должны быть тесно связаны с бизнесом.

Правила ассоциации больше касаются детализации слов, которые слишком хороши. Далее мы будем анализировать документы с повышенной детализацией.

3.2 Анализ тематической модели

LDA(Latent Dirichlet Allocation)представляет собой модель генерации тела документа. Модель предполагает, что тема документа подчиняетсяDirichletраспределение, слова в теме также подчиняютсяDirichletраспределения с помощью различных алгоритмов оптимизации для решения этих двух неявных распределений.

Здесь мы звонимsklearnвнутриLDAалгоритм для завершения

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation

def run_lda(corpus, k):
    cntvec = CountVectorizer(min_df=1, token_pattern='\w+')
    cnttf = cntvec.fit_transform(corpus)
    
    lda = LatentDirichletAllocation(n_components=k)
    docres = lda.fit_transform(cnttf)
    
    return cntvec, cnttf, docres, lda

Здесь мы используемCountVectorizerВектор слов генерируется путем подсчета частоты слов, какLDAввод. Вы также можете использовать глубокое обучение для создания векторов слов, Преимущество в том, что вы можете изучить отношения между словами.

LDAЕсть только один набор параметровn_components, то есть на сколько тем нужно разделить задание.

Давайте начнем с разделения задач ИИ на 8 тем.

cntvec, cnttf, docres, lda = run_lda(ai_jobs['p_corp'].values, 8)

перечислитьlda.components_Возвращается двумерный массив, каждая строка которого представляет тему, а массив каждой строки представляет собой распределение слов по этой теме. Нам нужно определить другую функцию для вывода слов с наибольшей вероятностью появления каждой темы.

def get_topic_word(topics, words, topK=10):
    res = []
    
    for topic in topics:
        sorted_arr = np.argsort(-topic)[:topK]  # 逆序排取topK
        res.append(','.join(['%s:%.2f'% (words[i], topic[i]) for i in sorted_arr]))
        
    return '\n\n'.join(res)

В рамках темы вывода искусственного интеллекта каждая тема и верхнее распределение слов

print(get_topic_word(lda.components_ / lda.components_.sum(axis=1)[:, np.newaxis], cntvec.get_feature_names(), 20))

lda.components_ / lda.components_.sum(axis=1)[:, np.newaxis]Цель - нормализация.

Видно, что первая тема связана с естественным языком, вторая тема связана с речью, третья тема связана с количественными финансовыми инвестициями, четвертая тема связана с медицинским обслуживанием, а пятая тема связана с алгоритмами машинного обучения. Шестая тема — английские позиции, седьмая тема — компьютерное зрение, а восьмая тема — моделирование, связанное с робототехникой.

Я чувствую, что точки можно разделить, можно выделить хотя бы какие-то основные направления. И есть также четкое различие перед каждым классом.

Аналогично, посмотрим数据开发Тема работы, вот 6 тем

Первая тема связана с хранилищем данных и технологиями больших данных, вторая тема связана с английскими позициями, третья тема связана с базами данных и облаком, четвертая тема связана с алгоритмами, пятая тема связана с бизнесом и анализом, и третья тема связана с бизнесом и анализом Шесть тем — рептилии, это нормально.

мне вот больше интересно人工智能и数据开发рабочих мест, на которых мы ранее сосредоточились测试,后端开发Можно и так, идея та же.

На этом наш текстовый анализ закончен, мы видим, что текстовый анализ может извлекать информацию, которая не может быть подсчитана в статистическом анализе, и мы будем часто использовать ее в последующем анализе. Кроме того, эта часть облака слов не была сделана по причинам времени.Мы уже делали это раньше.Это не очень сложно.Вы можете попробовать использовать его.TF-IDFрисовать облака слов для разных категорий работы. Полный код еще разбирается, друзья, кому он нужен, могут оставить мне сообщение.

Добро пожаловать в публичный аккаунт"Перевозить"