Datengesteuerte, KI-gestützte Jobsuche
Verwendung von GPT-3 und anderen Modellen zur Verarbeitung natürlicher Sprache und Techniken zur Informationsextraktion, um Kandidaten bei ihrer Jobsuche zu unterstützen.
Einführung
Die Jobsuche kann eine entmutigende Aufgabe sein, da mehrere Faktoren nur zu Unsicherheit führen: begrenzte Angebote, harter Wettbewerb, knappe Informationen und fast kein Feedback/Bestärkeung.
Algorithmen helfen Personalvermittlern dabei, Bewerbungen zu klassifizieren, und interoperable Systeme ermöglichen es ihnen, potenzielle Kandidaten ganz einfach auf mehrere Plattformen zu verteilen und zu erreichen. Kandidaten hingegen stehen nicht viele Tools zur Verfügung: Normalerweise finden Menschen eine Stellenausschreibung, die sie interessiert, entweder direkt auf der Karriere-Website des Unternehmens oder über den Empfehlungsalgorithmus sozialer Netzwerke wie LinkedIn, aber a Eine systematische Möglichkeit, Informationen zu sammeln, zu analysieren und zu verfolgen, ist für sie nicht leicht zugänglich.
Aus diesem Grund habe ich beschlossen, einige Anstrengungen in den Aufbau eines Systems zu stecken, um Informationen aus Stellenausschreibungen in einer einzigen Datenbank zu sammeln: Unternehmen, Berufsbezeichnungen, Stellenbeschreibungen, Mindestanforderungen, Gehälter, Zusatzleistungen, Standorte usw.
Ich möchte auch den gesamten Prozess verfolgen und ihn als Trichter mit den Schritten Entdeckung, Bewerbung, Erstgespräch, Interviewschleife, Entscheidung, Angebot, Annahme visualisieren. Aber das wird in einem zweiten Teil dieser Serie kommen.
In diesem Beitrag wird der schrittweise Prozess der Erfassung und Verarbeitung der Informationen, deren Analyse und der Nachverfolgung der Anträge beschrieben. Beginnen wir mit Datenquellen.
Datenquellen
Normalerweise konnte ich auf LinkedIn interessante Stellenausschreibungen finden, aber LinkedIn verfügt nicht über eine API, mit der man Stellenempfehlungen programmgesteuert durchsuchen kann. Deshalb habe ich beschlossen, die Links zu den Stellenausschreibungen einfach in einem Google-Dokument zu sammeln Ich kann auch mit anderen Leuten teilen, die nach ähnlichen Möglichkeiten suchen.
Natürlich kann ich einen ausgefeilteren Crawler für die Jobsuche im offenen Web erstellen, aber das wäre für meine unmittelbaren Zwecke vielleicht etwas übertrieben, aber vielleicht werde ich mich in Zukunft damit befassen.
Um also eine Liste der Jobs zu erhalten, an denen wir interessiert sind, müssen wir ein Google-Dokument analysieren, alle Links finden, ihnen einen Besuch abstatten, ihren HTML-Code analysieren und die wertvollen Informationen in einer Datenbank sammeln.
Schritt 0: Umgebungsvariablen und Projekteinrichtung
Da wir viele verschiedene Dienste nutzen werden, ist es sinnvoll, eine separate Datei mit unseren Umgebungsvariablen zu erstellen, um vertrauliche Informationen (z. B. API-Schlüssel) einzufügen.
from dotenv import load_dotenv
from pathlib import Path # Python 3.6+ only
env_path = Path('.') / '.jobhunter.env'
load_dotenv(dotenv_path=env_path)
OPENAI_API_KEY="<YOUR API KEY>"
SCOPES = ['https://www.googleapis.com/auth/documents.readonly']
LIST_ID = '<YOUR GOOGLE DOC ID WITH LINKS>'
import pandas as pd
import selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from IPython import display
from base64 import b64decode
from trafilatura import extract
from lxml import html
import os.path
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
Tipp: Sie können den Parsing-Teil von Google Docs überspringen und einfach eine Liste mit allen URLs erstellen, die Sie crawlen möchten.
Um auf ein Google-Dokument zugreifen zu können, das Sie besitzen, müssen Sie lediglich ein Google-Entwicklerkonto erstellen, ein Projekt erstellen, die Google Docs-API aktivieren, die OAuth-Anmeldeinformationen für Ihre Desktop-Anwendung abrufen und sich mit Ihrem Google-Konto authentifizieren, wodurch ein OAuth erstellt wird Token, mit dem Sie Anfragen stellen. Ich gehe davon aus, dass Sie das Token bereits in einer Datei token.json gespeichert haben.
creds = None
if os.path.exists(“token.json”):
creds = Credentials.from_authorized_user_file(“token.json”, SCOPES)
else:
# do the OAuth dance
try:
service = build(‘docs’, ‘v1’, credentials=creds)
document = service.documents().get(documentId=LIST_ID).execute()
except HttpError as err:
print(err)
con = [d.get(‘paragraph’) for d in document.get(‘body’).get(‘content’) if d.get(‘paragraph’) is not None]
links = [c[‘elements’][0][‘textRun’][‘textStyle’][‘link’][‘url’] for c in con if len(c[‘elements’]) > 0 and ‘textRun’ in c[‘elements’][0] and ‘link’ in c[‘elements’][0][‘textRun’][‘textStyle’]]
links = [
'https://boards.redhouse.io/socialmediaco/jobs/4794726',
'https://www.bigtech.com/listing/291a',
'https://www.othertech.com/jobs/awesome-job-30129a',
]
Das hört sich einfach an, aber wenn Sie versuchen, einen gängigen http-Client wie urllib.request zu verwenden, werden Sie sehr bald auf Hindernisse stoßen, da einige Websites ihren Inhalt über einen XMLHttpRequest laden, anstatt ihn direkt in den HTML-Code einzufügen. Möglicherweise sind sie auch auf JavaScript oder Cookies angewiesen, deren Handhabung mühsam sein kann.
Lösung: Führen Sie einen echten Webbrowser in Python aus. Dies ist dank einer großartigen Software möglich, die normalerweise verwendet wird, um automatisierte Unit-Tests auf Websites durchzuführen, als ob ein echter Benutzer dort surfen und mit ihr interagieren würde: Selenium . Befolgen Sie einfach die Anweisungen, installieren Sie Selenium und einen Webtreiber für Firefox, Chrome, Safari oder Edge und schon kann es losgehen.
Ich wollte zum Debuggen einen Screenshot machen. Dies hat sich bereits als nützlich erwiesen, als die Uhr des Computers, den ich verwende, am 15. Februar hängen blieb, was auf einigen Websites einen Fehler auslöste.
Ich gehe davon aus, dass Sie Selenium und einen Webtreiber installiert haben, damit Sie diesen Code ausführen können:
screenshots = []
sources = []
titles = []
options = Options()
options.add_argument(“ — headless=new”)
driver = webdriver.Chrome(“/usr/bin/chromedriver”, options=options)
driver.maximize_window()
for link in links:
driver.get(link)
titles.append(driver.title)
screenshots.append(b64decode(driver.get_screenshot_as_base64()))
sources.append(driver.page_source)
driver.quit()
Rohdaten verarbeiten
Schritt 3: Extrahieren Sie den relevanten Text aus verrauschtem HTML
An diesem Punkt haben wir Roh-HTML von einer Vielzahl von Websites, von denen jede eine einzigartige Herausforderung darstellt, da jede Website ihre eigene Struktur hat, was es schwierig macht, einen Parser zu erstellen, der für alle funktioniert, es sei denn, wir beginnen, uns mit Tools zur Korpusverarbeitung zu befassen kann uns dabei helfen, den relevanten Text jeder Website zu extrahieren, was wiederum die Verwendung von Modellen zur Verarbeitung natürlicher Sprache ermöglicht. Geben Sie Trafilatura ein .
„Trafilatura ist ein Python-Paket und ein Befehlszeilentool , das zum Sammeln von Text im Web entwickelt wurde. Es umfasst Erkennungs-, Extraktions- und Textverarbeitungskomponenten. Seine Hauptanwendungen sind Web-Crawling, Downloads, Scraping und das Extrahieren von Haupttexten, Metadaten und Kommentaren. Ziel ist es, handlich und modular zu bleiben : Es ist keine Datenbank erforderlich, die Ausgabe kann in verschiedene gängige Formate konvertiert werden.“
from trafilatura import extract
texts = [extract(s) for s in sources]
So einen Text schreiben:
AIML - Sr Data Science Manager, AIML Data
Santa Clara Valley (Cupertino), California, United States
Machine Learning and AI
Do you get excited by driving product impact via measurement and evaluation, for products and services used by hundreds of millions of people globally? The vision for the AIML Data organization is to improve products by using data as the voice of our customers. You will lead and continue to grow a team of data scientists specializing in experimentation. The team will be responsible for evaluating the impact of products or components, scaling statistical algorithms, metrics development, experimentation and opportunity analysis.
Key Qualifications
- A passion for and track record in data analysis, A/B testing, and shaping data culture.
- 5+ years in a managerial role, recruiting top talent, growing, and scaling analytics organizations.
- Ability to manage complex relationships across multiple functions and establish strong partnerships.
- Outstanding communication and presentation skills, written and verbal, to all levels of an organization.
- Technical expertise: experience in AB testing, statistical algorithms and developing analytic recommendations.
- Technical rigor - ability to work with engineering teams and develop sustainable solutions for rigorous analytics.
- Experience working with systems and products that are powered by machine-learned models and an understanding of natural language or speech-enabled products.
- Strong analytical product intuition - able to use data impact-fully in guiding development of products and user experiences.
Description
The Siri Assistant Analytics team is looking for an experienced and highly motivated data scientist lead! You will partner across engineering groups building Siri Assistant and the AIML products to develop and evangelize AB testing to measure, understand, and improve our products and features. You have a background that fuses data science, engineering, and product thinking. You have experience directing a team that loves to dive into data and experimentation to improve products. In this role, you will - Lead the AIML experiment science and methods team. - Work with platform teams to scale AB testing processes, practices and technical solutions across Apple product teams. - Drive high-impact exploratory analyses and investigations to enrich our understanding of how people interact our products. - Establish team capabilities through hiring, training, tools, and process. - Partner with product and engineering teams working to understand the user’s voice, and to communicate effectively on product impact, innovation, improvement, and growth.
Wir haben einen langen Weg zurückgelegt und jetzt die relevanten Inhalte aus einer Reihe (und sehr unterschiedlicher) Websites extrahiert. Unser Ziel ist es jedoch, wichtige Informationen aus jeder Stellenausschreibung zu extrahieren und sie in einer zentralen Datenbank zu speichern.
Um dies zu erreichen, müssen wir jeden Textabschnitt „verstehen“ und ihn mit denselben „Fragen“ „befragen“, damit wir strukturierte Antworten erhalten, die es uns ermöglichen, einen Datensatz zu erstellen.
Zu unseren traditionelleren Optionen gehören unter anderem Topic Modeling (LDA) und Named Entity Recognition (NER), aber sie liegen im Bereich der Informationsextraktion von NLP und diese Aufgabe könnte für sie tatsächlich ein größerer Fisch sein. Geben Sie GPT-3 und sein text-davinci-003-Modell ein.
Bei Anwendungen, die ein umfassendes Verständnis des Inhalts erfordern, wie z. B. die Zusammenfassung für eine bestimmte Zielgruppe und die Erstellung kreativer Inhalte, liefert Davinci die besten Ergebnisse. Diese erweiterten Fähigkeiten erfordern mehr Rechenressourcen, sodass Davinci mehr pro API-Aufruf kostet und nicht so schnell ist wie die anderen Modelle.
Ein weiterer Bereich, in dem Davinci glänzt, ist das Verständnis der Absicht von Texten. Davinci ist ziemlich gut darin, viele Arten von Logikproblemen zu lösen und die Motive von Charakteren zu erklären. Davinci war in der Lage, einige der anspruchsvollsten KI-Probleme im Zusammenhang mit Ursache und Wirkung zu lösen.
Gut in: Komplexe Absicht, Ursache und Wirkung, Zusammenfassung für das Publikum
Wir möchten, dass Davinci eine Reihe von Fragen zu jeder Stellenausschreibung beantwortet und die Antwort strukturiert ausgibt, damit wir sie später analysieren können.
Eine Aufforderung, dies zu erreichen, sieht folgendermaßen aus:
prompt = f'''
Extract the important entities in the text below answering the following questions:
- What is the company?
- Which industry is this company in?
- What is this company dedicated to?
- What is the job title?
- When was this job posted? output a date
- What is the seniority level?
- Which team is this job in?
- What are the main responsabilities? desired format csv
- What are the mininum requirements? desired format: csv
- What is the technical expertise required? desired format: csv
- What is the mininum education level?
- How many years of experience are required?
- What is the offered salary range? ouput a number
- Where is this job located? output city, state, country
- Provide a one line summary of this job description
Text: """
{title}
{t}
"""
'''
Jetzt müssen wir nur noch die API von OpenAI abfragen und die Antworten speichern.
responses = []
for t,title in zip(texts, titles):
response = openai.Completion.create(
model="text-davinci-003",
prompt=prompt,
temperature=0,
max_tokens=700,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
if 'choices' in response:
responses.append(response['choices'][0]['text'])
Company: Apple
Industry: Machine Learning and AI
Dedicated to: Improving products by using data as the voice of customers
Job Title: Sr Data Science Manager, AIML Data
Date Posted: N/A
Seniority Level: Senior
Team: AIML Data
Responsabilities: Driving product impact via measurement and evaluation, evaluating the impact of products or components, scaling statistical algorithms, metrics development, experimentation and opportunity analysis
Minimum Requirements: A passion for and track record in data analysis, A/B testing, and shaping data culture, 5+ years in a managerial role, recruiting top talent, growing, and scaling analytics organizations, ability to manage complex relationships across multiple functions and establish strong partnerships, outstanding communication and presentation skills, written and verbal, to all levels of an organization, technical expertise: experience in AB testing, statistical algorithms and developing analytic recommendations, technical rigor - ability to work with engineering teams and develop sustainable solutions for rigorous analytics, experience working with systems and products that are powered by machine-learned models and an understanding of natural language or speech-enabled products, strong analytical product intuition - able to use data impact-fully in guiding development of products and user experiences
Minimum Education Level: N/A
Years of Experience: 5+
Salary Range: N/A
Location: Santa Clara Valley (Cupertino), California, United States
Summary: Lead and continue to grow a team of data scientists specializing in experimentation to improve products by using data as the voice of customers.
df = pd.DataFrame.from_records([{x[0]:" ".join(x[1:]).strip() for x in [l.split(":") for l in r.strip().splitlines()]} for r in responses])
print(df.columns)
#outputs:
['Company', 'Industry', 'Dedicated to', 'Job Title', 'Date Posted',
'Seniority Level', 'Team', 'Responsabilities', 'Minimum Requirements',
'Technical Expertise', 'Minimum Education Level', 'Years of Experience',
'Salary Range', 'Location', 'Summary', 'No job details found.',
'Posted Date', 'Responsibilities', 'Dedication', 'Post Date',
'Technical Expertise Required', 'Years of Experience Required']
df[['Company', 'Job Title', 'Summary', 'Salary Range']]
Fazit und nächste Schritte
Um unseren Prozess zusammenzufassen, haben wir eine Liste mit Links in einem Google-Dokument abgerufen, sie aufgerufen, den Roh-HTML-Code gespeichert und mit Selenium einen Screenshot gemacht, mit Trafilatura relevanten Text aus dem Roh-HTML-Code extrahiert, den Text „verstanden“ und strukturierte Antworten erhalten Wir haben GPT-3 verwendet und verwendet, das wir dann in einen Pandas-DataFrame eingefügt haben.
Nachdem wir nun über unseren DataFrame verfügen, besteht der unmittelbare nächste Schritt darin, einige Felder wie Verantwortlichkeiten, Mindestanforderungen und technisches Fachwissen weiter zu verarbeiten, um eine Liste von Konzepten für alle Stellenausschreibungen zu erstellen, die zukünftige Empfehlungen und eine bessere Ausrichtung ermöglichen könnten.
Ich möchte auch ein kleines Tracking-System aufbauen, um Statistiken über Bewerbungen zu sammeln. Ich stelle mir etwa Folgendes vor:
Außerdem wird dieser Prozess nur lokal implementiert und ist etwas langsam (die Bearbeitung von 15 Stellenausschreibungen dauert etwa 3 Minuten). Prozesse wie dieser sind gute Beispiele dafür, wie Suchmaschinen oder spezialisierte Dienste (z. B. eine Job Hunter-App) neue KI- und ML-Modelle nutzen können, um ihre Pipelines zu optimieren, und sind natürlich perfekte Kandidaten für Parallelisierung usw. Dies könnte der Fall sein Thema eines dritten Kapitels dieser Serie.
Über mich
Mein Name ist Paola Villarreal und ich beschäftige mich seit 1999 mit Softwareentwicklung und Datenwissenschaft für Regierungen, gemeinnützige Organisationen und Technologieunternehmen. Ich komme ursprünglich aus Mexiko-Stadt, lebe aber derzeit in Los Angeles, wo ich als Senior Manager für Datenwissenschaft tätig bin eines der größten Social-Media-Unternehmen in den USA
Möchten Sie mehr über meine Arbeit erfahren?
Sehen Sie sich diesen von der Ford Foundation produzierten Dokumentarfilm an, in dem erklärt wird, wie ich der ACLU von MA mithilfe von SQL geholfen habe, die größte Massenentlassung von Verurteilungen in der Geschichte des Justizsystems zu erreichen
Sehen Sie sich auch diese Konferenz an, die ich an der Harvard Law School gehalten habe (als Teil des Berkman Klein Center for Internet and Society).
Vergessen Sie nicht, mir auf LinkedIn oder Twitter zu folgen . Ich bin übrigens offen für Arbeit.

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































