One command
- converts
model.json(a Splink settings dict / saved model) to a GoldenMatch config; - prints a coverage scorecard;
- verifies the conversion reproduces Splink’s clustering on a sample (when
splinkis installed) and prints the pairwise agreement; - runs the dedupe on
data.csvand writes the canonical (golden) records.
--config-out config.yaml also writes the converted config; --no-verify skips the Splink check; --verify-sample N sets the verification sample size; --strict fails on any lossy mapping.
Or one line of Python
from_splink accepts a settings dict, a path to a JSON model, a live Linker, or a not-yet-fitted SettingsCreator — whatever you already have in hand, no export step:
conv.em_model carries the imported m/u weights. Persist it and point the config at it so GoldenMatch scores with Splink’s weights instead of re-fitting:
Verify it preserved behaviour
The migration is only trustworthy if GoldenMatch reproduces Splink’s decisions.verify_against_splink runs both engines on a sample of your data and reports pairwise cluster agreement — no need to run Splink separately or hand over its output:
is_faithful is True at pairwise F1 ≥ 0.95. Verification is best-effort: it returns None (never raises) when splink isn’t installed or the settings can’t run under the local DuckDB engine (e.g. a Spark-dialect export whose SQL uses Spark-only functions).
What converts
The converter recognizes the full Splink comparison library, in both the DuckDB (double-quoted) and Spark (backtick-quoted) dialects.
Approximate mappings are where Splink’s measure and GoldenMatch’s aren’t identical (a distance/count/km/date snap), flagged in the report so you know exactly what’s lossy. Constructs the converter doesn’t recognize are dropped with a warning and reflected in the coverage scorecard, so nothing is silently lost.
splink is an optional dependency — the conversion itself never needs it. It’s only used for the agreement check, which degrades to a skip notice when absent.