4个版本 (破坏性)
0.4.0 | 2024年6月27日 |
---|---|
0.3.0 | 2024年6月1日 |
0.2.0 | 2024年5月4日 |
0.1.0 | 2024年5月2日 |
#131 在 文本处理 中
1MB
26K SLoC
Tantivy词干分词器(分词器)
此库捆绑了几个开源项目,以提供一组作为Tantivy分词器的各种语言的词干算法。 Tantivy 是一个用Rust编写的全文搜索引擎库。由于其默认的 Stemmer
分词器依赖于一个不活跃的库 rust-stemmers
,因此默认情况下只有很少的语言可用。尽管如此,Tantivy提供了一个简单的方法来构建我们自己的自定义分词器(有关详细信息,请参阅tantivy-tokenizer-api)。
此库将几个开源项目编译成一个库
-
此库中的所有原始算法都是用 Snowball 语言编写的,然后使用Snowball编译器编译成Rust代码。所有这些生成的算法都位于
src/snowball/algorithms/*
。然后需要一个Snowball 环境 来执行生成的算法。此环境由文件src/snowball/among.rs
和src/snowball/env.rs
组成 - 这两个文件已提供(即复制)自官方Snowball存储库:rust/src/snowball
。 -
此库中
Stemmer
的实现基本上是Tantivy库中Stemmer
分词器的原始实现的复制。只是这个库不依赖于rust-stemmers
包,而是包含各种算法。并且不是从tantivy
库导入,而是从这个库导入tantivy-tokenizer-api
。 -
算法
大多数(如果不是全部)词干算法都是从官方 Snowball网站 获取的,并使用Snowball编译器编译成Rust。有关各个算法许可的更多信息见下文 - 大多数都发布在BSD许可下。
Cargo功能
由于这个库捆绑了多个算法并包含大量生成的代码,我们希望在最终的构建中不必包含所有这些。因此,每个算法都作为一个Cargo功能发布。为了使用特定的算法,您必须首先安装相应的功能。如果您想使用例如Czech语言中的Dolamic算法的激进变体,您的Cargo.toml
应该如下所示
# ...
[dependencies]
tantivy-stemmers = { version = "0.3.0", features = ["default", "czech_dolamic_aggressive"] }
# ...
请参阅下文支持算法下的功能表。
使用方法
use tantivy::Index;
use tantivy::schema::{Schema, TextFieldIndexing, TextOptions, IndexRecordOption};
use tantivy::tokenizer::{LowerCaser, SimpleTokenizer, TextAnalyzer};
use tantivy_tokenizer_api::TokenFilter;
use tantivy_stemmers;
fn main() {
let mut schema_builder = Schema::builder();
schema_builder.add_text_field(
"title",
TextOptions::default()
.set_indexing_options(
TextFieldIndexing::default()
// Set name of the tokenizer, we will register it shortly
.set_tokenizer("lang_cs")
.set_index_option(IndexRecordOption::WithFreqsAndPositions),
)
.set_stored(),
);
let schema = schema_builder.build();
let index = Index::create_in_ram(schema.clone());
// Create an instance of the StemmerTokenizer
// With default algorithm (default algorithm is [`tantivy_stemmers::algorithms::english_porter_2`])
// let stemmer = tantivy_stemmers::StemmerTokenizer::default();
// With a specific algorithm
let stemmer = tantivy_stemmers::StemmerTokenizer::new(
tantivy_stemmers::algorithms::czech_dolamic_aggressive,
);
// Before we register it, we need to wrap it in an instance
// of the TextAnalyzer tokenizer.
// ❗️ We also have to transform the text to lowercase since
// the stemmer expects lowercase.
let tokenizer = TextAnalyzer::builder(
stemmer.transform(LowerCaser.transform(SimpleTokenizer::default())),
).build();
// Register our tokenizer with Tantivy under a custom name
index.tokenizers().register("lang_cs", tokenizer);
}
支持算法
可用的Cargo功能列表
功能 | 默认 | 语言 | 备注 |
---|---|---|---|
arabic |
- | 阿拉伯语 | |
armenian_mkrtchyan |
- | 亚美尼亚语 | |
basque |
- | 巴斯克语 | |
catalan |
- | 加泰罗尼亚语 | |
czech_dolamic_aggressive |
- | 捷克语 | |
czech_dolamic_light |
- | 捷克语 | |
danish |
- | 丹麦语 | |
dutch |
- | 荷兰语 | |
english_lovins |
- | 英语 | |
english_porter |
- | 英语 | Porter已被弃用,以支持Porter 2 |
english_porter_2 |
👈 这个 | 英语 | |
estonian_freienthal |
- | 爱沙尼亚语 | |
finnish |
- | 芬兰语 | |
french |
- | 法语 | |
german |
- | 德语 | |
greek |
- | 希腊语 | |
hindi_lightweight |
- | 印地语 | |
hungarian |
- | 匈牙利语 | |
indonesian_tala |
- | 印度尼西亚语 | |
irish_gaelic |
- | 爱尔兰语 | |
italian |
- | 意大利语 | |
lithuanian_jocas |
- | 立陶宛语 | |
nepali |
- | 尼泊尔语 | |
norwegian_bokmal |
- | 挪威语 | |
polish_yarovoy |
- | 波兰语 | 非Snowball算法 |
polish_yarovoy_unaccented |
- | 波兰语 | 非Snowball算法;除了词干提取外,此算法还删除了重音 |
portuguese |
- | 葡萄牙语 | |
romanian_heidelberg |
- | 罗马尼亚语 | |
romanian_tirdea |
- | 罗马尼亚语 | |
罗马尼亚语 |
- | 罗马尼亚语 | |
russian |
- | 俄语 | |
spanish |
- | 西班牙语 | |
swedish |
- | 瑞典语 | |
turkish_cilden |
- | 土耳其语 | |
yiddish_urieli |
- | 意第绪语 |
关于个别算法及其来源的说明
-
阿拉伯语
阿拉伯语Snowball算法是由Assem Chelli和Abdelkrim Aries开发的。其源代码已从官方的Snowball GitHub仓库中根据BSD许可证获取。
-
亚美尼亚语
亚美尼亚语Snowball算法是由Astghik Mkrtchyan开发的,源代码已根据BSD许可证从官方的Snowball网站获取。
-
巴斯克语
巴斯克语Snowball算法是根据BSD许可证从官方的Snowball网站获取的。
-
加泰罗尼亚语
加泰罗尼亚语Snowball算法是根据BSD许可证从官方的Snowball网站获取的。
-
捷克语
目前只有单个算法(在
aggressive
和light
变体中)可用:Dolamic
。此算法由Ljiljana Dolamic & Jacques Savoy开发,并在BSD许可证下发布。它是用Snowball语言编写的,并在Snowball网站上提供。捷克语有另一种词干算法:
Hellebrand
。此算法由 David Hellebrand 和 Petr Chmelař 开发。它也用 Snowball 语言编写,可在以下链接找到硕士学位论文。然而,此算法是在 GNU 许可下发布的,因此 我们没有将其包含在这个库中,因为我们想保持库的 BSD 许可证。(如果您愿意,您可以始终从 Snowball 编译Hellebrand
算法到 Rust,并自行包含它。) -
丹麦语
丹麦的 Snowball 算法是在 BSD 许可下从官方 Snowball 网站获得的。
-
荷兰语
荷兰的 Snowball 算法是在 BSD 许可下从官方 Snowball 网站获得的。
-
英语
Snowball 网站上提供三个英语算法 - Porter、Porter 2 和 Lovins。前两个算法由 Dr. Martin Porter 开发。Porter 算法(原始版)在此库中用作默认算法。如果您愿意,您可以指定使用较新的 Porter 2 算法(
Algorithm::EnglishPorter2
)或 Lovins 算法(Algorithm::EnglishLovins
)。 -
爱沙尼亚语
爱沙尼亚的 Snowball 算法由 Linda Freienthal 于 2019 年开发,并在 BSD 许可下从官方 Snowball 网站获得。
-
芬兰语
芬兰的 Snowball 算法是在 BSD 许可下从官方 Snowball 网站获得的。
-
法语
法国的 Snowball 算法是在 BSD 许可下从官方 Snowball 网站获得的。
-
德语
德国的 Snowball 算法是在 BSD 许可下从官方 Snowball 网站获得的。
-
希腊语
希腊的 Snowball 算法由 Georgios Ntais 于 2006 年开发,并在 2008 年由 Spyridon Saroukos 进行了增强。源代码是在 BSD 许可下从官方 Snowball 网站获得的。
-
印地语
印地语(轻量级)Snowball 算法由 A. Ramanathan 和 D. Rao 于 2003 年开发。其源代码是在 BSD 许可下从官方 Snowball 网站获得的。
-
匈牙利语
匈牙利的 Snowball 算法是在 BSD 许可下从官方 Snowball 网站获得的。
-
印度尼西亚语
印度尼西亚的 Snowball 算法由 Fadillah Z. Tala 于 2003 年开发,其源代码是在 BSD 许可下从官方 Snowball 网站获得的。
-
爱尔兰(盖尔语)
爱尔兰(盖尔语)Snowball 算法是在 BSD 许可下从官方 Snowball 网站获得的。
-
意大利语
意大利的 Snowball 算法是在 BSD 许可下从官方 Snowball 网站获得的。
-
立陶宛语
立陶宛的 Snowball 算法(
LithuanianJocas
)由 Dainius Jocas 贡献。其源代码是在 BSD 许可下从官方 Snowball 网站获得的。 -
尼泊尔语
尼泊尔雪球算法(
LithuanianJocas
)由Dainius Jocas贡献。其源代码已从官方Snowball网站获得,许可协议为BSD许可。尼泊尔雪球算法由<强>Ingroj Shrestha强>、<强>Oleg Bartunov强>和<强>Shreeya Singh强>开发。其源代码已从官方Snowball GitHub仓库获得。 -
挪威(博克马尔语)
挪威(博克马尔语变体)雪球算法已从官方Snowball网站获得BSD许可。
-
波兰语
虽然波兰语有几个不同的词干算法,但Snowball语言中尚未实现单个波兰语(开源)词干算法。特别是,最受欢迎的词干算法Stempel是用Java实现的。还有其移植到Python和Go的版本。
该库中有一个波兰语词干算法,包含2个变体:
polish_yarovoy
和polish_yarovoy_unaccented
。它由<强>Nikolay Yarovoy强>从Go实现移植到Rust,而该实现又受到了Python实现的启发,后者由<强>Błażej Kubiński强>完成。
此算法有两个变体:polish_yarovoy
对波兰语单词进行词干处理,同时保留重音符号,而polish_yarovoy_unaccented
对波兰语单词进行词干处理,并去除所有重音符号。 -
葡萄牙语
葡萄牙语雪球算法已从官方Snowball网站获得BSD许可。
-
罗马尼亚语
有三种罗马尼亚语雪球算法可供使用:
Romanian
、RomanianHeidelberg
和RomanianTirdea
。所有算法都从官方Snowball网站和Snowball网站获得BSD许可。RomanianHeidelberg
算法于2006年由<强>Marina Stegarescu强>、<强>Doina Gliga强>和<强>Erwin Glockner强>在海德堡鲁普雷希特-卡尔大学(计算语言学系)开发。RomanianTirdea
由<强>Irina Tirdea强>于2006年开发。 -
俄语
俄语雪球算法已从官方Snowball网站获得BSD许可。
-
西班牙语
西班牙语雪球算法已从官方Snowball网站获得BSD许可。
-
瑞典语
瑞典语雪球算法已从官方Snowball网站获得BSD许可。
-
土耳其语
土耳其语雪球算法由<强>Evren (Kapusuz) Çilden强>于2007年开发。源代码已从官方Snowball网站获得BSD许可。
Snowball网站备注
土耳其语词干算法由Evren Kapusuz Cilden提供。它仅处理名词和名词动词后缀,因为名词词干对于信息检索更重要,只处理这些可以显著简化算法。
在上述论文中,Evren解释说
词干器可以增强以处理所有类型的动词后缀。在土耳其语中,有五十多个后缀可以附加到动词上[2]。动词后缀的形态结构比名词后缀更复杂。尽管如此,可以使用本文中提出的方法论来增强词干器,以找到所有类型土耳其语单词的词干。
-
意第绪语
Yiddish Snowball算法由Assaf Urieli于2020年创建,并从官方Snowball网站获得了BSD许可证。
依赖项
~2.2–3.5MB
~80K SLoC