【一起学Rust | 进阶篇 | thesaurus-rs库】Rust 的离线同义词库——thesaurus-rs


文章目录

  • 前言
    • 后端比较
  • 一、安装与引用
    • 1. 使用WordNet后端
    • 2. 使用moby后端
    • 3. build下载crate
  • 二、使用步骤
    • 1.获取命令行参数
    • 2.取到同义词
      • 补充
    • 3.输出结果
    • 4.运行效果
    • 5.完整代码
  • 总结


前言

thesaurus-rs是一个完全基于Rust实现的离线的同义词库,可以使用wordnetmoby词库作为后端(白鲸和词网)。

显而易见,thesaurus-rs就是通过你给出的一个单词,然后给出这个单词的同义词,就类似于字典。

后端比较

名称 简单示例二进制包大小 简单示例二进制包大小 (剥离) 可用词 平均同义词数 压缩字典大小 授权
Moby 15M 11M 30159 83.287 11M US Public Domain
Wordnet 6.9M 3.4M 125701 3.394 2.9M Wordnet License

一、安装与引用

1. 使用WordNet后端

将下面的crate添加到你的Cargo.toml文件中

thesaurus = "0.5"

2. 使用moby后端

将下面的crate添加到你的Cargo.toml文件中

thesaurus = { version = "0.5", features = ["moby","static"], default_features = false }

注意:这里features 添加了两项,分别是moby和static,表明使用的是moby后端,同时也表明,默认的后端是WordNet,这里默认配置的是WordNet和static。


static是个默认开启的功能,即词库词典在运行时存储在内存中。这样做的好处是初始化以后,对dictsynonyms的调用速度提升了 2.5-3 倍,同时增加了内存使用量。你可以关闭它,使用default_features = false,就和上方的使用方法一样。

3. build下载crate

在当前项目目录终端中运行命令

cargo build

如果你一直学习的本系列视频,则无需进行这一步。

二、使用步骤

1.获取命令行参数

我们使用系统自带的方式来获取命令行参数

use std::{env, process};

然后存储参数到变量中

let args = env::args().collect::<Vec<String>>();

2.取到同义词

env的arg获取的第0个参数是当前程序的程序名,第一个参数就是我们所要的单词,我们接收这个参数,并且存入word变量中,

let word: String = match args.get(1) {
        Some(word) => word.to_string(),
        None => {
            eprintln!("至少要包含一个单词作为参数");
            process::exit(1);
        }
    };

然后调用thesaurus::synonyms方法来获取同义词

    let synonyms = thesaurus::synonyms(&word);

此处还可以获取词库的词量

    let num_words = thesaurus::dict().len();

补充

thesaurus-rs常用的是两个方法dictsynonyms


dict返回一个内部字典,是一个HashMap,其定义为下
pub fn dict() -> HashMap>


synonyms需要传入一个字符串引用,返回一个单词的同义词字符串vector,其定义为下
pub fn synonyms(word: impl AsRef) -> Vec

现给出这两方法的源码

pub fn dict() -> HashMap<String, Vec<String>> {
    let mut dict: HashMap<String, Vec<String>> = HashMap::new();

    #[cfg(feature = "static")]
    dict.extend(DICT.to_owned());

    // if we're not static...
    if dict.is_empty() {
        dict.extend(parse_dict());
    }

    dict
}
pub fn synonyms(word: impl AsRef<str>) -> Vec<String> {
    let mut s = dict()
        .get(word.as_ref())
        .map(|x| x.clone())
        .unwrap_or_default();

    s.dedup();
    s.sort_by(|a, b| a.cmp(&b));

    s
}

3.输出结果

在上述的步骤中我们已经获取到了所要单词的同义词,接下来使用for循环依次输出所有的同义词

先对当前查询的信息进行输出,主要输出当前词库共有多少个单词,查询的单词有多少个同义词,当然你也可以不写

println!("{num_words} 个单词被索引, 并且\"{word}\"有 {} 个同义词 ...", synonyms.len());

接下来输出所有的同义词

	println!("以下同义词...");
    for x in &synonyms {
        println!("   {x}");
    }

4.运行效果

在终端输入命令

cargo run good

其中good就是我们要查询的同义词,其运行结果如下
【一起学Rust | 进阶篇 | thesaurus-rs库】Rust 的离线同义词库——thesaurus-rs_第1张图片

5.完整代码

这里给出完整代码,以便于学习参考

use std::{env, process};

fn main() {
    let args = env::args().collect::<Vec<String>>();

    let word: String = match args.get(1) {
        Some(word) => word.to_string(),
        None => {
            eprintln!("至少要包含一个单词作为参数");
            process::exit(1);
        }
    };

    let synonyms = thesaurus::synonyms(&word);
    let num_words = thesaurus::dict().len();

    println!("{num_words} 个单词被索引, 并且\"{word}\"有 {} 个同义词 ...", synonyms.len());
    println!("以下同义词...");
    for x in &synonyms {
        println!("   {x}");
    }
}

总结

本期学习了Rust 的离线同义词库thesaurus-rs,通过简单的API就可以实现离线查询单词同义词,可惜只有英文的,该库较为简单,且在用途上较为单一,除了使用简单以外真的很难找出什么优点。

你可能感兴趣的:(一起学Rust,#,Rust进阶篇,rust,开发语言,后端)