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 在 文本处理
每月 305 次下载
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_sensitive
和 case_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