21 个版本
0.9.0 | 2024年7月25日 |
---|---|
0.8.11 | 2024年5月30日 |
0.8.8 | 2024年3月19日 |
0.8.5 | 2023年10月26日 |
0.5.1 | 2022年7月5日 |
#1 in #normalize
9,889 每月下载量
在 7 个crate中(4个直接使用)
2.5MB
7K SLoC
Charabia
Meilisearch 用于标记查询和文档的库
角色
标记器的角色是将一个句子或短语分成更小的语言单位,称为标记。它根据语言的特定性查找并检索字符串中的所有单词。
详细信息
Charabia 提供了一个简单的 API,通过检测其脚本/语言并为其选择专门的管道,来对特定语言的文本进行分割、规范化或标记(分割 + 规范化)。
支持的语言
Charabia 是多语言的,具有对以下语言的优化支持:
脚本/语言 | 专门的分割 | 专门的规范化 | 分割性能级别 | 标记性能级别 |
---|---|---|---|---|
拉丁 | ✅ CamelCase 分割 | ✅ 兼容性分解 + 小写 + 非间距标记 删除 + Ð vs Đ 欺骗规范化 |
🟩 ~23MiB/sec | 🟨 ~9MiB/sec |
希腊 | ❌ | ✅ 兼容性分解 + 小写 + 最终 sigma 规范化 | 🟩 ~27MiB/sec | 🟨 ~8MiB/sec |
西里尔 - 格鲁吉亚 | ❌ | ✅ 兼容性分解 + 小写 | 🟩 ~27MiB/sec | 🟨 ~9MiB/sec |
中文 CMN 🇨🇳 | ✅ jieba | ✅ 兼容性分解 + kvariant 转换 | 🟨 ~10MiB/sec | 🟧 ~5MiB/sec |
希伯来语 🇮🇱 | ❌ | ✅ 兼容性分解 + 非间距标记 删除 | 🟩 ~33MiB/sec | 🟨 ~11MiB/sec |
阿拉伯语 | ✅ ال 分割 |
✅ 兼容性分解 + 非间距标记 移除 + [Tatweel, Alef, Yeh, 和 Taa Marbuta 正规化] | 🟩 ~36MiB/秒 | 🟨 ~11MiB/sec |
日语 🇯🇵 | ✅ lindera IPA词典 | ❌ 兼容性分解 | 🟧 ~3MiB/秒 | 🟧 ~3MiB/秒 |
韩语 🇰🇷 | ✅ lindera KO词典 | ❌ 兼容性分解 | 🟥 ~2MiB/秒 | 🟥 ~2MiB/秒 |
泰语 🇹🇭 | ✅ 基于词典 | ✅ 兼容性分解 + 非间距标记 删除 | 🟩 ~22MiB/秒 | 🟨 ~11MiB/sec |
柬埔寨语 🇰🇭 | ✅ 基于词典 | ✅ 兼容性分解 | 🟧 ~7MiB/秒 | 🟧 ~5MiB/sec |
我们旨在提供全球语言支持,您的反馈帮助我们更接近这一目标。[了解如何提高我们的语言支持](https://docs.meilisearch.com/learn/advanced/language.html#improving-our-language-support)。如果您在搜索结果或文档处理方式中注意到不一致,请在我们的GitHub仓库中提出问题。
如果您有charabia不支持的特殊需求,请通过创建专用讨论在我们的产品仓库中分享。
关于性能级别
性能基于分词器的吞吐量(MiB/秒)(在scaleway Elastic Metal服务器EM-A410X-SSD - CPU: Intel Xeon E5 1650 - RAM: 64 Go)上使用jemalloc计算
- 0️⃣⬛️: 0 -> 1 MiB/秒
- 1️⃣🟥: 1 -> 3 MiB/秒
- 2️⃣🟧: 3 -> 8 MiB/秒
- 3️⃣🟨: 8 -> 20 MiB/秒
- 4️⃣🟩: 20 -> 50 MiB/秒
- 5️⃣🟪: 50 MiB/秒或更多
示例
分词
use charabia::Tokenize;
let orig = "Thé quick (\"brown\") fox can't jump 32.3 feet, right? Brr, it's 29.3°F!";
// tokenize the text.
let mut tokens = orig.tokenize();
let token = tokens.next().unwrap();
// the lemma into the token is normalized: `Thé` became `the`.
assert_eq!(token.lemma(), "the");
// token is classfied as a word
assert!(token.is_word());
let token = tokens.next().unwrap();
assert_eq!(token.lemma(), " ");
// token is classfied as a separator
assert!(token.is_separator());
分割
use charabia::Segment;
let orig = "The quick (\"brown\") fox can't jump 32.3 feet, right? Brr, it's 29.3°F!";
// segment the text.
let mut segments = orig.segment_str();
assert_eq!(segments.next(), Some("The"));
assert_eq!(segments.next(), Some(" "));
assert_eq!(segments.next(), Some("quick"));
依存关系
~6–12MB
~208K SLoC