Exact hur fungerar JobAd Enrichment?

Hej! Jag skriver en akademisk artikel och det är, för vissa läsare, otillfredsställande om vi skriver att vi använder er JobAd Enrichment API och fick tillbaka en lista med nyckelord.

Kan man få lite fler detaljer gällande vilken typ av natural language processing algoritm ni använder eller dylikt?

Mvh
Simon

Hej Simon!

För att bedöma om t.ex. en kompetens är efterfrågad av arbetsgivaren eller inte i en annons, så använder vi samma strategi som denna sida går igenom: https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/
Vi har förtränat en ordvektormodell med ca 6 miljoner annonstexter med hjälp av https://radimrehurek.com/gensim/models/fasttext.html och denna modell används som ett embedding layer i en deep learning Tensorflow-modell via Keras: https://keras.io/layers/embeddings/

Exempelkod för modellens lager:

model = Sequential()
seq_length = X_train.shape[1]
model.add(Embedding(input_dim=vocab_size, output_dim=embedding_size, 
                    embeddings_initializer=Constant(embedding_matrix), input_length=seq_length, 
                    trainable=False)) 
					

Example, model for the type COMPETENCE:

Layer (type)                 Output Shape              Param #   
=================================================================
embedding_16 (Embedding)     (None, 60, 100)           2000000   
_________________________________________________________________
dense_42 (Dense)             (None, 60, 26)            2626      
_________________________________________________________________
dense_43 (Dense)             (None, 60, 3)             81        
_________________________________________________________________
flatten_16 (Flatten)         (None, 180)               0         
_________________________________________________________________
dropout_16 (Dropout)         (None, 180)               0         
_________________________________________________________________
dense_44 (Dense)             (None, 1)                 181       
=================================================================
Total params: 2,002,888
Trainable params: 2,888
Non-trainable params: 2,000,000

