add deduplicate.py
This commit is contained in:
parent
c7d916bf4f
commit
861f12d47a
68
datasets/deduplicate.py
Normal file
68
datasets/deduplicate.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
import json
|
||||||
|
from loguru import logger
|
||||||
|
import os
|
||||||
|
from datasketch import MinHash
|
||||||
|
from hashlib import md5
|
||||||
|
|
||||||
|
def is_json_file(filename):
|
||||||
|
return filename.endswith('.json')
|
||||||
|
|
||||||
|
# 绝对匹配
|
||||||
|
def is_duplicate_absolutely(d1, d2):
|
||||||
|
return md5(d1.encode('utf-8')).hexdigest() == md5(d2.encode('utf-8')).hexdigest()
|
||||||
|
|
||||||
|
# 使用MinHash生成器计算dict的签名
|
||||||
|
def hash_dict(dict_obj):
|
||||||
|
m = MinHash()
|
||||||
|
for key, value in sorted(dict_obj.items()):
|
||||||
|
# 对于非str类型值需要先转为str
|
||||||
|
m.update(str(value).encode('utf8'))
|
||||||
|
return m
|
||||||
|
|
||||||
|
# 使用绝对匹配和MinHash对dict列表去重
|
||||||
|
def deduplicate_json(data_list, threshold=0.8):
|
||||||
|
seen_hashes = []
|
||||||
|
duplicates_removed = []
|
||||||
|
|
||||||
|
for item in data_list:
|
||||||
|
# print(item)
|
||||||
|
# print('###########')
|
||||||
|
min_hash = hash_dict(item)
|
||||||
|
# print(f'min_hash: {min_hash}')
|
||||||
|
|
||||||
|
# 绝对匹配去重
|
||||||
|
if not any(is_duplicate_absolutely(str(item), str(existing)) for existing in duplicates_removed):
|
||||||
|
# MinHash相似性去重
|
||||||
|
has_similar = False
|
||||||
|
for stored_min_hash, stored_text in seen_hashes:
|
||||||
|
if stored_min_hash.jaccard(min_hash) > threshold:
|
||||||
|
has_similar = True
|
||||||
|
break
|
||||||
|
if not has_similar:
|
||||||
|
seen_hashes.append((min_hash,item))
|
||||||
|
duplicates_removed.append(item)
|
||||||
|
|
||||||
|
|
||||||
|
return duplicates_removed
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
data_ai = 'qwen'
|
||||||
|
root_dir = rf'./{data_ai}/'
|
||||||
|
dedup_output_dir = os.path.join(root_dir,'dedup')
|
||||||
|
if not os.path.exists(dedup_output_dir):
|
||||||
|
os.mkdir(dedup_output_dir)
|
||||||
|
if not os.path.exists(root_dir):
|
||||||
|
logger.error(f"folder {root_dir} not exist" )
|
||||||
|
|
||||||
|
else:
|
||||||
|
for file in os.listdir(root_dir):
|
||||||
|
file_path = os.path.join(root_dir, file)
|
||||||
|
if os.path.isfile(file_path):
|
||||||
|
print(f'file name: {file_path}')
|
||||||
|
if is_json_file(file_path):
|
||||||
|
with open(file_path, 'r', encoding='utf-8') as f:
|
||||||
|
data = json.load(f)
|
||||||
|
dedup_data = deduplicate_json(data)
|
||||||
|
with open(os.path.join(root_dir, 'dedup','dedup_' + file), 'w', encoding='utf-8') as output_file:
|
||||||
|
json.dump(dedup_data, output_file, ensure_ascii=False, indent=4)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user