From cfd13c8d194c01a2383dbb04cc6b4279bf7499b4 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Wed, 10 May 2023 16:56:45 +0300 Subject: [PATCH] =?utf8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= =?utf8?q?=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20=D1=81=20=D0=BF=D0=BE?= =?utf8?q?=D1=85=D0=BE=D0=B6=D0=B8=D0=BC=D0=B8=20=D0=B8=D0=BC=D0=B5=D0=BD?= =?utf8?q?=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%9B%D0%B5%D0%B2%D0%B5%D0%BD%D1%88%D1%82%D0%B5%D0%B9%D0%BD%D0%B0 Среди скачанных lossless альбомов на замену MP3 (96cac6d683e023383670bf6cbccf91c7eff90063) есть много альбомов с не совпадающими именами: опечатки, наличие восклицательных знаков, многоточия, разные регистры букв, пропущенные года в имени, и т.д.. Надо бы как-то автоматизировать поиск похожих имён. Когда-то я просто слышал про расстояние Левенштейна, но никогда на практике не использовал ничего связанного с подобным. Судя по всему, как минимум, он то что мне нужно. Для Perl есть лёгкая библиотека по его расчёту. Беру отсортированный список директорий и вывожу пары между которыми расстояние меньше заданного: use Text::Levenshtein qw(distance); my @lines = map { chop; $_ } ; for (my $i = 0 ; $i < ($#lines - 1); $i++) { my ($l1, $l2) = ($lines[$i], $lines[$i+1]); print "$l1\n$l2\n\n" if (distance($l1, $l2) <= $ARGV[0]); } Расстояние подбирал эмпирически: указывал одно, сохранял результат в файл, затем другое, затем сравнивал файлы comm -3 командой и смотрел имеются ли отличия значимые. Несколько сотен директорий подчистил таким образом. -- 2.50.0