比较Python中两个java文件的相似性

时间:2013-12-15 23:23:59

标签: java python

我希望能够将多个文件(最多30个)相互比较,以便找到某种程度的相似性。它不需要是完美的我只是想要某种红旗,如果两个文件非常相似。有什么好办法可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式(通常称为正则表达式:python regex docs)。使用分组,您可以找到变量和函数名称,唯一的代码行(不是空格或注释的行)等。

但是,创建一个足够智能的系统可以非常难以检测到相似之处。如果您有某种方法可以获得两个文件中0到1之间的数字及其相似性,则可以在高阈值下对其进行测试。任何超过阈值的东西(例如,0.97)都可能被认为是可疑的。

除了查看物理代码外,您还可以观察文件中的代码密度。想象一下,如果您打印出一页代码并将其旋转90度。您基本上可以获得每个文件的行数图表。使用它,您可以观察有峰和谷的位置,以查看代码的密度更高或更低。两个类似的文件可能具有相同或非常接近的代码密度。此外,使用此方法,您不必担心查找与您不是那么看代码本身相同的变量或函数名称,而是查看它是如何组织的

答案 1 :(得分:1)

充实@ mgilson的评论,这是一个非常简单的开始:

def file_similarity(path1, path2):
    "Return float in [0., 1.] giving some measure of file similarity."
    import difflib
    with open(path1, "rb") as f1, open(path2, "rb") as f2:
        s = difflib.SequenceMatcher(
                lambda ch: ch in " \t",  # don't sync on blanks or tabs
                f1.read(),
                f2.read())
    return s.ratio()

阅读SequenceMatcher文档了解更多信息。特别是,如果要比较许多文件,则重用SequenceMatcher对象会更有效(请参阅set_seq1()set_seq2()方法)。如果您正在使用阈值,如建议的接受答案,请参阅real_quick_ratio()quick_ratio()方法以缩短时间。

为了获得更好的结果,我首先通过规范化转换来提供文件,主要是用空格替换制表符(制表符和空格与字符比较不同,比如'a'和{{1但是这种区别对人眼来说是不可见的)。删除所有空白行也可能有所帮助。