Как удалить пути, содержащие одинаковые имена?

#python #list #path #duplicates #set

Вопрос:

У меня есть список путей, которые выглядят следующим образом (см. Ниже). Как вы можете видеть, имена файлов противоречивы, но я хотел бы сохранить только один файл на человека. У меня уже есть функция, которая удаляет дубликаты, если у них одно и то же имя файла, но разные расширения файлов, однако с этим несогласованным случаем именования файлов это кажется сложнее.

Список файлов выглядит примерно так (но предположим, что есть тысячи путей и слов, которые не являются частью полных имен, например, резюме, биографические данные и т.д.):

 all_files = 
['cv_bob_johnson.pdf',
'bob_johnson_cv.pdf',
'curriculum_vitae_bob_johnson.pdf',
'cv_lara_kroft_cv.pdf',
'cv_lara_kroft.pdf' ]
 

Желаемый результат:

 unique_files = ['cv_bob_johnson.pdf', 'cv_lara_kroft.pdf']
 

Учитывая, что имена в большинстве случаев написаны по определенной схеме (например, имя предшествует фамилии), я предполагаю, что должен быть способ получить уникальный набор путей, если имена повторяются?

Ответ №1:

Если вы хотите, чтобы ваш алгоритм был относительно простым (т. Е. Не использовал ML и т. Д.), вам нужно иметь некоторое представление о типичных подстроках, которые вы хотите удалить. Давайте составим список таких подстрок, например:

 remove = ['cv_', '_cv', 'curriculum_vitae_', '_curriculum_vitae']
 

Затем вы можете обработать свой список файлов таким образом:

 import re
all_files = ['cv_bob_johnson.pdf', 'bob_johnson_cv.pdf', 'curriculum_vitae_bob_johnson.pdf', 'cv_lara_kroft_cv.pdf', 'cv_lara_kroft.pdf']
remove = ['cv_', '_cv', 'curriculum_vitae_', '_curriculum_vitae']

unique = []
for file in all_files:
    # strip a suffix, if any:
    try:
        name, suffix = file.rsplit('.', 1)
    except:
        name, suffix = file, None
    # remove the excess parts:
    for rem in remove:
        name = re.sub(rem, '', name)
    # append the result to the list:
    unique.append(f'{name}.{suffix}' if suffix else name)

# remove duplicates:
unique = list(set(unique))
print(unique)
 

Комментарии:

1. Да, я сделал что-то подобное, и это в какой-то степени работает. Конечно, существуют тысячи имен файлов с большим количеством «мусора». Я пытался использовать обученные модели NERC для идентификации именованных сущностей, но они тоже не идеальны.