-
Notifications
You must be signed in to change notification settings - Fork 0
Text textelement
Whether one character means a UTF-16 code unit or a Unicode code point.
public enum TextElement { Utf16Unit, CodePoint }Members — Utf16Unit treats each char of the string as one element. It is the default, it is
what .NET's own string operations do, and it is the faster of the two because no decoding happens.
CodePoint decodes surrogate pairs first, so a character outside the Basic Multilingual Plane
counts as one element rather than two — which is what Python's len counts, and what
textdistance and jellyfish compare.
Example — one emoji between two letters, measured both ways.
using Lodestar.Text;
using Lodestar.Text.Distances;
// "a😀b" against "ab": the emoji is one code point and two UTF-16 units.
string withEmoji = "a\U0001F600b";
int units = Levenshtein.Distance(withEmoji, "ab"); // => 2
int points = Levenshtein.Distance(withEmoji, "ab", TextElement.CodePoint); // => 1Remarks — the two numbers are both correct answers to different questions. Deleting the emoji
is one edit a person would make and two char values a program removes, and which one you
want depends on whether the distance will be shown to someone or fed to something.
Reach for CodePoint when the answer is compared against Python's, when it is shown to a user as
"how many changes", or when the text is user-supplied and may hold emoji. Leave the default when
the text is ASCII or near it — the two agree exactly there, and the decoding is not free.
The choice is per call, not per process, so one comparison can use each. Nothing about it is global state.
It does not reach graphemes. A family emoji built from several code points joined by
zero-width joiners counts as several elements under CodePoint, not one, and no mode here counts
it as one — that is a third answer this enum does not offer.
Applies to — net10.0, netstandard2.0.
See also — Levenshtein.Distance,
Hamming.Distance, the distances index,
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