9 releases

Uses old Rust 2015

0.4.0 May 2, 2022
0.3.5 Feb 4, 2022
0.3.4 Dec 28, 2021
0.3.2 Aug 18, 2020
0.2.1 Nov 6, 2017

#957 in Text processing

Download history 128/week @ 2024-11-13 33/week @ 2024-11-20 33/week @ 2024-11-27 39/week @ 2024-12-04 125/week @ 2024-12-11 36/week @ 2024-12-18 49/week @ 2024-12-25 22/week @ 2025-01-01 28/week @ 2025-01-08 42/week @ 2025-01-15 34/week @ 2025-01-22 120/week @ 2025-01-29 69/week @ 2025-02-05 81/week @ 2025-02-12 36/week @ 2025-02-19 117/week @ 2025-02-26

315 downloads per month
Used in 4 crates

MIT license

38KB
583 lines

This crate provides fuzzy search/string matching using N-grams.

This implementation is character-based, rather than word based, matching solely based on string similarity.

Licensed under the MIT license.

Documentation

https://docs.rs/ngrammatic/latest/ngrammatic/

Installation

This crate is published on crates.io.

To use it, add this to your Cargo.toml:

[dependencies]
ngrammatic = "0.3.4"

Usage

To do fuzzy matching, build up your corpus of valid symbols like this:

use ngrammatic::{CorpusBuilder, Pad};

let mut corpus = CorpusBuilder::new()
    .arity(2)
    .pad_full(Pad::Auto)
    .finish();

// Build up the list of known words
corpus.add_text("pie");
corpus.add_text("animal");
corpus.add_text("tomato");
corpus.add_text("seven");
corpus.add_text("carbon");

// Now we can try an unknown/misspelled word, and find a similar match
// in the corpus
let word = String::from("tomacco");
if let Some(top_result) = corpus.search(word, 0.25).first() {
    if top_result.similarity > 0.99 {
        println!("{}", top_result.text);
    } else {
        println!("{} (did you mean {}? [{:.0}% match])",
                 word,
                 top_result.text,
                 top_result.similarity * 100.0);
    }
} else {
    println!("🗙 {}", word);
}

No runtime deps