python-如何检测文本文件中几乎重复的数量?
发布时间:2022-08-19 03:47:38 295
相关标签: # node.js
脚本的输出将是重复的类似序列的数量。最后,我只对DRY的度量(代码满足DRY原则的程度)感兴趣。
我天真地试图做一个简单的自相关,但很难找到合适的阈值。
u = open("find.c").read()
v = [ord(x) for x in u]
y = np.correlate(v, v, mode="same")
y = y[: int(len(y) / 2)]
x = range(len(y))
z = np.polyval(np.polyfit(x, y, 3), x)
f = (y - z)[: -5]
plt.plot(f)
plt.show();
所以我在考虑不同的策略......我还试图比较每一行之间的相似性,每组2行,每组3行......
import difflib
import numpy as np
lines = open("b.txt").readlines()
lines = [line.strip() for line in lines]
n = 3
d = []
for i in range(len(lines)):
a = lines[i:i+n]
for j in range(len(lines)):
b = lines[j:j+n]
if i == j: continue # skip same line
group_size = np.sum([len(x) for x in a])
if group_size < 5: continue # skip short lines
ratio = 0
for u, v in zip(a, b):
r = difflib.SequenceMatcher(None, u, v).ratio()
ratio += r if r > 0.7 else 0
d.append(ratio)
dry = sum(d) / len(lines)
在下文中,我们可以一目了然地发现一些重复:
w = int(len(d) / 100)
e = np.convolve(d, np.ones(w), "valid") / w * 10
plt.plot(range(len(d)), d, range(len(e)), e)
plt.show()
为什么不使用:
d = np.exp(np.array(d))
因此difflib
模块看起来很有前途SequenceMatcher
有魔法吗(Levenshtein?),但我也需要一些魔法常数(0.7
)... 但是,此代码是> O(n^2)
对于长文件,运行速度非常慢。
有趣的是,注意力集中的眼睛很容易识别重复的数量(很抱歉这个学生把他的代码当成了一个好的坏例子):
我相信还有一个更聪明的解决方案。
有什么提示吗?
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报