17 个版本 (10 个稳定版本)
1.1.9 | 2024年5月12日 |
---|---|
1.1.8 | 2024年2月19日 |
1.1.7 | 2023年4月9日 |
1.1.5 | 2022年11月5日 |
0.2.0 | 2017年12月28日 |
#311 in 文本处理
在 2 crates 中使用
5.5MB
1K SLoC
已迁移至 https://codeberg.org/mekong-lang/wordcut-engine
wordcut-engine
Rust 中的词分割库
示例
use wordcut_engine::load_dict;
use wordcut_engine::Wordcut;
use std::path::Path;
fn main() {
let dict_path = Path::new(concat!(
env!("CARGO_MANIFEST_DIR"),
"/dict.txt"
));
let dict = load_dict(dict_path).unwrap();
let wordcut = Wordcut::new(dict);
println!("{}", wordcut.put_delimiters("หมากินไก่", "|"));
}
对于 Evcxr
将此项目作为依赖项加载
:dep .
导入符号
use wordcut_engine::load_dict;
use wordcut_engine::Wordcut;
use wordcut_engine::Dict;
use std::path::Path;
初始化
let dict: Dict = load_dict("data/thai.txt").unwrap();
let wordcut = Wordcut::new(dict);
运行
let txt = "หมากินไก่";
wordcut.put_delimiters(txt, "|")
wordcut.build_path(txt, &txt.chars().collect::<Vec<_>>())
dbg!(wordcut.build_path(txt, &txt.chars().collect::<Vec<_>>()));
算法
wordcut-engine 有三个步骤
- 识别聚类,即不能分割的子字符串
- 识别分割有向无环图(split-DAG)的边缘;程序不会添加打破任何聚类的边到图中。
- 通过在 split-DAG 中找到最短路径来对字符串进行标记化
识别聚类
识别聚类识别哪些子字符串必须 不 分割。
- 用括号包裹正则表达式
例如,
[ก-ฮ]็
[ก-ฮ][่-๋]
[ก-ฮ][่-๋][ะาำ]
上述规则用括号包裹,如下所示
([ก-ฮ]็)
([ก-ฮ][่-๋])
([ก-ฮ][่-๋][ะาำ])
- 使用垂直线(|)连接正则表达式
例如,
([ก-ฮ]็)|([ก-ฮ][่-๋])|([ก-ฮ][่-๋][ะาำ])
-
使用 regex-automata 从连接的正则表达式构建 DFA
-
通过使用 DFA 添加边来创建有向无环图(DAG)
-
根据上一步的 DAG 短路径识别聚类
注意:wordcut-engine 不允许上下文相关规则,因为它会严重影响性能。此外,我们不是使用最长匹配,而是使用 DAG 和其最短路径来约束另一个聚类边界,因此不需要 newmm 风格的上下文相关规则。
识别 split-DAG 边缘
与识别聚类相反,识别 split-DAG 边缘识别必须分割的内容。wordcut-engine 有三种 split-DAG 边缘制造者,分别是
- 字典基础制造者
- 基于规则的制造者
- 默认制造者(Unk 边缘构建器)
字典基础制造者遍历前缀树,在 wordcut-engine 中特别是一个 trie,并创建与前缀树中匹配的词匹配的边。基于规则的制造者使用由分割规则构建的 regex-automata 的 Regex 匹配器找到最长匹配的子字符串,并将相应的边添加到图中。wordcut-engine 删除打破聚类的边。以下是一些分割规则的示例
[\r\t\n ]+
[A-Za-z]+
[0-9]+
[๐-๙]+
[\(\)"'`\[\]{}\\/]
如果对于每个字符索引还没有边,则默认制造者创建一个连接已知的右边界边的边。
依赖关系
~4.5–6.5MB
~109K SLoC