这个混合字符字符串如何在Unicode单词边界上拆分

7
考虑字符串"abc를"。根据Unicode的单词分割演示实现,该字符串应该被分成两个单词"abc""를"。然而,三种不同的Rust单词边界检测实现(regexunic-segmentunicode-segmentation)都不同意,并将该字符串分组成一个单词。哪种行为是正确的?
跟进一下,如果分组行为是正确的,那么有什么好的方法可以在大多数情况下尊重单词边界(用于检查字符串翻译的有效性)扫描该字符串以查找搜索词"abc"。我想匹配像"abc를"这样的东西,但不要匹配abcdef这样的东西。
1个回答

3
我不确定分词演示应该被视为真实情况,即使它在官方网站上。例如,它认为"abc를"("abc\uB97C")是两个单独的单词,但认为"abc를"("abc\u1105\u1173\u11af")是一个单词,尽管前者分解为后者。
"单词边界"的概念并非固定不变。Unicode有一个“Word Boundary”规范,概述了单词断点应该出现和不应出现的位置。然而,它还有一个广泛的“注释”部分,用于阐述其他情况(重点是我的)。
无法提供一套统一的规则来解决所有语言中的问题或处理给定语言中的所有歧义情况。此附录介绍的规范的目标是提供可行的默认设置;定制实现可以更加复杂。对于泰语、老挝语、高棉语、缅甸语和其他不通常在单词之间使用空格的脚本,良好的实现不应该依赖于默认的单词边界规范。它应该使用更复杂的机制,就像断行所要求的一样。表意文字(例如日语和汉语)更加复杂。如果没有更复杂的机制,则在没有空格的情况下编写韩文文本同样适用。然而,在缺乏更复杂机制的情况下,本附录中指定的规则提供了明确定义的默认值。

我的理解是,您列出的包是按照规范进行操作,而没有进行进一步的上下文分析。为什么演示与此相反我不得而知,但可能是试图实现其中的一个边缘情况。
为了解决您的具体问题,我建议使用 正则表达式\b 匹配单词边界。不幸的是,这遵循相同的 Unicode 规则,并不会将 "를" 视为一个新单词。然而,此正则表达式实现提供了一个逃生口,以回退到 ASCII 行为。只需使用 (?-u:\b) 来匹配非 Unicode 边界:
use regex::Regex;

fn main() {
    let pattern = Regex::new("(?-u:\\b)abc(?-u:\\b)").unwrap();
    println!("{:?}", pattern.find("some abcdef abc를 sentence"));
}

你可以在playground上运行它,测试你的案例并查看是否适用于你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接