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 每月下载量
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
。
安装
-
请确保您已安装 Python 3.6.6+ 和 PIP 环境。在终端中输入
python -V
应该不会打印错误消息; -
安装我们的基于 Python 的 ner-kit (版本>=0.0.5a2),以便通过
pip install ner-kit==0.0.5a2
绑定Stanza
包; -
然后,Rust 也应该安装在您的计算机上。我使用 IntelliJ 来开发基于 Rust 的应用程序,您可以在其中编写 Rust 代码;
-
创建一个简单的 Rust 应用程序项目,包含一个
main()
函数。 -
将
rsnltk
依赖项添加到Cargo.toml
文件中,保持最新版本。 -
在
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);
}
致谢
许可证
由Donghua Chen提供的带有MIT许可证的rsnltk
库。
依赖关系
约7MB
~136K SLoC