Лучший способ сопоставить список слов со списком должностных обязанностей Python - PullRequest
0 голосов
/ 27 августа 2018

Вот моя проблема (я работаю над Python): У меня есть датафрейм со столбцами: Index(['job_title', 'company', 'job_label', 'description'], dtype='object')

И у меня есть список слов, который содержит 300 навыков:

keywords = ["C++","Data Analytics","python","R", ............ "Django"] 

Мне нужно сопоставить эти ключевые слова с каждым из описаний заданий и получить новый фрейм данных, в котором указано, является ли истина или ложь тем, что C ++ находится в описании задания [0] ... описание задания [1], описание задания [2] и скоро.

Мой новый фрейм данных будет:

столбцы: ['job_title', 'company', 'description', "C ++", "Data Analytics", ....... "Джанго"]

Где каждый столбец ключевых слов сказал true или false, если он соответствует (найден) или не указан в описании вакансии.

Могут быть и другие способы структурирования кадра данных (я слушаю предложения).

Надеюсь, у меня все в порядке с вопросом. Я пробую регулярное выражение, но я не могу заставить его повторяться по каждой строке, я пробую цикл с использованием библиотеки "fnmatch", и я не могу заставить его работать. На сегодняшний день лучшим подходом было:

df["microservice"]= df.description.str.contains("microservice") 

df["cloud-based architecture"] = df.description.str.contains("cloud-based architecture")

df["service oriented architecture"] = df.description.str.contains("service oriented architecture")

Однако, во-первых, мне не удалось сделать так, чтобы это повторялось по каждой строке столбца описания, поэтому мне пришлось вводить 300-кратный код для каждого слова (это не имеет смысла). Во-вторых, при этом у меня возникают проблемы с несколькими словами, такими как «R», потому что в каждом описании он находит букву R, поэтому в каждом из них он будет иметь значение true.

Ответы [ 4 ]

0 голосов
/ 27 августа 2018

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

import pandas as pd
import re

keywords = ['python', 'C++', 'admin', 'Developer']
rx = '(?i)(?P<keywords>{})'.format('|'.join(re.escape(kw) for kw in keywords))

Затем с DF образца:

df = pd.DataFrame({
    'job_description': ['C++ developer', 'traffic warden', 'Python developer', 'linux admin', 'cat herder']
})

Вы можете найти все ключевые слова для соответствующего столбца ...

matches = df['job_description'].str.extractall(rx)

Что дает:

               keyword
  match           
0 0            C++
  1      developer
2 0         Python
  1      developer
3 0          admin

Затем вы хотите получить список «чайников» и взять максимум (чтобы вы всегда получали 1, где слово было найдено), используя:

dummies = pd.get_dummies(matches).max(level=0)

Что дает:

   keyword_C++  keyword_Python  keyword_admin  keyword_developer
0            1               0              0                  1
2            0               1              0                  1
3            0               0              1                  0

Затем вы оставили присоединение к исходному DF:

result = df.join(dummies, how='left')

И результат:

    job_description  keyword_C++  keyword_Python  keyword_admin  keyword_developer
0     C++ developer          1.0             0.0            0.0                1.0
1    traffic warden          NaN             NaN            NaN                NaN
2  Python developer          0.0             1.0            0.0                1.0
3       linux admin          0.0             0.0            1.0                0.0
4        cat herder          NaN             NaN            NaN                NaN
0 голосов
/ 27 августа 2018
  • skill = "C ++" или любой другой
  • frame = экземпляр Index(['job_title', 'company', 'job_label', 'description'], dtype='object')
  • jobs = список / np.array кадров, который, вероятно, ваш ввод

Наивная реализация может выглядеть примерно так:

for skill in keywords:
    for frame in jobs: 
        if skill in frame["description"]: # or more exact matching, but this is what's in the question
            # exists

Но вам нужно больше работать над тем, какую структуру вывода вы собираетесь использовать. Просто иметь выходной массив из 300 столбцов, большинство из которых содержат False, не будет хорошим планом. Сам я никогда не работал с Panda, но если бы это были обычные массивы с пустыми ячейками (которые DataFrames у Panda находятся под капотом), я бы добавил столбец «навыки», который может перечислять их.

0 голосов
/ 27 августа 2018

Вы можете использовать .apply() примерно так (@Jacco van Dorp высказал твердое предположение о том, чтобы хранить все найденные навыки в одной колонке, что, я согласен, вероятно, является наилучшим подходом к вашей проблеме):

df = pd.DataFrame([['Engineer','Firm','AERO1','Work with python and Django'],
                    ['IT','Dell','ITD4','Work with Django and R'],
                    ['Office Assistant','Dental','OAD3','Coordinate schedules'],
                    ['QA Engineer','Factory','QA2','Work with R and python'],
                    ['Mechanic','Autobody','AERO1','Love the movie Django']],
                    columns=['job_title','company','job_label','description'])

Что дает:

          job_title   company job_label                  description
0          Engineer      Firm     AERO1  Work with python and Django
1                IT      Dell      ITD4       Work with Django and R
2  Office Assistant    Dental      OAD3         Coordinate schedules
3       QA Engineer   Factory       QA2       Work with R and python
4          Mechanic  Autobody     AERO1        Love the movie Django

Затем определите свой набор навыков и понимание списка, чтобы перейти к .apply():

skills = ['python','R','Django']

df['skills'] = df.apply(lambda x: [i for i in skills if i in x['description'].split()], axis=1)

Что приводит к этому столбцу:

             skills  
0  [python, Django]  
1       [R, Django]  
2                []  
3       [python, R]  
4          [Django] 

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

0 голосов
/ 27 августа 2018

переберите список ключевых слов и извлеките каждый столбец из описания.

for name in keywords:
    df[name] = df['description'].apply(lambda x: True if name in x else False)

EDIT

, которая не решает проблему с R. Для этого вы можете добавить пробел, чтобы убедиться, что он изолирован, поэтому код будет:

for name in keywords:
    df[name] = df['description'].apply(lambda x: True if ' '+str(name)+' ' in x else False)

Но это действительно уродливо и не оптимистично. Регулярное выражение должно сработать, но я должен оглянуться назад: нашел! [] * + [str (name)] + [.?!] лучше! (и многое другое)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...