DataNet.Fuzzy
0.1.0
See the version list below for details.
dotnet add package DataNet.Fuzzy --version 0.1.0
NuGet\Install-Package DataNet.Fuzzy -Version 0.1.0
<PackageReference Include="DataNet.Fuzzy" Version="0.1.0" />
<PackageVersion Include="DataNet.Fuzzy" Version="0.1.0" />
<PackageReference Include="DataNet.Fuzzy" />
paket add DataNet.Fuzzy --version 0.1.0
#r "nuget: DataNet.Fuzzy, 0.1.0"
#:package DataNet.Fuzzy@0.1.0
#addin nuget:?package=DataNet.Fuzzy&version=0.1.0
#tool nuget:?package=DataNet.Fuzzy&version=0.1.0
DataNet
A data-science toolkit for C#/.NET, built on an honest premise:
Don't rewrite Python. Use the .NET ecosystem where it's strong, and write native code only where .NET has a real gap: text (similarity, vectorization, semantic search). All of it with no Python at runtime.
Why
Python dominates data analysis through its ecosystem and its exploratory notebook workflow — not through the language itself; its performance comes from C/Fortran kernels. C# brings static typing, real parallelism without a global interpreter lock, safe refactoring, and simple deployment. The only objective reason to stay on Python for this domain was the lack of an equivalent .NET library. DataNet removes that reason.
Two deliverables
- Native code where there's a gap → the packages below (string distances,
vectorization, embeddings, fuzzy matching) — allocation-lean,
Span-based, SIMD, zero external dependencies in the core. - Migration guides for people coming from Python →
docs/migration/, which, for each need (NumPy, pandas, scikit-learn, statsmodels, PyTorch, matplotlib, seaborn), points to the right .NET building block and the pitfalls.
See the three-column migration inventory: it's the project map (use / build / decide).
Target: .NET 10 (
net10.0). Seedocs/decisions/0001.
Status — every lot of the project brief is delivered
| Lot | Contents | Status |
|---|---|---|
| 1 | String distances & similarity | ✅ complete — Levenshtein (+ Myers), OSA, Damerau-Levenshtein, Hamming, Jaro, Jaro-Winkler, Indel, LCS, Ratcliff-Obershelp, Jaccard, Dice, Overlap, Tversky, Cosine, Soundex, Metaphone, NYSIIS |
| 2 | Tokenization & sparse vectorization | ✅ complete — CSR, tokenizers (word/char/char_wb), CountVectorizer, TfidfVectorizer, HashingVectorizer, Porter, Snowball EN/FR, English stop words |
| 3 | Embeddings & semantic search | ✅ complete — WordPiece, SentencePiece, pooling, SIMD kNN, ONNX inference |
| 4 | Applied fuzzy matching | ✅ complete — fuzz.* (ratio/partial/token_sort/token_set/WRatio), process.extract/extractOne, blocking deduplication |
Every building block is oracle-validated against rapidfuzz / jellyfish /
textdistance / difflib / scikit-learn / nltk / HuggingFace tokenizers /
sentencepiece / numpy / ONNX Runtime (see docs/equivalence.md).
Getting started
dotnet add package DataNet.Text
using DataNet.Text.Distances;
Levenshtein.Distance("kitten", "sitting"); // 3
Levenshtein.NormalizedSimilarity("kitten", "sitting"); // 0.5714…
Full guide: docs/guides/quickstart.md. See also the
vectorization, embeddings
and fuzzy-matching guides.
Developing
dotnet build # build the solution
dotnet test # replay oracles + property tests
dotnet run -c Release --project bench/DataNet.Text.Benchmarks -- --filter '*Levenshtein*'
Oracle validation
Conformance to Python behavior is proven, not assumed (§4 of the brief):
tools/generate_oracles.py freezes a few thousand reference cases from
rapidfuzz/jellyfish/etc. into tests/oracles/*.json (versioned); the C# suite
replays them with a 1e-9 tolerance. Python is a development-only dependency. See
tools/README.md.
Structure
DataNet.sln
├── src/DataNet.Text/ distances, metrics, tokenizers, vectorizers, stemmers (no dependencies)
├── src/DataNet.Embeddings/ sub-word tokenizers, pooling, SIMD kNN, ONNX inference (ONNX Runtime isolated here)
├── src/DataNet.Fuzzy/ fuzz.*, process.extract, deduplication
├── tests/ xUnit: oracles + properties (one project per module)
├── tests/oracles/ frozen JSON corpora (generated from Python) + a synthetic ONNX model
├── bench/DataNet.Text.Benchmarks/ BenchmarkDotNet
├── tools/generate_oracles.py reference generation
├── Directory.Build.props (root); src|tests/Directory.Packages.props (central package management)
└── docs/ guides, equivalence table, decision log
Publishing
Three NuGet packages are produced: DataNet.Text, DataNet.Embeddings,
DataNet.Fuzzy. Package metadata (version, license, README, repository) is shared
in Directory.Build.props.
GitHub Packages (no nuget.org account needed — uses GitHub's automatic token).
Tag a version and push; the release workflow
packs and publishes:
git tag v0.1.0
git push origin v0.1.0
To consume them, add a source pointing at the owner's feed (with a GitHub token
that has read:packages):
dotnet nuget add source "https://nuget.pkg.github.com/CyrilB1531/index.json" \
--name github --username CyrilB1531 --password <GITHUB_TOKEN>
dotnet add package DataNet.Text
nuget.org (optional, needs a free account + API key). Once you have a key:
dotnet pack src/DataNet.Text -c Release -o artifacts
dotnet nuget push "artifacts/*.nupkg" --source https://api.nuget.org/v3/index.json --api-key <KEY>
License
Apache-2.0. See NOTICE and
THIRD-PARTY-NOTICES.md for attributions. The license
choice and the code-provenance rule are documented in
docs/decisions/0003-provenance-and-licensing.md.
This repository is not legal advice.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- DataNet.Text (>= 0.1.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.