朱莉娅中的模糊正则表达式匹配

fuzzy regex matching in julia

有没有办法在 Julia 中进行模糊正则表达式匹配?

我构建了以下正则表达式测试:

toMatch = Regex(word,"i")
ismatch(toMatch,input_string)

我希望能够进行此测试,但允许在匹配中有一定的自由度,并通过 Levenshtein 距离指定它。

我找到了可以计算距离的 Levenshtein 包,但不确定如何将其合并到此逻辑中。例如:

levenshtein("hello","hllo")`
> 1

(此答案与正则表达式无关,但涵盖了一些用例。)

我不知道这是否适用于您的用例。但看起来您正在尝试查找您的文本中是否有某个词(或相近的拼写错误)。如果文本之间用空格分隔,而你的单词不包含空格,你可以试试这样:

nopunct(s) = filter(c -> !ispunct(c), s)
nfcl(s) = normalize_string(s, decompose=true, compat=true, casefold=true,
                              stripmark=true, stripignore=true)
canonicalize(s) = nopunct(nfcl(s))
fuzzy(needle, haystack, n) = any(
    w -> levenshtein(w, canonicalize(needle)) < n,
    split(canonicalize(haystack)))

它的作用大致是:

nfcl 通过去除重音、忽略大小写和执行 unicode 规范化,对具有相似 "human" 外观的字符串进行规范化。这对于模糊匹配非常有用:

julia> nfcl("Ce texte est en français.")
"ce texte est en francais."

nopunct 去除标点符号,进一步简化字符串。

julia> nopunct("Hello, World!")
"Hello World"

canonicalize简单地结合了这两个转换。

然后我们检查大海捞针中的任何单词(由空格分隔)是否在针的 n 范围内。

示例:

julia> fuzzy("Robert", "My name is robrt.", 2)
true

julia> fuzzy("Robert", "My name is john.", 2)
false

这绝不是一个完整的解决方案,但它涵盖了很多常见的用例。对于更高级的用例,您应该更深入地研究 the subject