JobShield
v2
OverviewRecommenderMechanism
GitHub

Product

  • Overview
  • Recommender
  • Mechanism
  • Wage radar

Data

  • Corpus stats
  • Occupations
  • Recommendations
  • Wage radar

Spec

  • Spec v2
  • Q&A prep
  • Plan

Build

  • Pipeline (Py)
  • Tests (145 Py)
  • App (Next.js)
JobShield AI · v2.0.0

Prototype. Skill graph built from hand-authored postings, not real Thai labour-market data. See /mechanism for what this is and isn't.

v2 · two-layer architecture

Where you can go next in the Thai labour market, and why.

A career recommender built on a PPMI skill graph and a two-layer Dijkstra + rank split. The model is on the page. The numbers you see are the same numbers the algorithm saw.

Try the recommender View source Wage radar
occupations
18
skills
46
transitions
119
sources
18
jobshield.ai / recommend
live

Starting from

Data entry · เจ้าหน้าที่บันทึกข้อมูล

15,000 THB · risk 95% · centrality 0.55

Top recommendationscore +0.395

Junior data analyst

+20,000 THB · 1 hop · 3 shared skills

Layer 1 cost

0.060

Layer 2 score

+0.395

Path

data_entry → jda

Bridges

sql, excel, english

Live wage radar

Eighteen occupations. One regression line. Red is the only color that means anything.

Each dot is a Thai occupation. The dashed line is the OLS fit of median wage on degree centrality — what the network predicts each job should pay. Dots below the line are paid less than their network position predicts.

Try the recommender Open the full radar
Wage radar
Centrality × median wage. Red = underpaid relative to the OLS model.
underpaidat or above modelOLS fit
Architecture

The path from a posting to a recommendation.

01

Skill graph

PPMI(co_occurrence)

153 postings → 46 skills → 129 edges. Edges with PMI ≤ 0 are dropped.

02

Distance

1 − clamp(direct + indirect)

Direct overlap (min) + indirect PPMI bridge (0.4 hop decay). Output ∈ [0, 1].

03

Layer 1 (Dijkstra)

α·dist_norm + γ·risk_norm

Single-source min-cost path. Non-negative weights keep the algorithm correct.

04

Layer 2 (Rank)

β·wage_norm − path_cost − γ₂·risk

Score targets by wage gain, penalised by path cost and target risk. Top N returned.

What it does

Four layers, one workflow.

The recommender is split into four explicit layers. Each one is auditable, testable, and shown in the UI so you can follow the numbers from the page back to the math.

01
Layer 0

Skill graph from real postings

PPMI co-occurrence over 153 hand-authored job postings yields 46 skills and 129 undirected transitions. Edges are dropped below zero PMI; skill distance uses direct overlap + indirect PPMI bridge.

Open
02
Layer 1 + 2

Two-layer ranking, not one

Layer 1 = Dijkstra on α·dist_norm + γ·risk_norm (non-negative, safe). Layer 2 = β·wage_norm − path_cost − γ₂·risk. Wage never appears in the path cost, so it can't telescope.

Open
03
Explainability

Skill bridges that explain

Every hop is annotated by the actual shared skills between adjacent occupations. The recommendation comes with a why, not a score.

Open
04
Layer 3

Wage radar with regression

OLS fit of median wage on degree centrality. Points below the fit line are flagged as underpaid — the only red on the page.

Open
From the spec

The math, in plain sentences.

“The naive formula α·dist − β·wage + γ·risk has two bugs. The two-layer split avoids both.”

Spec §5.1

“Edge cost is non-negative (α·dist_norm + γ·risk_norm). That's the invariant that makes Dijkstra safe.”

Spec §5.3

“PPMI = max(0, log P(a,b) / (P(a)·P(b))). Drop sub-independence pairs.”

Spec §3.2

“Wage gap = (predicted − actual) / predicted. Positive gap = underpaid signal.”

Spec §6.2