Jev Gallery

JEV GUIDE

Jev + Python record linkage: entity matching with jlink

Different names can describe one entity, but similar names can also describe different entities. jlink makes the definition of a match explicit and asks Jev about candidate pairs. This guide separates retrieval, judgment and final link selection.

Define identity before choosing a matcher

Should a subsidiary count as its parent? Should two editions of a product be merged? These are dataset decisions. Use deterministic joins for reliable identifiers and normalized exact matches; reserve model judgment for meaningful ambiguity.

This is record linkage, not SQL generation or discovery of current ownership facts. A model reading names alone cannot verify a present-day corporate relationship.

Four stages, four different responsibilities

Local blocking proposes pairs. Jev evaluates selected fields against the match definition. Code then applies thresholds, margins and relationship constraints such as one-to-one or many-to-many. Audit the resulting links.

The reviewed implementation accepts some normalized exact matches without a model call. A true pair missing from the candidate set cannot be recovered by the downstream judge.

Source: jlink — judge.py ↗

Specify a small matching problem

These are synthetic editorial fixtures, not model outputs. Suppose subsidiaries must remain separate but a legal-form change alone should not create a new entity. Write that policy before inspecting results.

Specify a small matching problem
Record A / record BHuman expectationRequired evidence
Northstar Labs Inc. / NORTHSTAR LABS, INCLikely identicalTry normalization first
Northstar Labs / Northstar Labs Europe subsidiarySeparate under this policyEntity boundary
Northstar Labs Inc. / Northstar Labs LLCCheck whether only legal form changedNames may be insufficient
Northstar Labs / NSLNeeds reviewAbbreviation candidates and extra fields
Northstar Labs / Northstar LogisticsDo not merge on a shared wordSimilar-name negative

What should a Python workflow retain?

Estimate the local candidate set before choosing exportable fields and a call budget. Reapplying acceptance rules to saved scores differs from changing the semantic definition and judging again.

  • Keep stable IDs and the original-to-cleaned field mapping.
  • Record blocking settings, the identity definition, the actual model and each result’s origin.
  • Distinguish exact, model-judged, failed and unjudged pairs; a missing score is not a negative judgment.
  • Retain scores and settings. Reuse compatible scores for threshold changes, and revisit cache validity when inputs or definitions change.

Source: jlink — linker.py ↗

Measure candidate recall as well as link quality

Auditing only pairs that reached the model misses blocking failures. Start with a small set of manually verified links and check whether each appeared among the candidates. Then examine false links and missed links across score bands.

Compare thresholds using false merges, missed matches and review workload. Inspect competing candidates with close scores: the highest score need not identify the correct one-to-one assignment. Check calibration on the actual dataset rather than treating each value as a validated probability of correctness.

Common questions

Is it fully offline? Blocking and some exact matching are local. Real Jev judgments send the fields selected by on to an external service; verify that these fields can be processed there.

Do threshold changes need more inference? Filtering compatible saved scores usually does not. Changing records, entity definitions or models calls for a new evaluation.

Author benchmark speed, cost and F1 are not independent results from this site. We reviewed the implementation and did not run the model or benchmark datasets.

Source: jlink — README.md ↗

Explore these projects next

Continue reading