Zephyrnet-logo

Een kenniskaart maken voor het zoeken naar werk met BERT

Datum:

Een kenniskaart maken voor het zoeken naar werk met BERT

Een handleiding voor het maken van kennisgrafieken met behulp van NER en Relatie-extractie.


By Walid Amamo, oprichter van UBIAI

Inleiding:

 
Hoewel het NLP-veld de afgelopen twee jaar exponentieel is gegroeid - dankzij de ontwikkeling van op overdracht gebaseerde modellen - zijn hun toepassingen beperkt in het bereik van het zoeken naar werk. LinkedIn, het toonaangevende bedrijf in het zoeken naar werk en werving, is een goed voorbeeld. Hoewel ik een PhD in Material Science en een Master in Physics heb, ontvang ik baanaanbevelingen zoals Technical Program Manager bij MongoDB en een Go Developer-positie bij Toptal, beide webontwikkelingsbedrijven die niet relevant zijn voor mijn achtergrond. Dit gevoel van irrelevantie wordt door veel gebruikers gedeeld en is een grote frustratie.


Aanbevelingen voor vacatures op LinkedIn
Aanbevelingen voor vacatures op LinkedIn

 

Werkzoekenden moeten toegang hebben tot de beste tools om hen te helpen de perfecte match voor hun profiel te vinden zonder tijd te verspillen aan irrelevante aanbevelingen en handmatig zoeken...

Over het algemeen zijn traditionele systemen voor baanaanbevelingen echter gebaseerd op eenvoudige trefwoorden en/of semantische overeenkomsten die meestal niet goed geschikt zijn om goede baanaanbevelingen te geven, omdat ze geen rekening houden met de onderlinge verbanden tussen entiteiten. Bovendien is het met de opkomst van Applicant Tracking Systems (ATS) van het grootste belang om relevante vaardigheden op uw cv te vermelden en te ontdekken welke branchevaardigheden relevanter worden. Ik heb bijvoorbeeld misschien uitgebreide vaardigheden in het programmeren van Python, maar de functiebeschrijving van interesse vereist kennis in het Django-framework, dat in wezen is gebaseerd op Python; een eenvoudige zoekopdracht op trefwoord zal die verbinding missen.

In deze zelfstudie bouwen we een taakaanbeveling en een script voor het ontdekken van vaardigheden dat ongestructureerde tekst als invoer gebruikt en vervolgens taakaanbevelingen en vaardigheidssuggesties uitvoert op basis van entiteiten zoals vaardigheden, jarenlange ervaring, diploma en major. Voortbouwen op mijn vorige artikel, zullen we entiteiten en relaties extraheren uit functiebeschrijvingen met behulp van het BERT-model en zullen we proberen een kennisgrafiek te bouwen op basis van vaardigheden en jarenlange ervaring.


Taakanalyse pijplijn
Taakanalyse pijplijn

 

Om het NER- en relatie-extractiemodel te trainen, hebben we gegevensannotatie uitgevoerd met behulp van de UBIAI-tool en modeltraining op google colab zoals beschreven in mijn vorige artikel.

Data-extractie:

 
Voor deze zelfstudie heb ik functiebeschrijvingen verzameld met betrekking tot software-engineering, hardware-engineering en onderzoek van 5 grote bedrijven: Facebook, Google, Microsoft, IBM en Intel. De gegevens zijn opgeslagen in een csv-bestand.

Om de entiteiten en relaties uit de functiebeschrijvingen te extraheren, heb ik een Named Entity Recognition (NER) en Relation-extractiepijplijn gemaakt met behulp van eerder getrainde transformatormodellen (voor meer informatie, bekijk mijn vorige artikel). We zullen de geëxtraheerde entiteiten opslaan in een JSON-bestand voor verdere analyse met behulp van de onderstaande code.

