Crate ngrammatic[][src]

Expand description

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. It is modelled somewhat after the python ngram module with some inspiration from chappers’ blog post on fuzzy matching with ngrams.

The crate is implemented in three parts: the Corpus, which is an index connecting strings (words, symbols, whatever) to their Ngrams, and SearchResults, which contains a fuzzy match result, with the word and a similarity measure in the range of 0.0 to 1.0.

The general usage pattern is to construct a Corpus, .add() your list of valid symbols to it, and then perform .search()es of valid, unknown, misspelled, etc symbols on the Corpus. The results come back as a vector of up to 10 results, sorted from highest similarity to lowest.


use ngrammatic::{CorpusBuilder, Pad};

let mut corpus = CorpusBuilder::new()

// Build up the list of known words

// Now we can try an unknown/misspelled word, and find a similar match
// in the corpus
let results ="tomacco", 0.25);
let top_match = results.first();

assert!(top_match.unwrap().similarity > 0.5);


Holds a corpus of words and their ngrams, allowing fuzzy matches of candidate strings against known strings in the corpus.

Build an Ngram Corpus, one setting at a time.

Stores a “word”, with all its n-grams. The “arity” member determines the value of “n” used in generating the n-grams.

Build an Ngram, one setting at a time.

Holds a fuzzy match search result string, and its associated similarity to the query text.


Determines how strings are padded before calculating the grams. Having some sort of padding is especially important for small words Auto pad pre/appends arity-1 space chars Read more about the effect of ngram padding