#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 для идентификации именованных сущностей, но они тоже не идеальны.