如果我想学习一般的模式识别,从什么地方开始(推荐一本书)是一个好地方?
另外,是否有人对如何应用这些算法来查找程序中的抽象模式有任何经验/知识?(重复的代码,做同样事情但方式略有不同的代码块等)
谢谢
编辑:我不介意数学密集型书籍。事实上,那将是一件好事。
如果我想学习一般的模式识别,从什么地方开始(推荐一本书)是一个好地方?
另外,是否有人对如何应用这些算法来查找程序中的抽象模式有任何经验/知识?(重复的代码,做同样事情但方式略有不同的代码块等)
谢谢
编辑:我不介意数学密集型书籍。事实上,那将是一件好事。
如果您在数学上相当自信,那么 Chris Bishop 的“模式识别和机器学习”或“用于模式识别的神经网络”的任何一本书都非常适合学习模式识别。
如果您可以访问编译期间生成的解析树,它会有所帮助。通过这种方式,您可以查找相似的树片段,忽略比您正在查看的更深的节点,这样您可以选择例如将两个子表达式相乘的节点,忽略子表达式的内容表达式。您可以将相同的逻辑应用于节点集合,例如,您想找到两个子表达式的乘法,其中这两个子表达式是更多子表达式的加法。您首先查找乘法,然后检查乘法下方的两个节点是否是加法,忽略任何更深层次的内容。
如果您使用一种受支持的语言,IntelliJ idea 有一个非常智能的结构搜索和替换,可以满足您的问题。
您可以查看的另一个项目是Duplo - 它是一个开源/GPL 项目,因此您可以通过从SourceForge获取代码来研究他们的方法。
这是特定于 .Net 和 Visual Studio 的,但它会在您的项目中找到重复的代码。它确实报告了我发现的一些误报,但它可能是一个很好的起点。
一种模式是通过复制和粘贴方法克隆的代码。请参阅CloneDR了解一种工具,该工具通过比较相关语言的抽象语法树,自动找到此类代码,尽管布局发生变化,甚至克隆体发生变化。
CloneDR 适用于多种语言:C、C++、C#、Java、JavaScript、PHP、COBOL、Python,... 该网站显示了多种编程语言的克隆检测报告。