Hasonló könytárnevek kikeresése

Fórum: 

Egy nagyobb könyvtárban van kb. 13ezer alkönyvtár. Van közte olyan duplikált név is, amiben csak pár betű eltérés van.
Hogyan tudom kilistáztatni azokat a könyvtár neveket, amiben csak egy kicsi az eltérés?
Akár olyan megoldás is érdekes lehet, hogy a könyvtár neveket egy listába kimentem és valamely szövegszerkesztővel a minimálisan eltérő sorokat kikeresem...

lynx képe

Ha csak a könyvtárnevek kellenek

Értékelés: 

0
Még nincs értékelve

#1 Itt egy javított változat. Ez ABC sorrendbe rendezett listát ad.

find /a/könyvtár/útvonala -type d | awk -F'/' '{print $NF}' | sort > konyvtarak_sorted.txt

Ha kell, ezt tovább lehet finomítani úgy, hogy az első karakterek alapján külön lista készüljön a nevekről.

konyvtarak_A.txt
konyvtarak_B.txt

kami911 képe

Bash megoldást nem tudnék, de

Értékelés: 

0
Még nincs értékelve

Bash megoldást nem tudnék, de fájllista jó ha van.

Ezek a megoldások játszhatnak:

  • Levenshtein Distance
  • Damerau-Levenshtein Distance
  • Jaro Distance
  • Jaro-Winkler Distance
  • Match Rating Approach Comparison
  • Hamming Distance

Python minta:

>>> import jellyfish
>>> jellyfish.levenshtein_distance(u'jellyfish', u'smellyfish')
2
>>> jellyfish.jaro_distance(u'jellyfish', u'smellyfish')
0.89629629629629637
>>> jellyfish.damerau_levenshtein_distance(u'jellyfish', u'jellyfihs')
1
 

Fel kell dolgozni a fájlt és szerintem ez működhet. Azonos mappában vannak az alkönyvtár, vagy több szint is van?

Bash megoldást nem tudnék, de

Értékelés: 

0
Még nincs értékelve

#3 Köszi. Közben már én is eljutottam a python-hoz és van pár megoldás, amit tesztelek. Az egyik valami ilyen lenne (mesterséges intelligencia okosabb mint én, ráadásul ki is kommenteli a parancsokat ahogy azt kell!) és ez nagyjából azt adja amire számítottam:

import os
from difflib import SequenceMatcher

def get_similar_dirs(threshold=0.7):
    # Összes könyvtár lekérése az aktuális könyvtárból
    dirs = [d for d in os.listdir(".") if os.path.isdir(d)]
    similar_dirs = []

    # Könyvtárnevek páronkénti összehasonlítása
    for i, dir1 in enumerate(dirs):
        for dir2 in dirs[i + 1:]:
            similarity = SequenceMatcher(None, dir1, dir2).ratio()
            if similarity >= threshold:
                similar_dirs.append((dir1, dir2, similarity))

    return similar_dirs

# Hasonló könyvtárak keresése
threshold = 0.7  # 70%-os hasonlósági küszöb
similar_dirs = get_similar_dirs(threshold)

# Eredmények kiírása
print(f"Hasonló könyvtárak ({threshold * 100:.0f}% küszöb):")
for dir1, dir2, similarity in similar_dirs:
    print(f"{dir1} <-> {dir2} (Similarity: {similarity:.2f})")

 

A másik meg ilyen, de ezt még nem próbáltam:

import os
import Levenshtein

def get_similar_dirs_levenshtein(threshold=0.7):
    dirs = [d for d in os.listdir(".") if os.path.isdir(d)]
    similar_dirs = []

    for i, dir1 in enumerate(dirs):
        for dir2 in dirs[i + 1:]:
            similarity = Levenshtein.ratio(dir1, dir2)
            if similarity >= threshold:
                similar_dirs.append((dir1, dir2, similarity))

    return similar_dirs

# Hasonló könyvtárak keresése
threshold = 0.7  # 70%-os hasonlósági küszöb
similar_dirs = get_similar_dirs_levenshtein(threshold)

# Eredmények kiírása
print(f"Hasonló könyvtárak ({threshold * 100:.0f}% küszöb):")
for dir1, dir2, similarity in similar_dirs:
    print(f"{dir1} <-> {dir2} (Similarity: {similarity:.2f})")

 

Az első ilyen eredményt ad:

laci@LinuxMInt:~/500$ python a.py
Hasonló könyvtárak (70% küszöb):
Zrínyi_Miklós_-_Szigeti_veszedelem_(2024)_-_Kulissza <-> Zrínyi_Miklós_-_Szigeti_veszedelem_(Bánffy_István) (Similarity: 0.73)
Zrínyi_Miklós_-_Szigeti_veszedelem_(2024)_-_Kulissza <-> Zrínyi_Miklós_-_Szigeti_veszedelem_(2024)_(Mészáros_Máté) (Similarity: 0.81)
Zsákai_Piroska_-_Kaptam_egy_életet_(2022)_-_Rádiószínház <-> Zsákai_Piroska_-_Kaptam_egy_világot_-_Rádiószínház (Similarity: 0.85)
Zrínyi_Miklós_-_Szigeti_veszedelem_(Bánffy_István) <-> Zrínyi_Miklós_-_Szigeti_veszedelem_(2024)_(Mészáros_Máté) (Similarity: 0.75)

Szuper lesz :)

Tapasztalat ebből: már a ChatGPT szépen használható az ilyen dolgokra. Párszor át kellet fogalmaznom a kérést, hogy nem egy adott mintára kerestessen, hanem az összes könyvtárnevet hasonlítsa össze az összessel, de szépen megoldotta a problémát.