Skip to main content

Univo

Compare anything. Keep every record clean.

Find duplicates in Python data, from text datasets to structured records. Combine fuzzy matching, local embeddings and field-level rules. Fast, lightweight, no server required.

PyPI Python 3.11+ License: MIT

pip install univo
from univo import Finder

names = ["Northwind Traders", "Contoso", "Northwnd Traders", "NORTHWIND TRADERS", "Fabrikam"]
for match in Finder().find(names, min_score=0.8).matches:
    print(names[match.left_id], "~", names[match.right_id], round(match.score, 2))
Northwind Traders ~ NORTHWIND TRADERS 1.0
Northwind Traders ~ Northwnd Traders 0.94
Northwnd Traders ~ NORTHWIND TRADERS 0.94

No training and no API key: records never leave your machine.

By default, find returns up to 1,000 matches scoring 0.8 or more (limit, min_score), and text is compared by spelling. Text(mode="semantic") compares by meaning, with a local model: the 15 MB multilingual default, or any Model2Vec model from Hugging Face or a folder. More: choosing a mode, choosing a model, every option.

Built for data cleaning, entity resolution, ML dataset deduplication and real-time duplicate checks.

Records and rules

A schema says which fields to compare, how, and which differences rule out a match. Nested fields are reached by path.

from univo import Exact, Finder, Schema, Text

schema = Schema(
    id_field="id",
    fields={"name": Text(), "address.city": Text(), "vat": Exact(conflict="reject")},
)
finder = Finder(schema=schema)
finder.add(
    [
        {"id": 1, "name": "Northwind Traders SAS", "address": {"city": "LYON"}, "vat": "FR401"},
        {"id": 2, "name": "Northwind Traders", "address": {"city": "Lyon"}, "vat": "FR999"},
    ]
)
query = {"id": 3, "name": "Northwind Traders", "address": {"city": "Lyon"}, "vat": "FR401"}
for match in finder.search(query).matches:
    print(match.right_id, round(match.score, 2), match.reasons)
1 0.94 ['name: trigrams', 'address.city: edit_distance', 'vat: exact']

Record 2 has another VAT number, so it can never match.

Meaning, with the model you choose

from univo import Finder, Schema, Text

finder = Finder(
    schema=Schema(fields={"description": Text(mode="semantic")}),
    model="minishlab/potion-base-8M",  # any Model2Vec model on Hugging Face, or a folder
)
texts = ["online clothing store", "shop selling clothes on the internet", "steel factory"]
report = finder.find([{"description": text} for text in texts], min_score=0.6)
for match in report.matches:
    print(texts[match.left_id], "~", texts[match.right_id], round(match.score, 2))
online clothing store ~ shop selling clothes on the internet 0.74

Without model, Univo uses its 15 MB multilingual default. The model downloads once, is verified, then works offline (models).

Why Univo

  • Records, not just strings. Dicts, lists and nested fields, compared field by field, with an explanation for every match.
  • Rules before scores. Different VAT numbers, tenants or environments rule out a match, however alike the records look.
  • Spelling, meaning and exact values, chosen per field, with a 15 MB multilingual model that runs offline, or any Model2Vec model you choose.
  • Fast, exact by default, and light. 100,000 names deduplicated in 4.8 s. Search is exact by default, with explicit limits and optional approximate retrieval. One 2 MiB wheel, no Python dependency.

New records as they arrive

Keep an index and check each new record before you store it.

finder = Finder(
    schema=Schema(id_field="id", fields={"name": Text(), "vat": Exact(conflict="reject")})
)
finder.add([{"id": 1, "name": "Northwind Traders", "vat": "FR401"}])

finder.check_or_add({"id": 2, "name": "Northwnd Traders", "vat": "FR401"}).status  # "review"
finder.check_or_add({"id": 3, "name": "Contoso", "vat": "FR777"}).status  # "inserted"
finder.check_or_add({"id": 4, "name": "Northwind Traders", "vat": "FR401"}).status  # "matched"

review means a similar record exists and nothing was inserted: your application decides.

Checking one new record against 100,000 synthetic company names, in one partition, at the default threshold of 0.8, with the model already loaded (Apple M2, PyPI wheel, script):

Name field Median p95
Lexical 0.15 ms 0.4 ms
With embeddings 2.2 ms 2.4 ms

Times depend on your data: they grow with the records of a partition and with the number of close candidates. Indexes can be updated, saved and loaded (mutations, snapshots).

Compared with other tools

Tool Built for Choose Univo when
RapidFuzz Fast similarity between two strings you want duplicate records, not string scores
SemHash Semantic deduplication of text datasets some fields must agree, such as IDs, tenants or environments
Dedupe Matching learned from labelled examples you want results without labelling or training
Splink Probabilistic record linkage at scale, on SQL engines you want an in-process library that also checks records one at a time

