【问题标题】:fuzzy regex matching in julia朱莉娅中的模糊正则表达式匹配
【发布时间】:2016-06-20 23:43:26
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 这里需要正则表达式吗?对于一般的正则表达式来说,这听起来像是一个困难的(计算上的)问题。
  • 我可能不需要它。我首先使用此处列出的代码解决了此问题以进行精确匹配,现在我尝试允许在 input_string 中接受拼写错误。

标签: julia fuzzy-comparison


【解决方案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 规范化来规范化具有相似“人类”外观的字符串。这对于模糊匹配非常有用:

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

【讨论】:

  • 这很有帮助,但是,在我的情况下,我试图在我的文本中找到的单词可能有空格,因为它可能是一个短语。您可以建议对此进行任何修改吗?
  • @Aaron 如果针是一个普通的旧字符串(没有像 *() 这样的正则表达式字符),你可以做一个“技巧”:计算 levenshtein(needle, haystack) 并检查它是否小于length(haystack) - length(needle) + n。 (至少必须删除 length(haystack) - length(needle) 字符才能从大海捞针到针,然后可能最多到 n 进一步操作。)无论针中有什么字符,这都有效。
  • 我认为这将非常适合我的需求。我要添加的一项修改是根据length of needle 稍微改变n
  • 谢谢@FengyangWang。 @Aaron,好电话。我个人使用fuzzy(needle, haystack, round(Int, length(needle) * (3/4)))
猜你喜欢
  • 2018-11-27
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
相关资源
最近更新 更多