Вопрос или проблема
У меня есть список путей ко всем папкам в подпапке, и некоторые имена путей содержат слова “Chapetrs”, “Chapter”, “chapter” или даже “chaptser”. Я хочу обнаружить эти слова в путях и поместить эти папки в большую папку с именем ALL_CHAPTERS. Предложите решение, которое учитывает возможные орфографические ошибки. Я думаю о чем-то вроде косинусного сходства или кластеризации k-средних.
Ответ или решение
Для автоматизации процесса размещения папок с похожими именами в отдельную папку, воспользуемся языком программирования Python и библиотеками, такими как os
для работы с файловой системой и difflib
для определения похожести строк. Мы создадим скрипт, который проверит, содержат ли пути к папкам слова "Chapter", "Chapters", "chapter", "chaptser" и их варианты с опечатками, а затем переместит эти папки в папку "ALL_CHAPTERS".
Вот шаги, которые мы будем выполнять:
- Сбор всех путей к папкам в список.
- Определение ключевых слов и использование алгоритма для нахождения схожих слов.
- Перемещение найденных папок в целевую папку.
Реализация
import os
import shutil
import difflib
# Функция для проверки, содержит ли строка похожие слова на "Chapter"
def is_similar_to_chapter(folder_name):
keywords = ["chapter", "chapters", "chaptser"] # Определяем ключевые слова
threshold = 0.8 # Порог для определения схожести
for keyword in keywords:
# Используем метод SequenceMatcher для определения схожести
similarity = difflib.SequenceMatcher(None, folder_name.lower(), keyword).ratio()
if similarity >= threshold:
return True
return False
# Основная функция для перемещения папок
def move_chapter_folders(base_path):
target_folder = os.path.join(base_path, "ALL_CHAPTERS")
# Создаем целевую папку, если она не существует
if not os.path.exists(target_folder):
os.makedirs(target_folder)
# Перебираем все папки в базовом каталоге
for root, dirs, files in os.walk(base_path):
for folder in dirs:
folder_path = os.path.join(root, folder)
if is_similar_to_chapter(folder):
# Перемещаем папку в папку ALL_CHAPTERS
shutil.move(folder_path, target_folder)
print(f"Перемещено: {folder_path} -> {target_folder}")
# Путь к папке, в которой находятся ваши папки
base_path = "/path/to/your/base/directory" # Замените на ваш путь
move_chapter_folders(base_path)
Разъяснения:
-
Функция
is_similar_to_chapter(folder_name)
: Эта функция определяет, похоже ли имя папки на одно из ключевых слов. Мы используемdifflib.SequenceMatcher
, чтобы определить процент схожести между именем папки и ключевыми словами. Если схожесть превышает определённый порог (в нашем случае 0.8, что означает 80%), то функция вернётTrue
. -
Функция
move_chapter_folders(base_path)
: Эта функция:- Создаёт папку "ALL_CHAPTERS", если она не существует.
- Проходит по всем папкам в указанном базовом пути и проверяет, содержат ли они схожие слова.
- Перемещает все подходящие папки в созданную папку.
Примечания:
- Не забудьте установить необходимые права доступа, чтобы скрипт мог перемещать папки.
- Убедитесь, что путь в переменной
base_path
правильно указан и что скрипт имеет доступ к этому пути. - При запуске скрипта все папки с похожими именами будут перемещены, поэтому убедитесь, что у вас есть резервные копии важных данных.
Этот скрипт позволит вам эффективно организовать папки, содержащие упоминания о главах, даже если в названиях присутствуют опечатки или различные варианты написания.