#tantivy #tokenizer #stemmer

tantivy-stemmers

一组Tantivy词干分词器

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文本处理

BSD-3-Clause

1MB
26K SLoC

Tantivy词干分词器(分词器)

此库捆绑了几个开源项目,以提供一组作为Tantivy分词器的各种语言的词干算法。 Tantivy 是一个用Rust编写的全文搜索引擎库。由于其默认的 Stemmer 分词器依赖于一个不活跃的库 rust-stemmers,因此默认情况下只有很少的语言可用。尽管如此,Tantivy提供了一个简单的方法来构建我们自己的自定义分词器(有关详细信息,请参阅tantivy-tokenizer-api)。

此库将几个开源项目编译成一个库

  • snowballstem/snowball

    此库中的所有原始算法都是用 Snowball 语言编写的,然后使用Snowball编译器编译成Rust代码。所有这些生成的算法都位于 src/snowball/algorithms/*。然后需要一个Snowball 环境 来执行生成的算法。此环境由文件 src/snowball/among.rssrc/snowball/env.rs 组成 - 这两个文件已提供(即复制)自官方Snowball存储库:rust/src/snowball

  • Tantivy

    此库中 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 ChelliAbdelkrim Aries开发的。其源代码已从官方的Snowball GitHub仓库中根据BSD许可证获取。

  • 亚美尼亚语

    亚美尼亚语Snowball算法是由Astghik Mkrtchyan开发的,源代码已根据BSD许可证从官方的Snowball网站获取。

  • 巴斯克语

    巴斯克语Snowball算法是根据BSD许可证从官方的Snowball网站获取的。

  • 加泰罗尼亚语

    加泰罗尼亚语Snowball算法是根据BSD许可证从官方的Snowball网站获取的。

  • 捷克语

    目前只有单个算法(在aggressivelight变体中)可用: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. RamanathanD. 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实现的。还有其移植到PythonGo的版本。

    该库中有一个波兰语词干算法,包含2个变体:polish_yarovoypolish_yarovoy_unaccented。它由<强>Nikolay YarovoyGo实现移植到Rust,而该实现又受到了Python实现的启发,后者由<强>Błażej Kubiński完成。
    此算法有两个变体:polish_yarovoy对波兰语单词进行词干处理,同时保留重音符号,而polish_yarovoy_unaccented对波兰语单词进行词干处理,并去除所有重音符号。

  • 葡萄牙语

    葡萄牙语雪球算法已从官方Snowball网站获得BSD许可。

  • 罗马尼亚语

    有三种罗马尼亚语雪球算法可供使用:RomanianRomanianHeidelbergRomanianTirdea。所有算法都从官方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