89 lines
2.7 KiB
Python
89 lines
2.7 KiB
Python
# SPDX-License-Identifier: MIT
|
|
# Copyright (C) 2022 Max Bachmann
|
|
"""
|
|
The Levenshtein (edit) distance is a string metric to measure the
|
|
difference between two strings/sequences s1 and s2.
|
|
It's defined as the minimum number of insertions, deletions or
|
|
substitutions required to transform s1 into s2.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Callable
|
|
|
|
from rapidfuzz._utils import ScorerFlag as _ScorerFlag
|
|
from rapidfuzz._utils import fallback_import as _fallback_import
|
|
|
|
|
|
def _get_scorer_flags_distance(
|
|
weights: tuple[int, int, int] | None = (1, 1, 1)
|
|
) -> dict[str, Any]:
|
|
flags = _ScorerFlag.RESULT_I64
|
|
if weights is None or weights[0] == weights[1]:
|
|
flags |= _ScorerFlag.SYMMETRIC
|
|
|
|
return {
|
|
"optimal_score": 0,
|
|
"worst_score": 2**63 - 1,
|
|
"flags": flags,
|
|
}
|
|
|
|
|
|
def _get_scorer_flags_similarity(
|
|
weights: tuple[int, int, int] | None = (1, 1, 1)
|
|
) -> dict[str, Any]:
|
|
flags = _ScorerFlag.RESULT_I64
|
|
if weights is None or weights[0] == weights[1]:
|
|
flags |= _ScorerFlag.SYMMETRIC
|
|
|
|
return {
|
|
"optimal_score": 2**63 - 1,
|
|
"worst_score": 0,
|
|
"flags": flags,
|
|
}
|
|
|
|
|
|
def _get_scorer_flags_normalized_distance(
|
|
weights: tuple[int, int, int] | None = (1, 1, 1)
|
|
) -> dict[str, Any]:
|
|
flags = _ScorerFlag.RESULT_F64
|
|
if weights is None or weights[0] == weights[1]:
|
|
flags |= _ScorerFlag.SYMMETRIC
|
|
|
|
return {"optimal_score": 0, "worst_score": 1, "flags": flags}
|
|
|
|
|
|
def _get_scorer_flags_normalized_similarity(
|
|
weights: tuple[int, int, int] | None = (1, 1, 1)
|
|
) -> dict[str, Any]:
|
|
flags = _ScorerFlag.RESULT_F64
|
|
if weights is None or weights[0] == weights[1]:
|
|
flags |= _ScorerFlag.SYMMETRIC
|
|
|
|
return {"optimal_score": 1, "worst_score": 0, "flags": flags}
|
|
|
|
|
|
_dist_attr: dict[str, Callable[..., dict[str, Any]]] = {
|
|
"get_scorer_flags": _get_scorer_flags_distance
|
|
}
|
|
_sim_attr: dict[str, Callable[..., dict[str, Any]]] = {
|
|
"get_scorer_flags": _get_scorer_flags_similarity
|
|
}
|
|
_norm_dist_attr: dict[str, Callable[..., dict[str, Any]]] = {
|
|
"get_scorer_flags": _get_scorer_flags_normalized_distance
|
|
}
|
|
_norm_sim_attr: dict[str, Callable[..., dict[str, Any]]] = {
|
|
"get_scorer_flags": _get_scorer_flags_normalized_similarity
|
|
}
|
|
|
|
_mod = "rapidfuzz.distance.Levenshtein"
|
|
distance = _fallback_import(_mod, "distance", cached_scorer_call=_dist_attr)
|
|
similarity = _fallback_import(_mod, "similarity", cached_scorer_call=_sim_attr)
|
|
normalized_distance = _fallback_import(
|
|
_mod, "normalized_distance", cached_scorer_call=_norm_dist_attr
|
|
)
|
|
normalized_similarity = _fallback_import(
|
|
_mod, "normalized_similarity", cached_scorer_call=_norm_sim_attr
|
|
)
|
|
editops = _fallback_import(_mod, "editops")
|
|
opcodes = _fallback_import(_mod, "opcodes")
|