String-Distance Similarity Metrics

fuzzy exposes only difflib’s gestalt ratio. This adds the edit-distance and token-set metrics it lacks — Levenshtein / Damerau-Levenshtein, Jaro and Jaro-Winkler (the standard for short names and labels), and character-n-gram Jaccard / Dice — for better matching of typos and reordered tokens, especially from OCR.

Pure standard library; imports no PySide6. Every function is pure (two strings in, a number out), so it is fully deterministic in CI. Pair with normalize_text to make matches accent- and form-insensitive first.

Headless API

from je_auto_control import (
    levenshtein, damerau_levenshtein, jaro_winkler, jaccard, dice,
    similarity, normalize_text,
)

levenshtein("kitten", "sitting")            # 3
damerau_levenshtein("ab", "ba")             # 1 (transposition)
jaro_winkler("MARTHA", "MARHTA")            # ~0.961
jaccard("night", "nacht", n=2)              # char-bigram overlap

# normalised [0, 1] score for any metric (edit distance -> 1 - d/max_len):
similarity(normalize_text(a), normalize_text(b), metric="jaro_winkler")

levenshtein / damerau_levenshtein return integer edit distances (the latter counting an adjacent transposition as one edit). jaro / jaro_winkler and jaccard / dice return [0, 1] similarities. similarity is the unified entry point — it returns the Jaro/Jaccard/Dice metrics directly and converts edit distances to 1 - distance / max_len so every metric is comparable on the same scale.

Executor command

AC_text_similarity returns {score} for two strings a / b and an optional metric. It is exposed as the MCP tool ac_text_similarity and as a Script Builder command under Data.