2个不稳定版本
0.2.1 | 2024年5月1日 |
---|---|
0.1.1 | 2024年4月28日 |
#552 in 文本处理
58KB
1.5K SLoC
Tantivy分词器 / 捷克语词干提取器
这个库捆绑了几个开源项目,以提供捷克语词干提取器作为Tantivy分词器。 Tantivy 是一个用Rust编写的全文搜索引擎库。由于其默认的 Stemmer
分词器依赖于一个已废弃的库 rust-stemmers
,因此默认只能提供很少的语言。不过,Tantivy提供了一个简单的方式来构建我们自己的自定义分词器(详见 tantivy-tokenizer-api 以获取详细信息)。
此仓库将几个开源项目捆绑为1个库
-
算法
目前只有一个算法(包括
aggressive
和light
变体)可用:Dolamic
。这个算法由 Ljiljana Dolamic 和 Jacques Savoy 开发,并在BSD许可下发布。它用 Snowball语言 编写,可在 Snowball网站 上找到。还有另一个用于捷克语的词干提取算法:
Hellebrand
。这个算法由 David Hellebrand 和 Petr Chmelař 开发。它也用Snowball语言编写,并在这篇硕士论文中提供。然而,这个算法在GNU许可下发布,因此 我们没有将其包含在这个库中,因为我们希望保持这个库的BSD许可。(如果您愿意,您始终可以从Snowball编译Hellebrand
算法到Rust,并自行包含它。) -
这个库(在Tantivy内部使用)为多种语言的Snowball算法实现了一个Rust接口。这个库受到了
rust-stemmers
的启发,并直接从rust-stemmers
中提取了一些源代码(即src/snowball/*
)。 -
这个库中对分词器的实现基本上是Tantivy库中
Stemmer
分词器的原始实现的复制品。不过,这里提供了捷克语的不同算法,而不是不同语言的算法。并且,这个库是从tantivy
库中导入的,而不是从tantivy-tokenizer-api
中导入的。
使用方法
use tantivy::Index;
use tantivy::schema::{Schema, TextFieldIndexing, TextOptions, IndexRecordOption};
use tantivy::tokenizer::{LowerCaser, SimpleTokenizer, TextAnalyzer};
use tantivy_czech_stemmer;
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 Czech stemmer tokenizer
// With default algorithm (Dolamic aggressive)
let stemmer_tokenizer = tantivy_czech_stemmer::tokenizer::Stemmer::default();
// With a specific algorithm
// let stemmer_tokenizer = tantivy_czech_stemmer::tokenizer::Stemmer::new(
// tantivy_czech_stemmer::tokenizer::Algorithm::DolamicLight,
// );
// Before we register it, we need to wrap in an instance
// of the TextAnalyzer tokenizer. We also have to transform
// the text to lowercase since our stemmer expects lowercase.
let czech_tokenizer = TextAnalyzer::builder(
stemmer_tokenizer.transform(
LowerCaser.transform(SimpleTokenizer::default())
),
).build();
// Register the tokenizer with Tantivy
index.tokenizers().register("lang_cs", czech_tokenizer);
}
依赖关系
~0.4–1MB
~22K SLoC