Algorithm SQL语句的模式识别

Algorithm SQL语句的模式识别,algorithm,machine-learning,pattern-matching,pattern-recognition,Algorithm,Machine Learning,Pattern Matching,Pattern Recognition,我有一个文本模式匹配的问题,我可以使用一些方向。我不太熟悉模式识别,我不知道这是不是一个“哦,只是用一些废话”,或者这是一个非常困难的模式问题 我想做的一般性陈述是确定一系列SQL语句之间的相似性,以便允许我将这些语句重构为数量较少的存储过程或其他动态生成的SQL片段。比如说, SELECT MIN(foo) FROM bar WHERE baz > 123; SELECT MIN(footer) FROM bar; SELECT MIN(foo), baz FROM bar; 都是相同

我有一个文本模式匹配的问题,我可以使用一些方向。我不太熟悉模式识别,我不知道这是不是一个“哦,只是用一些废话”,或者这是一个非常困难的模式问题

我想做的一般性陈述是确定一系列SQL语句之间的相似性,以便允许我将这些语句重构为数量较少的存储过程或其他动态生成的SQL片段。比如说,

SELECT MIN(foo) FROM bar WHERE baz > 123;
SELECT MIN(footer) FROM bar;
SELECT MIN(foo), baz FROM bar;
都是相同的,但是我想知道MIN()中的值应该是一个可替换的值,我可能在SELECT列表中有另一列,或者有一个可选的WHERE子句。请注意,这个例子是高度虚构的,但我希望它能让您看到我在追求什么


就范围而言,我将有一组数千条SQL语句,我希望将它们减少到几十条(?)通用语句。在迄今为止的研究中,我遇到了w形木瓦和n形木片,并放弃了像“文字袋”这样的方法,因为排序很重要。从SQL领域来看,另一种说明此问题的方法可能是“给定一系列文本语句,可以用来重新组合这些语句的最小文本片段集是多少?”

问题有点太宽泛,但我建议尝试以下方法:

这听起来像是一个问题,您有一组文本(SQL语句),并且希望将它们聚集在一起,以确定其中一些语句是否彼此接近。这里的诀窍在于文本语句之间的距离度量。我想试试这样的东西

因此,一般而言,以下方法可能有效:

  • 对已有的sql语句进行一些预处理。标记化,从语句中删除一些单词等等。在这里要小心——你不仅仅是在分析一些自然语言文本,它是一个SQL语句,所以你需要一些聪明的方法
  • 然后,尝试编写一个函数来计算两个sql查询之间的距离。编辑距离应该适合您
  • 最后,尝试在所有SQL查询上运行文档集群,使用编辑距离作为集群算法的距离度量

希望这能有所帮助。

您真正想要的是在代码库中找到代码克隆

有很多方法可以做到这一点,但大多数方法似乎忽略了(SQL)语言带来的结构。这种结构使得查找具有概念意义的代码元素“更容易”,而不是说N-gram(是的,“fromx-WHERE”很常见,但在SQL中是一个笨拙的块)

我的基于抽象语法树(AST)的克隆检测方案将源文本解析为AST,然后找到共享树,这些树可以通过使用语言语法作为指导,以产生合理的泛化的方式进行参数化。看我的技术论文

关于OP的例子:

  • 它将识别MIN()中的值应该是可替换的值
  • 选择单例列可以扩展为列表
  • WHERE子句是可选的
它不会试图提出这些建议,除非它找到两个候选克隆体,它们在这些概括解释的方式上有所不同。它基本上通过从(SQL)语法中提取它们来获得泛化。OP的例子有足够多的变化来迫使这些概括


一项克隆检测技术调查()将这种方法列为30种不同克隆检测方法之首;见表14。

谢谢,这很有帮助。但我认为关于“代码克隆”的另一个答案更接近目标。这听起来非常符合我需要做的事情。你的论文和调查在指明方向方面非常有帮助。这也让我想看看代码差异工具,看看它们是如何工作的。为了完成这个想法,我还发现这个主题非常有用,这反过来又让我想到了这个C#实现:IMHO,最有趣的代码差异化工具使用了某种相同的基础技术,但作为克隆检测器的一种补充:它们比较抽象语法树,报告不同之处,而不是报告相同之处。在我的网站上查看“智能差异器”;这篇文章没有发表过,但你应该可以在scholar.google.com上找到关于抽象语法树差异的技术论文,他们同意语法和语义的价值,Ira。Diff方法对于我需要立即执行的操作非常有效,但是通过解析器运行SQL并以某种方式更智能地比较各个部分会更有价值。如果知道一段SQL在WHERE中有一个额外的列或额外的子句,那就太好了。但我需要将SQL输入到Microsoft的解析器(假设我能找到它)并使用输出(假设我能理解它)。但通过解析器运行SQL并以某种方式更智能地比较各个部分将更有价值。。。请参阅我的网站上的“智能差异器”。叹气