我对机器学习是新手,但我想研究是否可以使用机器学习来比较两个源代码的抽象语法树(AST),以判断它们是否相似。
理想情况下,可以使用某个数据集进行训练,然后比较任意两个给定的AST来找出它们的相似之处。
有什么建议吗?
回答:
看起来你期望机器学习算法能够承担起发现两个AST之间相对“距离”的重任。这一点不太可能。相反,你可以考虑两个树的整体结构:它们在树的每一层是否具有相似的节点数量。如果它们确实如此——至少在树的主要部分——那么你可能希望定义两种“距离度量”方法中的一种来比较两个树:
-
不同节点值的数量
-
节点值的相对差异——也许是传统的Levenshtein距离……但更可能是理解特定语言语义的比较,以查看它们有多相似。例如,能够理解两个结构代表相同的语句,但可能存在不重要的空白或其他格式差异。或者可能是不同的变量名但相同的语义。
-
另一个额外的检查可能是定义有多少子树是相同的。然后对于不同的子树,定义一个空间度量,能够仅针对该子树找到结构上的相似性/差异
总结是:“整个问题没有现成的解决方案——但你可以利用现有的想法/算法来处理特定的局部情况”。