Against SemHash 0.5.0, with the same model, on an Apple M2:

Univo SemHash
Deduplicate 100,000 names, semantic 4.8 s, 270 MiB 8.7 s, 491 MiB
Organization aliases (ROR), test precision / recall 62.5% / 32.1% 48.0% / 30.1%
Structured records: forbidden matches, of 44 0 35
Installed size 4 MiB, 1 package 64 MiB, 30 packages

Univo's search is exact; SemHash's index is approximate. On names alone, neither tool is precise enough to merge automatically, so Univo returns scored candidates, not decisions. Method and every result: benchmarks.

Documentation

Quickstart · Reference · Benchmarks · Architecture · All docs

Metadata

Release files for univo 1.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for univo 1.0.1
File Size Uploaded Provenance
univo-1.0.1.tar.gz 238.3 kB With provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for univo 1.0.1
File
univo-1.0.1-cp311-abi3-win_arm64.whl CPython 3.11 abi3 Windows ARM64 Details
univo-1.0.1-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details
univo-1.0.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.11 abi3 Linux glibc 2.17+ x86-64 Details
univo-1.0.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.11 abi3 Linux glibc 2.17+ ARM64 Details
univo-1.0.1-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details
univo-1.0.1-cp311-abi3-macosx_10_12_x86_64.whl CPython 3.11 abi3 macOS 10.12+ x86-64 Details

Total release size: 12.6 MB

Release files / univo-1.0.1.tar.gz

Download URL univo-1.0.1.tar.gz
Size 238.3 kB
Tags Source
SHA-256 checksum
How to use checksums
53f2577eea098d698b22369f41301c83fa30164a2697f95e6cfdd42f06a885b9
BLAKE2b-256 checksum
How to use checksums
93d352313db1339ca6116fc8cfd15563cb7e8115f825388f6b167d2c37ca3cc2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / univo-1.0.1-cp311-abi3-win_arm64.whl

Download URL univo-1.0.1-cp311-abi3-win_arm64.whl
Size 2.0 MB
Tags CPython 3.11 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
e6e3bed9fb39938114b55e942e67b8fe3aef4e55b53f57c8affb5ddac0e3d229
BLAKE2b-256 checksum
How to use checksums
6323d411da0d4b0548fa4a3e1af80366e7d97a81e14efeb4c3d1d88072639859
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / univo-1.0.1-cp311-abi3-win_amd64.whl

Download URL univo-1.0.1-cp311-abi3-win_amd64.whl
Size 2.1 MB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
65b3a3acdc08d03399aa7871c2c17c0c072ed079d4d4d812ac9e8179f11c2f8e
BLAKE2b-256 checksum
How to use checksums
668ea7c8c371903cce314c0d9d321fc1a6a03e53b532df7b199c12e8cf9c0328
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / univo-1.0.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL univo-1.0.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 2.2 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
f624b893c8bda7312fef85aa78aa018a5d2fbf162fc659ea3d7ac601f350a267
BLAKE2b-256 checksum
How to use checksums
3647af58b020f1e86c40d4fb0629b5c66c21a045abc6a0d84bdafebe47dca598
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / univo-1.0.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL univo-1.0.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 2.0 MB
Tags CPython 3.11 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
6a7adce801da8cdc370388c554b36fcaf5c83f8f8ab5e9e9dc81c9f720c3700c
BLAKE2b-256 checksum
How to use checksums
e6b03f406d1a8265cd001a8f6c7a99d86579b3657959e879d9036f0e3ad08865
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / univo-1.0.1-cp311-abi3-macosx_11_0_arm64.whl

Download URL univo-1.0.1-cp311-abi3-macosx_11_0_arm64.whl
Size 2.0 MB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f2fa0e6ef2a3003b25f9771e7954742bbd0452c6560752f5ad53fd5854bb8bd7
BLAKE2b-256 checksum
How to use checksums
0226839513d62a216b4bf77ef3cd04d06a739e73aeaf11ea3b388b2c1c02ffd8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / univo-1.0.1-cp311-abi3-macosx_10_12_x86_64.whl

Download URL univo-1.0.1-cp311-abi3-macosx_10_12_x86_64.whl
Size 2.1 MB
Tags CPython 3.11 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
4a1ce177041ed40c0ec6f5cabcf98d273b13da77b8f5099226aa3f4d26e061d2
BLAKE2b-256 checksum
How to use checksums
e2d5676d57ae793e97cd02fc395341657a7bb1fa0c754d65fffb62e479bf9769
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Security for univo 1.0.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 7 files in this release have been uploaded with provenance metadata.

Select from 7 files

Attestation for univo-1.0.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.0.1 This release

7 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page