【问题标题】:Is this "string pattern matching" algorithm? Or something else?这是“字符串模式匹配”算法吗?或者是其他东西?
【发布时间】:2013-06-28 15:49:04
【问题描述】:

我什至不确定它是否称为模式匹配,但我想做一些类似于规则的事情:

我的“对象”具有“能力”属性,该属性是由空格分隔的名称序列。例如:

a.capability = "" // no pattern
b.capability = "foo"
c.capability = "bar"
d.capability = "foo bar"
e.capability = "bar lol truc bidule"

(假设每个对象必须具有与其他对象不同的模式)

然后我有一个全局上下文对象,它也有这样的属性:

context.capability = ""  // 1
// OR
context.capability = "foo"  // 2
// OR
context.capability = "bar"  // 3
// OR
context.capability = "bar foo"  // 4
// OR
context.capability = "lol"  // 5

现在,我们只想选择一个与上下文能力“最匹配”的唯一对象。 为此,我们遵循以下规则:

  1. 如果一个对象没有模式并且上下文没有模式,则选择该对象;
  2. 如果一个对象没有模式并且上下文有模式,如果没有其他对象匹配,则选择该对象;
  3. 如果一个对象与上下文具有完全相同的模式名称,则它被选中;
  4. 选择上下文模式中包含的模式名称计数最多的对象;

例如:

  • 在上下文案例 1) 中:a 将被选中;
  • 在上下文案例 2) 中:b 将被选中;
  • 在上下文案例 3) 中:c 将被选中;
  • 在上下文案例 4) 中:d 将被选中;
  • 在上下文案例 5) 中:e 将被选中;

我在写这篇文章时甚至没有测试这条规则是否有效,这只是我想要定义的草稿。

我的问题:

  1. 你怎么称呼这种算法? (让我可以用正确的名字做未来的研究)
  2. 是否已经定义了这样的规则?它看起来足够通用,以至于有人以前可以定义类似的规则,但除了定义重载规则的语言标准部分(如 C++ 标准)之外,我找不到类似的东西;
  3. 是否有研究探索此类算法/规则的属性?我不确定这是否是适合我的用例的正确方法,但它似乎可能是正确的解决方案。但是我没有实现这种语言功能的经验,所以我想看看一些关于我可能会遇到什么问题的数据(但到目前为止我找不到任何东西)。

一位朋友建议看一些关于人工智能、专家系统和语言设计器和编译器实现的书籍。但是,有关如何查找有关这种特定方式的数据的一些指导会很有帮助。

【问题讨论】:

  • 单词是否总是按给定的顺序书写?例如,bar 总是保证在 foo 之前出现吗?在上下文和对象中?如果不是,写入值的顺序是否重要?例如,“bar foo”是否等同于“foo bar”?我相信规则 4 意味着排序并不重要,只是想确认一下。
  • @ZeBlob 好问题。起初我认为不,这并不重要,但我还不知道添加顺序作为一种优先级的含义。既然你这么说,我记得 Valve 做过关于这类东西的演示。我将不得不寻找它。现在假设顺序并不重要,只有匹配的值才是重要的(就像它是一个值列表一样)。
  • 缺少很多问题上下文。你期望有多少个对象?有多少上下文?有多少不同的能力?您期望每个上下文有多少功能?每个对象有多少能力?上下文或对象是否可以多次列出相同的功能?查询的答案对象是否离上下文“太远”而无用?功能、上下文或对象在编译时是否已知?是否有可以进行预处理的设置阶段?你的目标是什么平台?你的绩效目标是什么? (内存与处理器)
  • 不要匆忙投反对票。请解释原因。
  • @Kaganar 1 到 N 个对象,1 个唯一上下文,每个对象/上下文 1 个能力,但它包含 0 到 n 个值(我应该将它呈现为值列表,这样想) .值本身并不重要,任何值都可以在任何对象或上下文的任何能力中。列表中重复的值被视为仅出现一次。我不明白太远的概念。但是,如果有多个匹配对象,可能会出现歧义,我认为描述中没有。不过,这个问题与您的所有问题无关。

标签: string algorithm language-agnostic pattern-matching


【解决方案1】:

我没有直接回答你的问题,但经过思考后,我可以通过多种方式来解决问题:

  • 文档检索(例如在搜索引擎中使用——它们如何如此快速地对分离查询进行排名?)
  • 非公制 nearest neighbor(链接是通用公制版本)
  • 0-1 linear programming

因此,我认为这个问题没有一个术语——它对太多领域来说太有趣了。这三个领域之间肯定有很多研究(例如 Google):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多