【问题标题】:Pattern matching for strings independent from symbols独立于符号的字符串的模式匹配
【发布时间】:2015-06-06 06:26:02
【问题描述】:

我需要一种算法,该算法可以在数据中找到预定义的模式(以字符串的形式存在),而与数据和模式的实际符号/字符无关。我只关心符号之间的关系,而不关心符号本身。数据中的相同符号具有不同的模式符号也是合法的。模式匹配算法必须强制执行的唯一事情是保留模式中相同符号的多次出现。举个例子:

模式是abca,所以第一个和最后一个字母是一样的。对于我的应用程序,写它的等效方法是 1 2 3 1,其中数字只是变量。我拥有的数据是 thistextisatest。生成的算法应该在这里给我两个正确的匹配,texttest。因为只有在这两种情况下,第一个和第四个字母是相同的,就像在模式中一样。

作为第二个示例,模式 abcd 应返回 12 个匹配项(此文本中的每个位置一个匹配项)。由于模式中没有变量是重复的,所以它在任何地方都是平凡匹配的。即使在 texttest 的情况下,因为模式的变量 ad 是合法的映射到同一个符号。

该算法的目标应该是检测书面语言中的相似性。想象一下,有一本英语词典,并用 unseen 或等效的 1 2 3 4 4 2 模式对其进行解析。然后您会看到,例如,单词 belittle 包含相同的字母模式。

所以,既然我希望清楚我需要什么,我有一些问题:

  • 这个算法叫什么?这是一个众所周知的问题已经解决了吗?

  • 是否有关于此事的出版物?当您不知道正确的搜索词来将此问题与常规模式匹配区分开来时,真的很难找到任何有用的东西。

  • 是否有现成的实现方式?

我没有将正则表达式用于任何太复杂的事情,所以我不知道在正则表达式中是否有可能发生这样的事情,因为你基本上不关心符号本身,而只考虑它们出现的模式.

非常感谢您的帮助!

【问题讨论】:

  • 这很有趣。但是,您可以将所有这些与正则表达式匹配。首先,(.).{2}\1(或((.).{2}\2) 以更好地捕获文本)将返回“测试”和“文本”(regex101.com/r/cV7bD1/3),其次,(?=(.{4})) 将返回您感兴趣的 12 个匹配项(regex101.com/r/cV7bD1/2)。因此,重点可能是将模式转换为数字、检查重复数字并创建相应的正则表达式。
  • 我理解你的建议,但如果我必须从每个模式(其中将有数百万个模式)生成一个正则表达式,这对我来说似乎是最后的方法。当然,拥有某种可以处理所有实例的通配符正则表达式(或完全独立的算法)会更方便。

标签: regex algorithm language-agnostic pattern-matching


【解决方案1】:

我认为您在这里不需要正则表达式。您的搜索词:

unseen
123442

这有六个字符,因此将文本中的每个单词索引为 6-mers

贬低

12,12,12,12,11,12,12 2-mers
123,123,123,122,112,123 3-mers
1234,1234,1233,1223,1123 4-mers
12345,12344,12334,12234 5-mers
123455,123442,123321 6-mers

所以只要看看 6-mers,你就知道了。任何小于您的搜索词的 6 位数字也将是匹配项,以允许 abcd (1234) 大小写匹配 abca (1231) 单词。

因此,给定一个包含 n 个字符的搜索词,只需将每个单词拆分为其组成的 n-mers 并检查数字是否等于或小于。

【讨论】:

  • 感谢您的建议!您在示例中指出的是,无论数据有多少个字母,如果将其拆分为 n-mer,您将始终找到模式(变量编号相同)。我现在看到这也允许子模式匹配非常简单,因为您也可以构建模式的 n-mers。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
相关资源
最近更新 更多