6 个版本 (3 个破坏性更新)
使用旧的 Rust 2015
0.5.0 | 2020年2月13日 |
---|---|
0.4.0 | 2020年2月13日 |
0.3.0 | 2017年8月16日 |
0.2.2 | 2017年7月17日 |
0.2.1 | 2017年3月7日 |
#273 in 算法
每月8,631次下载
用于 9 个 crate(5 个直接使用)
125KB
365 行
rs-natural
用 Rust 编写的自然语言处理库。仍处于开发中。基本上是一个实验,但也许会有些有趣的结果。
当前工作
- Jaro-Winkler 距离
- Levenshtein 距离
- 分词
- NGrams(带填充和不带填充)
- 语音学(Soundex)
- 朴素贝叶斯分类
- 通过 Serde 进行序列化
- 词频-逆文档频率(tf-idf)
- 通过 Serde 进行序列化
短期目标
- 逻辑回归分类
- 优化朴素贝叶斯(目前相当慢)
- 复数/单数屈折
使用方法
风险自担。一些功能缺失,一些其他功能由于尚未优化而运行缓慢。我正在针对 master,不提供向后兼容性。
设置
它是一个带有 cargo.toml 的 crate。将此添加到您的 cargo.toml 中
[dependencies]
natural = "0.3.0"
# Or enable Serde support
natural = { version = "0.4.0", features = ["serde_support"]}
serde = "1.0"
距离
extern crate natural;
use natural::distance::jaro_winkler_distance;
use natural::distance::levenshtein_distance;
assert_eq!(levenshtein_distance("kitten", "sitting"), 3);
assert_eq!(jaro_winkler_distance("dixon", "dicksonx"), 0.767);
注意,由于 JWD 返回一个 f64,所以不要实际上 assert_eq!
在 JWD 上。为了测试,我实际上使用
fn f64_eq(a: f32, b: f32) {
assert!((a - b).abs() < 0.01);
}
语音学
在这个库中获取 SoundEx 算法有两种方式,一种是简单的 soundex
函数,它接受两个 &str
参数并返回一个布尔值,另一种是通过 SoundexWord 结构体。我将在下面展示两种方法。
use natural::phonetics::soundex;
use natural::phonetics::SoundexWord;
assert!(soundex("rupert", "robert"));
let s1 = SoundexWord::new("rupert");
let s2 = SoundexWord::new("robert");
assert!(s1.sounds_like(s2));
assert!(s1.sounds_like_str("robert"));
分词
extern crate natural;
use natural::tokenize::tokenize;
assert_eq!(tokenize("hello, world!"), vec!["hello", "world"]);
assert_eq!(tokenize("My dog has fleas."), vec!["My", "dog", "has", "fleas"]);
NGrams
您可以使用带填充和不带填充的 ngram,例如。
extern crate natural;
use natural::ngram::get_ngram;
use natural::ngram::get_ngram_with_padding;
assert_eq!(get_ngram("hello my darling", 2), vec![vec!["hello", "my"], vec!["my", "darling"]]);
assert_eq!(get_ngram_with_padding("my fleas", 2, "----"), vec![
vec!["----", "my"], vec!["my", "fleas"], vec!["fleas", "----"]]);
分类
extern crate natural;
use natural::classifier::NaiveBayesClassifier;
let mut nbc = NaiveBayesClassifier::new();
nbc.train(STRING_TO_TRAIN, LABEL);
nbc.train(STRING_TO_TRAIN, LABEL);
nbc.train(STRING_TO_TRAIN, LABEL);
nbc.train(STRING_TO_TRAIN, LABEL);
nbc.guess(STRING_TO_GUESS); //returns a label with the highest probability
Tf-Idf
extern crate natural;
use natural::tf_idf::TfIdf;
tf_idf.add("this document is about rust.");
tf_idf.add("this document is about erlang.");
tf_idf.add("this document is about erlang and rust.");
tf_idf.add("this document is about rust. it has rust examples");
println!(tf_idf.get("rust")); //0.2993708f32
println!(tf_idf.get("erlang")); //0.13782766f32
//average of multiple terms
println!(tf_idf.get("rust erlang"); //0.21859923
依赖关系
~3.5MB
~42K SLoC