13 个不稳定版本 (3 个破坏性更新)
0.4.2 | 2020 年 1 月 18 日 |
---|---|
0.4.1 | 2019 年 12 月 12 日 |
0.3.2 | 2019 年 12 月 5 日 |
0.2.5 | 2019 年 11 月 25 日 |
0.1.0 | 2019 年 11 月 22 日 |
#602 in 算法
每月 214 次下载
用于 8 个 crate (7 个直接使用)
130KB
2.5K SLoC
Eddie
快速且经过充分测试的编辑距离/字符串相似度度量实现
- Levenshtein,
- Damerau-Levenshtein,
- Hamming,
- Jaro,
- Jaro-Winkler.
文档
查看 API 参考。
安装
将以下内容添加到您的 Cargo.toml
[dependencies]
eddie = "0.4"
基本用法
Levenshtein
use eddie::Levenshtein;
let lev = Levenshtein::new();
let dist = lev.distance("martha", "marhta");
assert_eq!(dist, 2);
Damerau-Levenshtein
use eddie::DamerauLevenshtein;
let damlev = DamerauLevenshtein::new();
let dist = damlev.distance("martha", "marhta");
assert_eq!(dist, 1);
Hamming
use eddie::Hamming;
let hamming = Hamming::new();
let dist = hamming.distance("martha", "marhta");
assert_eq!(dist, Some(2));
Jaro
use eddie::Jaro;
let jaro = Jaro::new();
let sim = jaro.similarity("martha", "marhta");
assert!((sim - 0.94).abs() < 0.01);
Jaro-Winkler
use eddie::JaroWinkler;
let jarwin = JaroWinkler::new();
let sim = jarwin.similarity("martha", "marhta");
assert!((sim - 0.96).abs() < 0.01);
字符串与切片
该 crate 提供了两个模块,包含两套实现
eddie::str
用于比较 UTF-8 编码的&str
和&String
值。实现已重新导出在根模块中。eddie::slice
用于比较泛型切片&[T]
。该模块中的实现比eddie::str
中的实现要快得多,但会对 UTF-8 和其他可变宽度字符编码产生不正确的结果。
使用示例
use eddie::slice::Levenshtein;
let lev = Levenshtein::new();
let dist = lev.distance(&[1, 2, 3], &[1, 3]);
assert_eq!(dist, 1);
互补度量
主要的度量方法通过反转和/或相对版本进行补充。在整个 crate 中的命名约定如下
distance
— 将一个字符串转换为另一个字符串所需的编辑次数;rel_dist
— 两个字符串之间的距离,相对于字符串长度(相似度的反转);similarity
— 两个字符串之间的相似度(相对距离的反转)。
性能
目前,Eddie 在具有 Unicode 支持的 crates.io 中的替代方案中具有最快的实现。
例如,当比较常见的英语单词时,除了 Hamming 之外,任何给定算法都可以期望至少 1.5-2 倍的速度提升。
有关详细的测量表,请参阅 基准 页面。