返回

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)对于长文件,运行速度非常慢。

有趣的是,注意力集中的眼睛很容易识别重复的数量(很抱歉这个学生把他的代码当成了一个好的坏例子):

我相信还有一个更聪明的解决方案。

有什么提示吗?

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(2)
按点赞数排序
用户头像