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

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



前言

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<String, Vec<String>>


synonyms需要传入一个字符串引用,返回一个单词的同义词字符串vector,其定义为下

pub fn synonyms(word: impl AsRef<str>) -> Vec<String>

现给出这两方法的源码

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就是我们要查询的同义词,其运行结果如下

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就可以实现离线查询单词同义词,可惜只有英文的,该库较为简单,且在用途上较为单一,除了使用简单以外真的很难找出什么优点。

目录
相关文章
|
2天前
|
Rust 安全 开发者
Rust之旅:打造并发布你的首个Rust库
本文将引导读者走进Rust的世界,从基础概念讲起,逐步深入到如何创建、测试、打包和发布自己的Rust库。通过实际操作,我们将理解Rust的独特之处,并学会如何分享自己的代码到Rust社区,从而为开源世界做出贡献。
|
2天前
|
存储 JSON Rust
【一起学Rust | 进阶篇 | reqwest库】纯 Rust 编写的 HTTP 客户端——reqwest
【一起学Rust | 进阶篇 | reqwest库】纯 Rust 编写的 HTTP 客户端——reqwest
327 0
|
2天前
|
Rust Unix Linux
【一起学Rust | 进阶篇 | Service Manager库】Rust专用跨平台服务管理库
【一起学Rust | 进阶篇 | Service Manager库】Rust专用跨平台服务管理库
199 0
|
2天前
|
Rust 关系型数据库 调度
【一起学Rust | 进阶篇 | Fang库】后台任务处理库——Fang
【一起学Rust | 进阶篇 | Fang库】后台任务处理库——Fang
170 0
|
2天前
|
Rust Ubuntu Linux
【一起学Rust | 进阶篇 | RMQTT库】RMQTT消息服务器——安装与集群配置
【一起学Rust | 进阶篇 | RMQTT库】RMQTT消息服务器——安装与集群配置
156 0
|
2天前
|
存储 Rust 安全
Rust标准库概览:集合、IO、时间与更多
本文将带领读者深入了解Rust标准库中的一些核心模块,包括集合类型、输入/输出处理、时间日期功能等。我们将通过实例和解释,探讨这些模块如何使Rust成为高效且安全的系统编程语言。
|
2天前
|
Rust Java Linux
【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互
【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互
89 0
|
2天前
|
存储 Rust C语言
【一起学Rust | 进阶篇 | Grid库】二维表数据结构——Grid
【一起学Rust | 进阶篇 | Grid库】二维表数据结构——Grid
95 0
|
2天前
|
Rust 数据安全/隐私保护
rust每日一库 rand 生成随机数
rust每日一库 rand 生成随机数
61 0
|
10月前
|
Rust 程序员 索引
Rust 标准库字符串类型String及其46种常用方法
String是一个可变引用,而&str是对该字符串的不可变引用,即可以更改String的数据,但是不能操作&str的数据。String 类型来自标准库,它是可修改、可变长度、可拥有所有权的同样使用UTF-8编码,且它不以空(null)值终止,实际上就是对Vec的包装,在堆内存上分配一个字符串。由&[u8]表示,UTF-8编码的字符串的引用,字符串字面值,也称作字符串切片。
205 1