#tantivy #stemmer #tokenizer #czech #full-text-search #search-engine

tantivy-czech-stemmer

捷克语词干提取器作为Tantivy分词器

2个不稳定版本

0.2.1 2024年5月1日
0.1.1 2024年4月28日

#552 in 文本处理

BSD-3-Clause

58KB
1.5K SLoC

Tantivy分词器 / 捷克语词干提取器

这个库捆绑了几个开源项目,以提供捷克语词干提取器作为Tantivy分词器。 Tantivy 是一个用Rust编写的全文搜索引擎库。由于其默认的 Stemmer 分词器依赖于一个已废弃的库 rust-stemmers,因此默认只能提供很少的语言。不过,Tantivy提供了一个简单的方式来构建我们自己的自定义分词器(详见 tantivy-tokenizer-api 以获取详细信息)。

此仓库将几个开源项目捆绑为1个库

  • 算法

    目前只有一个算法(包括 aggressivelight 变体)可用:Dolamic。这个算法由 Ljiljana Dolamic 和 Jacques Savoy 开发,并在BSD许可下发布。它用 Snowball语言 编写,可在 Snowball网站 上找到。

    还有另一个用于捷克语的词干提取算法:Hellebrand。这个算法由 David Hellebrand 和 Petr Chmelař 开发。它也用Snowball语言编写,并在这篇硕士论文中提供。然而,这个算法在GNU许可下发布,因此 我们没有将其包含在这个库中,因为我们希望保持这个库的BSD许可。(如果您愿意,您始终可以从Snowball编译 Hellebrand 算法到Rust,并自行包含它。)

  • rust-stemmers

    这个库(在Tantivy内部使用)为多种语言的Snowball算法实现了一个Rust接口。这个库受到了rust-stemmers的启发,并直接从rust-stemmers中提取了一些源代码(即src/snowball/*)。

  • Tantivy

    这个库中对分词器的实现基本上是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