#nlp #library #text

wordcut-engine

词分割/断开库

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 中使用

Apache-2.0

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 有三个步骤

  1. 识别聚类,即不能分割的子字符串
  2. 识别分割有向无环图(split-DAG)的边缘;程序不会添加打破任何聚类的边到图中。
  3. 通过在 split-DAG 中找到最短路径来对字符串进行标记化

识别聚类

识别聚类识别哪些子字符串必须 分割。

  1. 用括号包裹正则表达式

例如,

[-][-][-]
[-][-][ะาำ]

上述规则用括号包裹,如下所示

([-])
([-][-])
([-][-][ะาำ])
  1. 使用垂直线(|)连接正则表达式

例如,

([-])|([-][-])|([-][-][ะาำ])
  1. 使用 regex-automata 从连接的正则表达式构建 DFA

  2. 通过使用 DFA 添加边来创建有向无环图(DAG)

  3. 根据上一步的 DAG 短路径识别聚类

注意:wordcut-engine 不允许上下文相关规则,因为它会严重影响性能。此外,我们不是使用最长匹配,而是使用 DAG 和其最短路径来约束另一个聚类边界,因此不需要 newmm 风格的上下文相关规则。

识别 split-DAG 边缘

与识别聚类相反,识别 split-DAG 边缘识别必须分割的内容。wordcut-engine 有三种 split-DAG 边缘制造者,分别是

  1. 字典基础制造者
  2. 基于规则的制造者
  3. 默认制造者(Unk 边缘构建器)

字典基础制造者遍历前缀树,在 wordcut-engine 中特别是一个 trie,并创建与前缀树中匹配的词匹配的边。基于规则的制造者使用由分割规则构建的 regex-automata 的 Regex 匹配器找到最长匹配的子字符串,并将相应的边添加到图中。wordcut-engine 删除打破聚类的边。以下是一些分割规则的示例

[\r\t\n ]+
[A-Za-z]+
[0-9]+
[-]+
[\(\)"'`\[\]{}\\/]

如果对于每个字符索引还没有边,则默认制造者创建一个连接已知的右边界边的边。

依赖关系

~4.5–6.5MB
~109K SLoC