def analyze(text): experience_year=[] experience_skills=[] diploma=[] diploma_major=[] for doc in nlp.pipe(text, disable=["tagger"]): skills = [e.text for e in doc.ents if e.label_ == 'SKILLS'] for name, proc in nlp2.pipeline: doc = proc(doc) for value, rel_dict in doc._.rel.items(): for e in doc.ents: for b in doc.ents: if e.start == value[0] and b.start == value[1]: if rel_dict['EXPERIENCE_IN'] >= 0.9: experience_skills.append(b.text) experience_year.append(e.text) if rel_dict['DEGREE_IN'] >= 0.9: diploma_major.append(b.text) diploma.append(e.text) return skills, experience_skills, experience_year, diploma, diploma_majordef analyze_jobs(item): with open('./path_to_job_descriptions', 'w', encoding='utf-8') as file: file.write('[') for i,row in enumerate(item['Description']): try: skill, experience_skills, experience_year, diploma, diploma_major=analyze([row]) data=json.dumps({'Job ID':item['JOBID'[i],'Title':item['Title'[i],'Location':item['Location'][i],'Link':item['Link'][i],'Category':item['Category'[i],'document':row, 'skills':skill, 'experience skills':experience_skills, 'experience years': experience_year, 'diploma':diploma, 'diploma_major':diploma_major}, ensure_ascii=False) file.write(data) file.write(',') except: continue file.write(']')analyze_jobs(path)


Gegevensverkenning:

 
Nadat we de entiteiten uit de functiebeschrijvingen hebben geëxtraheerd, kunnen we nu beginnen met het verkennen van de gegevens. Ten eerste ben ik geïnteresseerd in de verdeling van het vereiste diploma over meerdere velden. In de boxplot hieronder vallen ons weinig op: de meest gezochte graad op het gebied van software engineering is een bachelor, gevolgd door een master en een doctoraat. Voor het onderzoeksveld daarentegen zijn PhD's en Masters meer in trek dan we zouden verwachten. Voor hardware-engineering is de verdeling homogener. Dit lijkt misschien heel intuïtief, maar het is opmerkelijk dat we deze gestructureerde gegevens automatisch uit puur ongestructureerde tekst hebben gehaald met slechts een paar regels code!


Diplomadistributie over meerdere velden
Diplomadistributie over meerdere velden

 

Ik ben geïnteresseerd om te weten welk bedrijf op zoek is naar PhD's in natuurkunde en materiaalwetenschappen, aangezien mijn achtergrond in deze twee majors ligt. We zien dat Google en Intel koploper zijn in de zoektocht naar dit soort promovendi. Facebook zoekt meer PhD's in informatica en elektrotechniek. Merk op dat vanwege de kleine steekproefomvang van deze dataset, deze verdeling mogelijk niet representatief is voor de echte verdeling. Grotere steekproefomvang zal zeker tot betere resultaten leiden, maar dat valt buiten het bestek van deze zelfstudie.


Diploma grote distributie
Diploma grote distributie

 

Aangezien dit een tutorial over NLP is, laten we eens kijken welke diploma's en majors vereist zijn wanneer "NLP" of "natuurlijke taalverwerking" wordt genoemd:

#Diploma
('Master', 54), ('PHD', 49),('Bachelor', 19)#Diploma major:
('Computer Science', 36),('engineering', 12), ('Machine Learning', 9),('Statistics', 8),('AI', 6)


Bedrijven die NLP noemen, zoeken kandidaten met een Master of PhD in computerwetenschappen, techniek, machine learning of statistiek. Aan de andere kant is er minder vraag naar een bachelor.

Kennis Grafiek

 
Met de vaardigheden en jarenlange ervaring die zijn geëxtraheerd, kunnen we nu een kennisgrafiek bouwen waarin de bronknooppunten functiebeschrijvings-ID's zijn, doelknooppunten de vaardigheden en de kracht van de verbinding het jaar ervaring is. We gebruiken de python-bibliotheek pyvis en networkx om onze grafiek te bouwen; we koppelen functiebeschrijvingen aan hun geëxtraheerde vaardigheden met behulp van de jarenlange ervaring als gewichten.

job_net = Network(height='1000px', width='100%', bgcolor='#222222', font_color='white') job_net.barnes_hut()
sources = data_graph['Job ID']
targets = data_graph['skills']
values=data_graph['years skills']
sources_resume = data_graph_resume['document']
targets_resume = data_graph_resume['skills'] edge_data = zip(sources, targets, values )
resume_edge=zip(sources_resume, targets_resume)
for j,e in enumerate(edge_data): src = e[0] dst = e[1] w = e[2] job_net.add_node(src, src, color='#dd4b39', title=src) job_net.add_node(dst, dst, title=dst) if str(w).isdigit(): if w is None: job_net.add_edge(src, dst, value=w, color='#00ff1e', label=w) if 1<w<=5: job_net.add_edge(src, dst, value=w, color='#FFFF00', label=w) if w>5: job_net.add_edge(src, dst, value=w, color='#dd4b39', label=w) else: job_net.add_edge(src, dst, value=0.1, dashes=True)for j,e in enumerate(resume_edge): src = 'resume' dst = e[1] job_net.add_node(src, src, color='#dd4b39', title=src) job_net.add_node(dst, dst, title=dst) job_net.add_edge(src, dst, color='#00ff1e')neighbor_map = job_net.get_adj_list()for node in job_net.nodes: node['title'] += ' Neighbors:<br>' + '<br>'.join(neighbor_map[node['id']]) node['value'] = len(neighbor_map[node['id']])# add neighbor data to node hover data
job_net.show_buttons(filter_=['physics'])
job_net.show('job_knolwedge_graph.html')


Laten we onze kennisgrafiek visualiseren! Voor de duidelijkheid heb ik in de kennisgrafiek slechts enkele vacatures weergegeven. Voor deze test gebruik ik een voorbeeld-cv op het gebied van machine learning.

De rode knooppunten zijn de bronnen die functiebeschrijvingen of een cv kunnen zijn. De blauwe knooppunten zijn de vaardigheden. De kleur en het label van de aansluiting vertegenwoordigen de vereiste jaren ervaring (geel = 1-5 jaar; rood = > 5 jaar; streepjes = geen ervaring). In het onderstaande voorbeeld koppelt Python het cv aan 4 banen, die allemaal 2 jaar ervaring vereisen. Voor de machine learning-verbinding is geen ervaring vereist. We kunnen nu beginnen met het verzamelen van waardevolle inzichten uit onze ongestructureerde teksten!


Kennis grafiek
Kennis grafiek

 

Laten we eens kijken welke banen de hoogste connecties hebben met het cv:

# JOB ID #Connections
GO4919194241794048 7
GO5957370192396288 7
GO5859529717907456 7
GO5266284713148416 7
FB189313482022978 7
FB386661248778231 7


Laten we nu eens kijken naar het kennisgrafieknetwerk dat enkele van de hoogste overeenkomsten bevat:


Kennisgrafiek van de hoogste baanovereenkomsten
Kennisgrafiek van de hoogste baanovereenkomsten

 

Let op het belang van co-referentieresolutie in dit geval (wat niet is gedaan in deze zelfstudie). De vaardigheden machine learning, machine learning-modellen en machine learning werden geteld als verschillende vaardigheden, maar het is duidelijk dezelfde vaardigheid en moeten als één worden geteld. Dit kan ons matching-algoritme onnauwkeurig maken en benadrukt het belang van co-referentieresolutie bij het uitvoeren van NER-extractie.

Dat gezegd hebbende, kunnen we met de kennisgrafiek direct zien dat zowel GO5957370192396288 als GO5859529717907456 een goede match zijn, omdat ze geen uitgebreide ervaring vereisen, terwijl FB189313482022978 2-4 jaar ervaring in verschillende vaardigheden vereist. En voila!

Vaardigheden vergroten

 
Nu we de verbanden tussen het cv en de functiebeschrijvingen hebben geïdentificeerd, is het doel om relevante vaardigheden te ontdekken die misschien niet in het cv staan, maar die belangrijk zijn voor het vakgebied dat we analyseren. Voor dit doel filteren we de functiebeschrijvingen op vakgebied, namelijk software-engineering, hardware-engineering en onderzoek. Vervolgens doorzoeken we alle aangrenzende banen die zijn gekoppeld om vaardigheden te hervatten en extraheren we voor elke gevonden baan de bijbehorende vaardigheden. Voor een duidelijke visuele weergave heb ik de woordfrequentie uitgezet als een woordwolk. Laten we eens kijken naar het gebied van software-engineering:


Woordwolk van vaardigheden in software-engineering
Woordwolk van vaardigheden in software-engineering

 

Merk op dat Spark, SOLR en PLSQL vaak worden genoemd in banen die verband houden met het cv en mogelijk belangrijk zijn voor het veld.

Aan de andere kant, voor hardware-engineering:


Woordwolk van vaardigheden in hardware-engineering
Woordwolk van vaardigheden in hardware-engineering

 

Ontwerp, RF en RFIC zijn hier duidelijke behoeften.

En voor het onderzoeksveld:


Woordwolk van vaardigheden in onderzoek
Woordwolk van vaardigheden in onderzoek

 

Populaire vaardigheden zijn onder meer machine learning, signaalverwerking, tensorflow, PyTorch, modelanalyse, enz ...

Met slechts enkele regels code hebben we ongestructureerde data omgezet in gestructureerde informatie en waardevolle inzichten verkregen!

Conclusie:

 
Met de recente doorbraken op het gebied van NLP - of het nu gaat om entiteitherkenning, relatieclassificatie, vraagbeantwoording of tekstclassificatie - wordt het een noodzaak voor bedrijven om NLP in hun bedrijf toe te passen om concurrerend te blijven.

In deze zelfstudie hebben we een app voor taakaanbeveling en het ontdekken van vaardigheden gebouwd met behulp van NER en het relatie-extractiemodel (met behulp van BERT-transformator). Dit hebben we bereikt door een kennisgrafiek te bouwen die banen en vaardigheden aan elkaar koppelt.

Kennisgrafieken in combinatie met NLP bieden een krachtig hulpmiddel voor datamining en ontdekking. Aarzel niet om uw use-case te delen om aan te tonen hoe NLP op verschillende gebieden kan worden toegepast. Als u vragen heeft of aangepaste modellen wilt maken voor uw specifieke geval, laat dan hieronder een opmerking achter of stuur ons een e-mail op admin@ubiai.tools.

 
Bio: Walid Amamo is de oprichter van UBIAI, een annotatietool voor NLP-toepassingen, en is gepromoveerd in natuurkunde.

ORIGINELE. Met toestemming opnieuw gepost.

Zie ook:

Coinsmart. Beste Bitcoin-beurs in Europa
Bron: https://www.kdnuggets.com/2021/06/knowledge-graph-job-search-bert.html

spot_img

Laatste intelligentie

spot_img