#nlp #edit-distance #linguistics #lemmatization #command-line #command-line-tool

bin+lib sesdiff

生成最短编辑脚本(Myers' diff 算法),指示如何从列 A 的字符串到列 B 的字符串。还提供编辑距离(levenshtein)。

7 个版本

0.3.0 2021 年 4 月 22 日
0.2.0 2021 年 4 月 21 日
0.1.5 2020 年 9 月 8 日
0.1.2 2020 年 8 月 14 日

#1690 in 文本处理

每月 44 次下载
用于 analiticcl

GPL-3.0+

38KB
651

Crate GitHub build GitHub release Project Status: Active – The project has reached a stable, usable state and is being actively developed.

sesdiff: 最短编辑脚本 Diff

描述

这是一个小型且快速的命令行工具和 Rust 库,它从标准输入读取两列制表符分隔的输入,并计算从列 A 的字符串到列 B 的字符串的最短编辑脚本(Myers' diff 算法)。它还计算编辑距离(即 levenshtein 距离)。

它被编写用来构建词元还原器。

安装

使用 Rust 的包管理器安装它

cargo install sesdiff

您的系统上还没有 cargo/rust 吗?在基于 Debian/ubuntu 的系统上,使用 sudo apt install cargo,在 mac 上使用 brew install rust,或者使用 rustup

此工具基于 Dissimilar 构建,它提供实际的 diff 算法(将自动下载和编译)。

用法

$ sesdiff < input.tsv

示例输入和输出(格式化以提高可读性,前两列对应于输入)。输出为四列制表符分隔格式

hablaron        hablar     =[hablar]-[on]                  2
contaron        contar     =[contar]-[on]                  2
pidieron        pedir      =[p]-[i]+[e]=[di]-[eron]+[r]    6
говорим         говорить   =[говори]-[м]+[ть]              3

默认情况下,将提供完整的编辑脚本,以简单语言表示

  • =[] - 方括号内的文本在字符串 A 和 B 中相同
    • =[#n] - 如果您使用 --abstract 参数,则将使用此参数,其中 n 表示表示 A 和 B 中相同文本长度的数字
  • -[] - 方括号内的文本被删除以到达字符串 B
  • +[] - 方括号内的文本被添加以到达字符串 B

为了词元化的目的,对于许多语言来说,从右到左查看后缀(去除常见的词首)是有意义的。传递--suffix选项,输出现在是

$ sesdiff --suffix < input.tsv
hablaron        hablar          -[on]                      2
contaron        contar          -[on]                      2
pidieron        pedir           -[eron]+[r]=[di]-[i]+[e]   6
говорим         говорить        -[м]+[ть]                  3

请注意,在后缀模式下,编辑脚本与正常模式不同(它们也从右边开始)。还有一个--prefix选项,用于去除常见的后缀。

使用--abstract参数可以得到一个略微更抽象的编辑脚本,它指的是未更改部分的长度而不是其内容。然后你会得到

pidieron        pedir           -[eron]+[r]=[#2]-[i]+[e]   6

Sesdiff也可以将编辑脚本应用到我们的输入中,使用--apply标志,并使用工具的制表符分隔输入,第一列是一个字符串,第二列是一个编辑脚本,如下例所示input2.tsv

$ cat input2.tsv
pidieron        -[eron]+[r]=[di]-[i]+[e]

按照以下方式运行sesdiff,将添加一个第三列包含解决方案

$ sesdiff --suffix --apply < input2.tsv
pidieron        -[eron]+[r]=[di]-[i]+[e]                pedir

在使用--apply时,您还可以使用额外的--infix参数来指示必须尝试将编辑脚本与字符串中的任何中缀匹配,包括多个。考虑以下示例,将所有字母a替换为o

$ cat input3.tsv
hahaha       -[a]+[o]

$ sesdiff --infix --apply < input3.tsv
hahaha       -[a]+[o]	hohoho

--apply模式下,您还可以通过使用|运算符,使编辑脚本适用于多个模式。这只允许用于删除(-[])和相等检查(=[]

$ cat input4.tsv
hihaho       -[a|i|o]+[e]

$ sesdiff --infix --apply < input4.tsv
hihaho       -[a|i|o]+[e]	hehehe

许可证

GNU通用公共许可证v3

依赖项

~1MB