-
Notifications
You must be signed in to change notification settings - Fork 0
Text 0.3.1 osa distance
Lodestar.Text 0.3.1. This page is frozen at that release. Read the current documentation for what
mainsays now. A link to a decision or a migration page followsmain, and leaves the archive.
Counts the fewest insertions, deletions, substitutions and swaps of neighbouring characters, with no character allowed to take part in more than one edit.
public static int Distance(ReadOnlySpan<char> a, ReadOnlySpan<char> b, TextElement element = TextElement.Utf16Unit)
public static int Distance<T>(ReadOnlySpan<T> a, ReadOnlySpan<T> b) where T : IEquatable<T>Parameters — a and b are the two strings to compare. element says what counts as one
character: TextElement.Utf16Unit by default, or TextElement.CodePoint for rapidfuzz's answer
outside the Basic Multilingual Plane. The second overload compares any two spans of an
IEquatable<T>.
Returns — int, the number of edits. Zero when the two are equal, and never negative.
Example — the pair that separates OSA from full Damerau-Levenshtein, which answers 2.
using Lodestar.Text.Distances;
int d = Osa.Distance("CA", "ABC"); // => 3Remarks — for real text this and DamerauLevenshtein agree almost always, and this one costs
less to compute — three rolling rows instead of a full matrix and a symbol table. Reach for it as
the default transposition-aware distance, and only move to DamerauLevenshtein if the pairs you
are matching really do need a stretch edited twice.
The trap is that "almost always" is not always, and the disagreement is silent. "CA" to "ABC"
is
2 under DamerauLevenshtein and 3 here, because reaching 2 means transposing CA to AC and
then
inserting into that same stretch. If a test suite was built against Python's
DamerauLevenshtein.distance, Osa.Distance will pass on nearly every case and fail on a
handful,
which is the worst way to discover the difference.
The restriction costs one property outright: unlike Levenshtein and unlike unrestricted
DamerauLevenshtein, this is not a metric. The triangle inequality fails —
Osa.Distance("bca", "ab") is 3, while going through "ba" costs 1 + 1 — so a BK-tree or any
other structure that assumes a metric will silently return wrong neighbours. Use
DamerauLevenshtein when you need to index rather than to score.
Applies to — net10.0, netstandard2.0.
See also — Osa.NormalizedSimilarity, DamerauLevenshtein.Distance, Levenshtein.Distance,
the Python equivalence table.
- 0001-target-framework
- 0002-unicode-comparison-unit
- 0003-provenance-and-licensing
- 0004-levenshtein-myers-backlog
- 0005-hamming-jellyfish-divergence
- 0006-ratcliff-autojunk
- 0007-metaphone-scope
- 0008-italian-enza-nltk-divergence
- 0009-sample-consumes-a-local-feed
- 0010-stop-word-list-provenance
- 0011-persistence-format
- 0012-per-package-versioning
- 0013-sentencepiece-parity-scope
- 0014-precompiled-normalizer
- 0015-sonar-rules-in-the-build
- 0016-metrics-package-placement
- 0017-bpe-parity-scope
- 0018-multiclass-roc-auc-parallelism-is-opt-in
- 0019-the-net-analysers-run-in-the-build-too
- 0020-normalize-is-a-projection-not-a-parameter
- 0021-multioutput-is-a-method-not-an-enum
- 0022-added-token-matching-flags
- 0023-byte-level-decode-substitutes
- 0024-weighted-median-averages-within-scikit-learns-epsilon
- 0025-quickselect-replaces-a-full-sort-for-the-median
- 0026-r2-and-explainedvariance-split-their-undefined-cases-differently
- 0027-r2-and-explainedvariance-vectorize-only-a-single-output
- 0028-log1p-is-kahans-identity-not-math-log-1-plus-x
- 0029-balanced-accuracy-adjusted-is-left-to-ieee-754-at-the-edge
- 0030-cohen-kappa-keeps-scikit-learns-expected-matrix-orientation
- 0031-nosamplecorrect-mirrors-numpys-float64-upcast
- 0032-fbeta-substitutes-tp-predicted-and-support-algebraically
- 0033-compensated-sum-is-neumaiers-variant
- 0034-dropout-is-refused-for-want-of-a-user
- 0035-a-null-pre-split-is-removed-with-invert-not-isolated
- 0036-a-member-may-ship-without-an-oracle-if-it-says-so
- 0037-the-guards-run-before-the-commit
- 0038-the-gate-confronts-an-exception-tag-with-the-page-that-documents-it
- 0039-mutual-information-returns-zero-on-an-empty-input
- 0040-a-curve-is-a-sealed-class-per-curve
- 0041-one-sample-file-per-public-class
- 0042-phonetic-encoders-refuse-a-null-word
- 0043-the-equality-table-is-sized-to-the-pattern
- 0044-compression-belongs-to-the-caller
- 0045-a-console-call-carries-its-reason-on-the-line
- 0046-check-adr-immutable-runs-in-ci-only
- 0047-one-gate-per-kernel-not-one-per-alphabet
- 0048-the-gate-depends-on-the-kernel-and-the-alphabet
- 0049-two-gates-per-kernel-tested-where-the-width-is-known
- 0050-the-sentencepiece-bpe-lineage-stays-a-bpe-model
- benchmark_latest
- decisions
- equivalence
- matplotlib
- migration
- nightly_run
- numpy
- pandas
- performance
- pytorch
- seaborn
- sklearn
- statsmodels