4 个版本

0.1.3 2022年2月2日
0.1.2 2022年2月1日
0.1.1 2022年2月1日
0.1.0 2022年2月1日

#704文本处理

26 每月下载量

MIT 许可证

60KB
1K SLoC

Rust 基自然语言工具包 (rsnltk)

一个基于纯 Rust 实现和 Python 绑定的 Rust 库,用于支持自然语言处理

Rust 文档 | Crates 主页 | 测试 | NER-Kit

特性

rsnltk 库集成了各种现有的用 Python 编写的 NLP 工具包,以在基于 Rust 的应用程序中进行强大的文本分析。

函数

此工具包基于用 Python 编写的 Stanza 和其他重要的 NLP Crates。

以下是我们绑定的来自 Stanza 和其他工具包的函数列表:

  • 分词
  • 句子分割
  • 多词分词扩展
  • 词性 & 形态学特征
  • 命名实体识别
  • 情感分析
  • 语言识别
  • 依存树分析

一些惊人的 Crates 也包含在 rsnltk 中,但提供了简化的 API 以供实际使用

此外,我们可以通过 semantic-kit PyPI 项目使用 WordNet 来计算单词之间的相似性,方法是通过 pip install semantic-kit

安装

  1. 请确保您已安装 Python 3.6.6+ 和 PIP 环境。在终端中输入 python -V 应该不会打印错误消息;

  2. 安装我们的基于 Python 的 ner-kit (版本>=0.0.5a2),以便通过 pip install ner-kit==0.0.5a2 绑定 Stanza 包;

  3. 然后,Rust 也应该安装在您的计算机上。我使用 IntelliJ 来开发基于 Rust 的应用程序,您可以在其中编写 Rust 代码;

  4. 创建一个简单的 Rust 应用程序项目,包含一个 main() 函数。

  5. rsnltk依赖项添加到Cargo.toml文件中,保持最新版本。

  6. toml文件中添加rsnltk依赖项后,使用以下Rust代码安装必要的语言模型,这是您首次使用此包时。

fn init_rsnltk_and_test(){
    // 1. first install the necessary language models 
    // using language codes
    let list_lang=vec!["en","zh"]; 
    //e.g. you install two language models, 
    // namely, for English and Chinese text analysis.
    download_langs(list_lang);
    // 2. then do test NLP tasks
    let text="I like Beijing!";
    let lang="en";
    // 2. Uncomment the below codes for Chinese NER
    // let text="我喜欢北京、上海和纽约!";
    // let lang="zh";
    let list_ner=ner(text,lang);
    for ner in list_ner{
        println!("{:?}",ner);
    }
}

或者,您可以通过Python编写的提供更多Stanza使用功能的ner-kit包手动安装这些语言模型。访问:ner-kit

如果在上述示例中没有发生错误,则表示它正常工作。最后,您可以尝试以下高级示例用法。

目前,我们测试了英语和中国语言模型的使用;然而,其他语言模型也应正常工作。

Stanza绑定示例

示例 1:词性分析

    fn test_pos(){
    //let text="我喜欢北京、上海和纽约!";
    //let lang="zh";
    let text="I like apple";
    let lang="en";
    let list_result=pos(text,lang);
    for word in list_result{
        println!("{:?}",word);
    }
}

示例 2:情感分析

    fn test_sentiment(){
        //let text="I like Beijing!";
        //let lang="en";
        let text="我喜欢北京";
        let lang="zh";
        let sentiments=sentiment(text,lang);
        for sen in sentiments{
            println!("{:?}",sen);
        }
    }

示例 3:命名实体识别

    fn test_ner(){
        // 1. for English NER
        let text="I like Beijing!";
        let lang="en";
        // 2. Uncomment the below codes for Chinese NER
        // let text="我喜欢北京、上海和纽约!";
        // let lang="zh";
        let list_ner=ner(text,lang);
        for ner in list_ner{
            println!("{:?}",ner);
        }
    }

示例 4:多语言分词

    fn test_tokenize(){
        let text="我喜欢北京、上海和纽约!";
        let lang="zh";
        let list_result=tokenize(text,lang);
        for ner in list_result{
            println!("{:?}",ner);
        }
    }

示例 5:句子分词

    fn test_tokenize_sentence(){
        let text="I like apple. Do you like it? No, I am not sure!";
        let lang="en";
        let list_sentences=tokenize_sentence(text,lang);
        for sentence in list_sentences{
            println!("Sentence: {}",sentence);
        }
    }

示例 6:语言识别

fn test_lang(){
    let list_text = vec!["I like Beijing!",
                         "我喜欢北京!", 
                         "Bonjour le monde!"];
    let list_result=lang(list_text);
    for lang in list_result{
        println!("{:?}",lang);
    }
}

示例 7:MWT扩展

    fn test_mwt_expand(){
        let text="Nous avons atteint la fin du sentier.";
        let lang="fr";
        let list_result=mwt_expand(text,lang);
    }

示例 8:估计WordNet中单词之间的相似度

您首先需要安装semantic-kit PyPI包!

    fn test_wordnet_similarity(){
        let s1="dog.n.1";
        let s2="cat.n.2";
        let sims=wordnet_similarity(s1,s2);
        for sim in sims{
            println!("{:?}",sim);
        }
    }

示例 9:从文本中获取依存关系树

fn test_dependency_tree(){
    let text="I like you. Do you like me?";
    let lang="en";
    let list_results=dependency_tree(text,lang);
    for list_token in list_results{
        for token in list_token{
            println!("{:?}",token)
        }

    }
}

纯Rust示例

示例 1:Word2Vec相似度

fn test_open_wv_bin(){
    let wv_model=wv_get_model("GoogleNews-vectors-negative300.bin");
    let positive = vec!["woman", "king"];
    let negative = vec!["man"];
    println!("analogy: {:?}", wv_analogy(&wv_model,positive, negative, 10));
    println!("cosine: {:?}", wv_cosine(&wv_model,"man", 10));
}

示例 2:文本摘要

    use rsnltk::native::summarizer::*;
    fn test_summarize(){
        let text="Some large txt...";
        let stopwords=&[];
        let summarized_text=summarize(text,stopwords,5);
        println!("{}",summarized_text);
    }

示例 3:从英文字符串中获取标记列表

use rsnltk::native::token::get_token_list;
fn test_get_token_list(){
        let s="Hello, Rust. How are you?";
        let result=get_token_list(s);
        for r in result{
            println!("{}\t{:?}",r.text,r);
        }
}

示例 4:对于没有单词之间空格的语言进行分词,例如中文文本。

我们在这个版本中实现了三种分词方法

  • 正向最大匹配(fmm),这是基线方法
  • 反向最大匹配(bmm),被认为更好
  • 双向最大匹配(bimm),高精度但速度慢
use rsnltk::native::segmentation::*;
fn test_real_word_segmentation(){
    let dict_path="30wdict.txt"; // empty if only for tokenizing
    let stop_path="baidu_stopwords.txt";// empty when no stop words
    let _sentence="美国太空总署希望,在深海的探险发现将有助于解开一些外太空的秘密,\
    同时也可以测试前往太阳系其他星球探险所需的一些设备和实验。";
    let meaningful_words=get_segmentation(_sentence,dict_path,stop_path, "bimm");
    // bimm can be changed to fmm or bmm. 
    println!("Result: {:?}",meaningful_words);
}

致谢

感谢斯坦福NLP小组Stanza上的辛勤工作。

许可证

Donghua Chen提供的带有MIT许可证的rsnltk库。

依赖关系

约7MB
~136K SLoC