#tokenizer #normalize #segmenter #tokenize #language

charabia

一个简单的库,用于检测语言、标记文本并规范化标记

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

Download history 3458/week @ 2024-04-21 3718/week @ 2024-04-28 3560/week @ 2024-05-05 3219/week @ 2024-05-12 3843/week @ 2024-05-19 3410/week @ 2024-05-26 3809/week @ 2024-06-02 3758/week @ 2024-06-09 3609/week @ 2024-06-16 3688/week @ 2024-06-23 3033/week @ 2024-06-30 2835/week @ 2024-07-07 2731/week @ 2024-07-14 2477/week @ 2024-07-21 2616/week @ 2024-07-28 1875/week @ 2024-08-04

9,889 每月下载量
7crate中(4个直接使用)

MIT 许可证

2.5MB
7K SLoC

Rust 4.5K SLoC // 0.1% comments F* 2.5K SLoC // 0.4% comments Shell 7 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