数据复制优化

数据挖掘 数据 数据清理
2022-03-12 21:21:02

我正在python3清理数据。我有大量使用beautiful soup. 许多文件可能是重复的音乐作品。我可以更改 midis 的键,使它们相同并将乐器更改为钢琴(它们是单音文件)。

因此,应该可以检查歌曲内容(根据 midi 编码)是否相似。它特别紧迫,因为某些文件上只有数字作为名称。因此,需要明确的是,我必须检查文件的内容是否重复。另外,我不是在寻找精确匹配,我只是在寻找相似度百分比。

我目前的方法是使用 Difflib 中的 SequenceMatcher。我正在检查每个单独文件上的 600 缓冲区是否具有 >.9 的 SequenceMatcher 比率然后,我正在标记它们,以便我可以通过聆听它们来比较重复项。

这种方法适用于带有 MIDI 格式歌曲的测试场景。但是,它非常缓慢。所以,我想知道是否有人以前遇到过这个问题。任何人都可以提供有关优化此算法以比较文件或并行代码以提高速度或除散列之外的任何其他方法的任何见解(我不是在寻找精确的文件匹配)。任何帮助,将不胜感激。

这是我的代码:

import sys
import os
import hashlib
from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

count=0
for dirName, subdirs, fileList in os.walk('path to my directory of files'):
    print('Scanning %s...' % dirName)
    for filename in fileList:
        path = os.path.join(dirName, filename)
        in_file = open(path, 'rb')  # Provide a path to disk or ISO image
        data = in_file.read(600)
        in_file.close()
        for filename2 in fileList:
            path = os.path.join(dirName, filename2)
            in_file2 = open(path, 'rb')
            data2 = in_file2.read(600)
            in_file2.close()
            if filename==filename2:
                pass
            else:
                s=similar(data,data2)
                if s>0.9:
                    print(filename +filename2+" "+str(s))

`

1个回答

如果您只寻找文件的相同副本,那么您可以计算每个文件上的 md5sum 之类的哈希值并进行比较,这比分析内容要快得多。

如果您正在寻找相似性度量,那么我认为您应该能够使用比 SequenceMatcher 使用的算法更快的算法,后者可以找到最长的完全匹配序列,平均需要二次时间。我建议您查看其他相似性指标,例如 Levenshtein 或 Hamming 距离,它们的计算速度会更快。