Crates.io | weighted_levenshtein |
lib.rs | weighted_levenshtein |
version | 0.2.0 |
source | src |
created_at | 2020-09-20 22:17:30.693019 |
updated_at | 2020-10-03 14:13:56.560779 |
description | Generic implementation of Levenshtein distance allowing arbitrary weighting of operations |
homepage | https://github.com/bplevin36/weighted_levenshtein |
repository | https://github.com/bplevin36/weighted_levenshtein |
max_upload_size | |
id | 290955 |
size | 15,350 |
A generic implementation of the Levenshtein distance that allows arbitrarily weighting operations for different elements.
This crate can work on slices of any kind. It can:
assert_eq!(distance("abc", "aaxcc"), 3);
assert_eq!(
distance(
"The quick brown fox".split (' ').collect::<Vec<_>>(),
"The very quick brown cat".split (' ').collect()),
2);
assert_eq!(distance(vec![1, 2, 3], vec![0, 1, 3, 3, 4]), 3);
This crate allows defining custom weights for each operation on each symbol.
These weights can be specified for custom types by implementing the EditWeight
trait.
For example:
enum MyType {
A,
B,
}
impl EditWeight for MyType {
fn add_cost(&self) -> usize {
match *self {
MyType::A => 1,
MyType::B => 2,
}
}
fn rm_cost(&self) -> usize {
match *self {
MyType::A => 1,
MyType::B => 2,
}
}
fn sub_cost(&self, other: &Self) -> usize {
if self == other {
0
} else {
3
}
}
}
assert_eq!(distance(vec![MyType::A], vec![MyType::B, MyType::B]), 5)