6 个版本

0.2.0 2024 年 6 月 15 日
0.1.0 2023 年 12 月 12 日
0.0.3 2023 年 10 月 4 日
0.0.0 2023 年 9 月 27 日

#429文本处理

Download history 49/week @ 2024-06-09 174/week @ 2024-06-16 16/week @ 2024-06-23 59/week @ 2024-06-30

每月 305 次下载

GPL-3.0-only

17KB
141

Flashtext2

此 crate 允许您非常高效地提取和替换字符串,性能优于使用正则表达式。

当您有一个非常大的关键词列表需要从文本中提取,并且需要替换许多值时,其性能特别出色。

工作原理

flashtext 算法使用 trie 来保存用户想要提取的所有关键词,一个关键词被定义为一系列标记,例如 "Hello world!" 变为: ["Hello", " ", "world", "!"]。在这个实现中,trie 中的每个节点包含一个标记(不是字符!)。
使用 Unicode 标准附件 #29 来分割标记。

时间复杂度

此算法的时间复杂度与 trie 中的关键词数量无关,而只与文档的长度有关!

快速开始

use flashtext2::case_sensitive::KeywordProcessor;

fn main() {
    let mut kp = KeywordProcessor::new();
    kp.add_keyword("love");
    kp.add_keyword("Rust");
    kp.add_keyword("Hello");

    assert_eq!(kp.len(), 3);

    // extract keywords
    let keywords_found: Vec<_> = kp
        .extract_keywords("Hello, I love programming in Rust!")
        .collect();
    assert_eq!(keywords_found, ["Hello", "love", "Rust"]);

    // extract keywords with span
    let keywords_with_span: Vec<_> = kp
        .extract_keywords_with_span("Hello, I love programming in Rust!")
        .collect();
    assert_eq!(keywords_with_span, [("Hello", 0, 5), ("love", 9, 13), ("Rust", 29, 33)]);

    // replace keywords
    let mut kp = KeywordProcessor::new();
    kp.add_keyword_with_clean_word("Hello", "Hey");
    kp.add_keyword_with_clean_word("love", "hate");
    kp.add_keyword_with_clean_word("Rust", "Java");

    let replaced_text = kp
        .replace_keywords("Hello, I love programming in Rust!");
    assert_eq!(replaced_text, "Hey, I hate programming in Java!");
}

不区分大小写

KeywordProcessor 结构体定义在两个模块中: case_sensitivecase_insensitive。这两个模块提供相同的方法和签名;然而,内部字符串存储不同。 case_insensitive 模块使用不区分大小写的 hashmap(case_insensitive_hashmap)。

use flashtext2::case_insensitive::KeywordProcessor;

let mut kp = KeywordProcessor::new();
kp.add_keywords_from_iter(["Foo", "Bar"]);

let text = "Foo BaR foO FOO";
let keywords: Vec<_> = kp
    .extract_keywords(text)
    .collect();
assert_eq!(keywords, ["Foo", "Bar", "Foo", "Foo"]);

unicase crate 准确处理和匹配关键词,尽管大小写和更复杂的字符存在变化。

use flashtext2::case_insensitive::KeywordProcessor;

let mut kp = KeywordProcessor::new();
let tokens = ["flour", "Maße", "ᾲ στο διάολο"];
kp.add_keywords_from_iter(tokens);

let text = "flour, MASSE, ὰι στο διάολο";
let found_tokens: Vec<_> = kp.extract_keywords(text).collect();
assert_eq!(found_tokens, tokens);

依赖项

~800KB
~13K SLoC