Open source · Apache-2.0 · Python 3.12+

Identity resolution for
imperfect observations

Thisness decides which records refer to the same thing, and keeps the evidence, the decision and the history behind every conclusion, so any of them can be explained, reviewed or reversed.

Read the docs
Thisness WorkbenchOpen the explorer
Review queue/Boundary reviewrev_01M3253RP6NTBFGVNHRFNA9XR4
Are these the same entity, different entities, or related ones?
6 records in 2 entities today. In the Workbench you drag cards between columns to regroup; every answer is stored with its reason and can be undone.
Suggestiondifferentgpt-6-luna
The records form two internally consistent groups: “THE GYM LIMITED”/“Gym” and “THE GYM GROUP PLC” (C1–C6). The shared postal location and partial name overlap provide only weak cross-group support, and the distinct registered names do not establish that these are the same organization or that they have a specific relationship (C13–C15).
R1, R2, R3R4, R5, R6its grouping
GGymactive3
THE GYM LIMITEDR1
2ND FLOOR, ARDING & HOBBS, 7 ST. JOHN'S ROAD, LONDON, SW11 1QN
companies_house:rec000965
GymR2
2ND FLOOR, ARDING & HOBBS, LONDON, SW11 1QN
accounts_payable:rec000966
GymR3
LONDON, SW11 1QN
crm:rec000967
THE GYM GROUP PLCR4
2ND FLOOR, ARDING & HOBBS, 7 ST. JOHN'S ROAD, LONDON, SW11 1QN
companies_house:rec001361
THE GYM GROUP PLCR5
2ND FLOOR, ARDING & HOBBS, LONDON, SW11 1QN
gleif:rec001362
The Gym Group PlcR6
LONDON, SW111QN
accounts_payable:rec001363

Comparisons, strongest first

RecordsEvidenceWeightVerdict
C1R4 ↔ R5
name exact key+10.2location postal+8legal form same+0.6
18.8match
C2R4 ↔ R6
name exact key+10.2location postal+8legal form same+0.6
18.8match
C3R5 ↔ R6
name exact key+10.2location postal+8legal form same+0.6
18.8match
C4R1 ↔ R2
name exact key+10.2location postal+8
18.2match
C5R1 ↔ R3
name exact key+10.2location postal+8
18.2match
C6R2 ↔ R3
name exact key+10.2location postal+8
18.2match
C7R2 ↔ R4
name token subset0location postal+8
8possible
C8R2 ↔ R5
name token subset0location postal+8
8possible
C9R2 ↔ R6
name token subset0location postal+8
8possible
C10R3 ↔ R4
name token subset0location postal+8
8possible
C11R3 ↔ R5
name token subset0location postal+8
8possible
C12R3 ↔ R6
name token subset0location postal+8
8possible
Read-only. In the Workbench you answer here:

Real UK companies, resolved with no model, and a model's suggested answer to an open review. Hover a label in its rationale to see the records and comparisons it cites.

Hesperus is Phosphorus

Two observations.
One planet.

For centuries the evening star and the morning star were two things. Then observation showed they were the same planet: identity established by evidence rather than by definition.

Thisness does that for data. It takes observations from many sources (“IBM”, “IBM Corp.”, an invoice line, a contract party) and decides what they refer to, with a record of why.

Core concepts
O1Hesperusseen at dusk, in the west
O2Phosphorusseen at dawn, in the east
orbit sameperiod sametime seen differs, says nothing
V
Venus2 observations · committed with its evidence
active
Principles

Every conclusion keeps its reasons

Observations are not entities

A source record is an observation of something. Entities are stable identities above them, with IDs that never change when names do.

Similarity is not identity

Candidates, evidence, decisions and identity are separate steps with separate records. Scores are typed; there is no universal confidence float.

Identity is not relationship

“Subsidiary of” and “brand of” relate distinct entities. A group's sibling companies are never merged for sharing a name.

Everything is reversible

Merges and splits are ledger events over memberships. Nothing is destructively collapsed, and the ledger alone rebuilds current state.

Models propose; policy decides

Rules, Fellegi-Sunter, language models and people all contribute decisions. Only a commit, citing them, changes identity.

Read the design

Seven design documents, from the core model to real organizations, with every measurement.

The design documents
Three domains ship

Records in, entities out

A domain is a resolution profile: attributes, comparisons, constraints and the guidance a model is given.

Organizations
Haleon UK Finance Limited
HALEON UK FINANCE LTD
HALEON UK FINANCE LIMITaED
one entity
Haleon UK Finance Limited
Haleon UK Capital PLC, same address: related, not the same
People
Robert J. Smith, 1971-04-02
Bob Smith
R. J. Smith, same email
one entity
Robert J. Smith
Robert Smith Jr., same address: a household, not a match
Taxa
Quercus robur L.
Q. robur
Quercus pedunculata Ehrh.
one entity
Quercus robur L. (accepted, WFO)
Quercus ilex Lour., a later homonym of Q. ilex L.
Measured on real data

Real UK companies, identifiers hidden

GLEIF and Companies House records, with supplier-file variants generated from the true company. 62% of live UK companies share a registered address; the hard cases are real.

.9992
precision
3,507 records, no model
.912
recall
one false-merge cluster
.938
recall with a model
gpt-6-luna deciding contested pairs, $0.62
46,565
records at scale
precision .9965, recall .934
Start

A library, a command line and a Workbench

Python
from thisness import Thisness
from thisness.profiles.organization import organization

engine = Thisness("identity.duckdb", profiles=[organization()])
engine.ingest([engine.observe("organization", r, src) for r, src in rows])

result = engine.resolve_many("organization")  # fit, then resolve
outcome = engine.resolve("organization", {"name": "IBM Corp."}, src)
engine.explain(outcome.decision_id)  # the decision and its evidence
Command line
pip install 'thisness[ui]'
thisness ingest vendors.csv --resolve
thisness ui   # the Workbench

# a model decides contested pairs
thisness resolve --provider openai \
  --model gpt-6-luna --budget 2

Know what your records refer to

Quickstart