定制小程序开发费用【一起学Rust | 进阶篇 | thesaurus-rs库】Rust 的离线同义词库——thesaurus-rs


文章目录


前言

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

显而易见,thesaurus-rs定制小程序开发费用就是通过你给出的一个单词,然后给出这个单词的同义词,就类似于字典。

后端比较

名称简单示例二进制包大小简单示例二进制包大小 (剥离)可用词平均同义词数压缩字典大小授权
Moby15M11M3015983.28711MUS Public Domain
Wordnet6.9M3.4M1257013.3942.9M

一、安装与引用

1. 使用WordNet后端

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

thesaurus = "0.5"
  • 1

2. 使用moby后端

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

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

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


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

3. build下载crate

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

cargo build
  • 1

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

二、使用步骤

1.获取命令行参数

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

use std::{env, process};
  • 1

然后存储参数到变量中

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

2.取到同义词

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

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

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

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

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

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

补充

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}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
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}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3.输出结果

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

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

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

接下来输出所有的同义词

	println!("以下同义词...");    for x in &synonyms {        println!("   {x}");    }
  • 1
  • 2
  • 3
  • 4

4.运行效果

在终端输入命令

cargo run good
  • 1

其中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}");    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

总结

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

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发