Då en annons ska bearbetas i JobAd Enrichments händer följande:

  1. Annonsen bryts upp i meningar
  2. En synonymordlista används för att identifiera om meningen innehåller kända termer som t.ex. kompetenser och yrkestitlar (synonymordlistan är nedladdningsbar via API:et, endpointen /synonymdictionary, se https://jobad-enrichments-api.jobtechdev.se/)
  3. Beroende på vilken typ termen som hittas i meningen har, skickas meningen in till den modell som är tränad på just den typen. Med andra ord så finns det en modell för kompetenser, en för yrkestitlar, en för förmågor och en för geografiska platser
  4. Ett decimaltal mellan 0.0 och 1.0 returneras från respektive modell. Denna siffra innebär följande per typ:
    KOMPETENS - Ju närmare 1.0, desto mer uppskattar modellen att kompetensen efterfrågas av arbetsgivaren
    YRKESTITEL - Ju närmare 1.0, desto mer uppskattar modellen att det är detta man ska jobba som, ju närmare 0.0 desto mer uppskattar modellen att det är en yrkestitel som nämns i texten, men som man inte förväntas jobba som
    FÖRMÅGA - Ju närmare 1.0, desto mer uppskattar modellen att arbetsgivaren vill att man ska ha en viss förmåga
    GEO - Ju närmare 1.0, desto mer uppskattar modellen att det är vid denna fysiska plats som ens arbetsplats ligger, där man ska arbeta

Det finns även mer information om funktionerna här:
https://github.com/Jobtechdev-content/JobAdEnrichments-content/blob/master/GettingstartedJobAdEnrichmentsSE.md

Hoppas att ovanstående var någorlunda begripligt! Hör gärna av dig om något behöver förtydligas!

vänliga hälsningar

/Mattias

Okej tack!

Jag kan ingenting om maskininlärning så det är lite svårt att förstå. Är denna beskrivning korrekt:
“The prediction model is based on a pre-trained word vector model that is then used as a word embedding layer in a deep learning Tensorflow model through Keras.”

Är det så att synonymordlistan också är tränad eller utvecklad genom någon sorts deep learning model? Och är det så att ni har en separat modell som identifierar hurivida ett ord tillhör skills, soft skills, occupation titles, geography och sedan har ni fyra modeller som används för att ge en “predicted value between 0 and 1”?

Mvh
Simon

Hej igen Simon!

Ja, jag tycker att meningen är korrekt: “The prediction model is based on a pre-trained word vector model that is then used as a word embedding layer in a deep learning Tensorflow model through Keras.”

Nej, synonymordlistan är inte tränad/utvecklad genom deep learning, men varje typ (COMPETENCE, OCCUPATION, TRAIT, GEO) har sin lista med unika ord, vilket gör att vi ser vilken typ som det identifierade ordet i texten tillhör. Identifieringen av ord i annonstexten görs med hjälp av ett pythonpaket som heter flashText, https://github.com/vi3k6i5/flashtext, vilket är snabbare jämfört med om man hade försökt identifiera orden med hjälp av regEx.
När ett ord är identifierat så vet vi vilken typ det tillhör och vilken Tensorflow-modell (COMPETENCE, OCCUPATION, TRAIT, GEO) som ska användas för prediction.

vänliga hälsningar

/Mattias

Hej Mattias,

Jag är nyfiken på hur ovanstående modell skattar relevansen för individuella kompetenser i en mening som innehåller fler kompetenser. Om vi exempelvis ger följande mening till modellen för inferens:

“Vi eftersöker utvecklare med goda kunskaper i C++ men som också är bekant med C#.”

Returneras ett decimaltal (\in [0, 1]) som representerar efterfrågan för samtliga kompetenser i hela meningen, men hur genererar men sedan individuella skattningar för kompetenserna “C++” och “C#”? Är sista lagret i modellen ovan mer komplicerat (multi-label eller motsvarande)?

Vänligen,
pon.

Hej Pon!

Jag var nog lite otydlig tidigare i mitt svar, det returneras ett decimaltal mellan 0.0-1.0 för varje känd term, inte för hela meningen. För ditt exempel “Vi eftersöker utvecklare med goda kunskaper i C++ men som också är bekant med C#.” så returneras ett decimaltal för C++ och ett för C#, enligt:

[
  {
    "doc_id": "None",
    "doc_headline": "",
    "enriched_candidates": {
      "occupations": [
        {
          "concept_label": "Systemutvecklare",
          "term": "utvecklare",
          "prediction": 0.791085809
        }
      ],
      "competencies": [
        {
          "concept_label": "C++",
          "term": "c++",
          "prediction": 0.842457026
        },
        {
          "concept_label": "C#",
          "term": "c#",
          "prediction": 0.775170743
        }
      ],
      "traits": [],
      "geos": []
    }
  }
]

Modellen består enbart av de lager som du kan se ovan, vid texten “Exempelkod för modellens lager”.

När en mening ska bedömas av modellen, exempelvis din exempelmening, så preparerar vi meningen så att den innehåller samtliga ord förutom just det ord som vi vill bedöma.
I fallet med “C++” så skickar vi alltså in följande till modellen:
“Vi eftersöker utvecklare med goda kunskaper i men som också är bekant med C#.”
…och för kompetensen “C#” skickar vi in dessa termer till modellen:
“Vi eftersöker utvecklare med goda kunskaper i C++ men som också är bekant med .”
Modellerna är tränade på denna typ av meningar där ett av orden i meningen är utblankad, det vill säga det ord som vi vill bedöma. Detta gör att man kan stoppa in vilket ord som helst istället för “C++” eller “C#” eftersom modellerna är tränade på kontexten, exklusive det specifika ord som man vill bedöma.

vänliga hälsningar

/Mattias

1 gillning

Tack för förklaringen Mattias! Det var precis den informationen jag var ute efter :slight_smile:.

Tack själv Pon! Kul att du har nytta av infon! :+1: