Beküldte balacy -
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...

Ha csak a könyvtárnevek kellenek
Beküldte lynx (nem ellenőrzött) -
Értékelés:
find /a/könyvtár/útvonala -type d | awk -F'/' '{print $NF}' > konyvtarak.txt
Ha csak a könyvtárnevek kellenek
Beküldte lynx (nem ellenőrzött) -
Értékelés:
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
Bash megoldást nem tudnék, de
Beküldte kami911 -
Értékelés:
Bash megoldást nem tudnék, de fájllista jó ha van.
Ezek a megoldások játszhatnak:
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
Beküldte balacy -
Értékelés:
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.