对大量文档进行重复数据删除 (Python)
Deduplicate a large set of documents (Python)
有没有人知道或指出了一种检查新文档是否已存在于大量文档中的方法?文档集只会在添加新的唯一文档时发生变化,所以我在想也许可以使用文档签名来避免 1-1 比较?
谢谢!
一种相对快速的方法是为您的集合中的每个文档存储一个哈希值,可能是 MD5 或您选择的一个(Python 现在甚至提供 BLAKE2)。如果文档集很大,您可能希望将这些值存储在数据库中,但现在为了简单起见,我假设我们将它们放在字典中,哈希作为键,相应文件名的列表作为值(我们可能会发生冲突,因此列表)。
因此,当您需要检查新文档时,只需计算其哈希值,并检查它是否已在字典中。如果不是,则您确定该文档是新文档;如果是,则可能是冲突,所以你需要对相关文档进行全文比较。
示例代码:
from hashlib import md5
def check_new(f):
with open(f) as newfile:
newtxt = newfile.read()
h = md5(newtxt).hexdigest()
if h not in store:
print('adding...')
else:
for colliding in store[h]:
with open(colliding) as oldfile:
oldtxt = oldfile.read()
if newtxt == oldtxt:
break
else:
print('adding...')
请注意:哈希函数适用于 bytes
,因此您需要 encode/decode 您的文本
有没有人知道或指出了一种检查新文档是否已存在于大量文档中的方法?文档集只会在添加新的唯一文档时发生变化,所以我在想也许可以使用文档签名来避免 1-1 比较?
谢谢!
一种相对快速的方法是为您的集合中的每个文档存储一个哈希值,可能是 MD5 或您选择的一个(Python 现在甚至提供 BLAKE2)。如果文档集很大,您可能希望将这些值存储在数据库中,但现在为了简单起见,我假设我们将它们放在字典中,哈希作为键,相应文件名的列表作为值(我们可能会发生冲突,因此列表)。
因此,当您需要检查新文档时,只需计算其哈希值,并检查它是否已在字典中。如果不是,则您确定该文档是新文档;如果是,则可能是冲突,所以你需要对相关文档进行全文比较。
示例代码:
from hashlib import md5
def check_new(f):
with open(f) as newfile:
newtxt = newfile.read()
h = md5(newtxt).hexdigest()
if h not in store:
print('adding...')
else:
for colliding in store[h]:
with open(colliding) as oldfile:
oldtxt = oldfile.read()
if newtxt == oldtxt:
break
else:
print('adding...')
请注意:哈希函数适用于 bytes
,因此您需要 encode/decode 您的文本