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 算法

Download history 84/week @ 2024-03-14 64/week @ 2024-03-21 113/week @ 2024-03-28 89/week @ 2024-04-04 71/week @ 2024-04-11 110/week @ 2024-04-18 104/week @ 2024-04-25 83/week @ 2024-05-02 108/week @ 2024-05-09 134/week @ 2024-05-16 107/week @ 2024-05-23 95/week @ 2024-05-30 1437/week @ 2024-06-06 1865/week @ 2024-06-13 2380/week @ 2024-06-20 2939/week @ 2024-06-27

每月8,631次下载
用于 9 个 crate(5 个直接使用)

MIT 许可证

125KB
365

rs-natural

Build Status

用 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