Sequences and explicit normalization#

Levenshtein distance is not restricted to prose strings, and preprocessing is an application choice rather than hidden facade behavior.

raw Unicode distance: 2
normalized distance: 0

import unicodedata

from scikitplot.levenshtein import distance, rank

assert distance(
    ["spam", "egg"],
    ["spam", "ham"],
    backend="python",
) == 1

assert distance(b"abc", b"axc", backend="python") == 1

decomposed = "cafe\u0301"
composed = "café"

raw_distance = distance(decomposed, composed, backend="python")
assert raw_distance > 0

normalize = lambda text: unicodedata.normalize("NFC", text)
assert distance(normalize(decomposed), normalize(composed), backend="python") == 0

records = [
    {"name": "Scikit Plots"},
    {"name": "Scikit Learn"},
]
matches = rank(
    "scikit plots",
    records,
    key=lambda item: item["name"].casefold(),
    backend="python",
)
assert matches[0].choice["name"] == "Scikit Plots"

print("raw Unicode distance:", raw_distance)
print("normalized distance:", 0)

Total running time of the script: (0 minutes 0.001 seconds)

Related examples

Use Levenshtein distance with Corpus retrieval

Use Levenshtein distance with Corpus retrieval

Rank fuzzy matches

Rank fuzzy matches

Levenshtein basics

Levenshtein basics

Backend discovery and safe fallback

Backend discovery and safe fallback

Gallery generated by Sphinx-Gallery