我希望能够比较多个文件(最多30个),以便找到某种程度的相似性。它不需要完美我只是想要某种红旗,如果两个文件异常相似。这将是一个好方法吗?比较Python中两个java文件的相似性
0
A
回答
1
您可以使用正则表达式(通常称为正则表达式:python regex docs)。使用分组,您可以找到变量和函数名称,唯一的代码行(非空白或注释的行)等。
但是,创建一个足够智能的系统,能够自行检测相似性可能非常困难。如果您有某种方法可以获得两个文件中0到1之间的数字及其相似性,则可以在较高的阈值下对其进行测试。任何超过阈值(比如说0.97)都可以被认为是可疑的。
除了查看物理代码外,还可以观察文件中的代码密度。想象一下,如果你打印出一页代码并将其转为90度。你基本上得到每个文件上的行数的图表。使用它,您可以观察哪里有峰和谷,以查看代码密度更高或更低的位置。两个相似的文件可能具有相同或非常接近的代码密度。此外,使用这种方法,您不必担心寻找变量或函数名称,因为您没有太在意代码本身,而是如何组织它们。
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
文档的更多。特别是,如果您有多个要比较的文件,重用对象(请参阅set_seq1()
和set_seq2()
方法)效率会更高。如果您使用阈值,正如接受的答案建议的那样,请参阅real_quick_ratio()
和quick_ratio()
方法以更多地缩短时间。
为了得到更好的结果,我首先通过规范化转换来提供文件,主要是用空格替换制表符(制表符和空格与字符比较的不同之处在于,比如'a'
和'/'
,但区别在于人眼不可见)。删除所有空白行可能也会有帮助。
相关问题
- 1. Python比较两个字符串的相似性列表
- 2. 比较两个英文字符串的相似性
- 3. Python字符串比较相似性
- 4. 比较python中的两个文件?
- 5. 比较两个NSStrings的相似度
- 6. 比较两个整数的相似
- 7. 比较java中的两个文件
- 8. 如何比较python中两个相似的句子字符串?
- 9. 如何比较两个树状图(R中)的“相似性”?
- 10. 比较两个文件并打印相似的行
- 11. 如何比较两个具有相似内容的文件
- 12. 比较两个CSV文件并搜索相似的项目
- 13. 在Python中比较两个大文件
- 14. 如何比较Java中两个多维数组之间的相似性
- 15. 比较两个文本文件相互
- 16. 如何比较2个MIDI文件的相似性?
- 17. 比较两个CSV文件的Python
- 18. 公制比较如何相似的两个二维线性线
- 19. 比较两个向量字符串的相似性C++
- 20. 比较两个结果集之间的相似性
- 21. 比较两个varchar字段的相似性
- 22. 比较csv文件中的两行 - Python
- 23. 自动比较两个系列 - 相似性测试
- 24. 比较两个OWL来确定相似性
- 25. 比较两个文件与Python
- 26. 使用python比较两个文件3
- 27. Python比较两个csv文件
- 28. 比较两个文件行与python
- 29. 比较两个文件使用Java
- 30. 在java中比较两个csv文件并做两次近似匹配
建造一个作弊探测器?我认为现在有这样的服务。 – user2357112
定义“*相似*”和“*异常相似*”。 –
你看过[difflib](http://docs.python.org/2/library/difflib.html)模块吗? – mgilson