Hali!
Tudnátok segíteni olyan hash-szerű függvény keresésében, ami az általános elvárással ellentétben hasonló inputra, épphogy hasonló eredményt ad?
Igazából egy normára volna szükség, ami a fenti kritériumot teljesíti.
Az első próbálkozásom a Levenshtein-távolság, mint metrika, felhasználásával volna.
Ez a függvény megmondja, hogy hány karakter beszúrásával/törlésével/átírásával lehet egyik sztringből a másikba átmenni. Rögzíthetnák egy stringet, és akkor lehetne a norma minden inputra az ettől való ilyen távolság.
Ezzel sok bajom van:
- Ez lineáris, nekem inkább exponenciális kellene, azaz hogy ami nagyon különbözik, annak a normája is különbözzön nagyon. (vehetném a négyzetét)
- Ha nem jól választom az etalon sztringet, akkor torzszülött lesz: ha a csupa NULL-t választom etalonnak, akkor minden bemenet normája a sztring hossza lesz, ami nem éppen az, amire szükségem volna. Lehet egyáltalán jól választani? Pont ezért volna inkább közvetlenül egy normára szükségem, ami nem egy halmazbeli
elemhez mért távolságtól függene, hanem közvetlenül rendelne egy számot a bemenethez.
- Az eredmény nem egy intervallumba esik, ahol "egyenletesen" oszlik el. Közel azonos hosszú szavak esetén ez jól működik, de különben nem túl szépen oszlanának el a kapott eredmények. Ezért is írok hash-szerű fv.-t, mert azok mindig szép n-bites eredményt adnak.
Elsősorban nem fix, de nagyjából szó hosszú szavakra szeretném alkalmazni.
A legjobb példa, a google suggestion: ha félregépelünk egy kulcsszót a google keresőben, akkor a találatok előtt gyakran ajánlja fel a helyeset.
Biztos vagyok benne, hogy nem az alapján ajánl, hogy az indexelt és rendezett teljes kulcsszó-adatbázissal összehasonlítja, és azt ajánlja, amivel mondjuk az említett Levenshtein-távolság kicsi. Hanem van egy leképezés, ami az ilyen nemreguláris hash szerint indexeli a kulcsszavakat, és ugyanezzel e leképezéssel transzformált keresés-kifejezés közeléből ajánl olyat, amire sokkal több találat is volna.
Pont hasonlót szeretnék én is, hogy szövegeket/szavakat úgy partícionálni mondjuk hostok között e norma szerint, hogy ez a hash indexként funkcionáljon még elgépelés esetén is. A kulcsütközések/false positives nem probléma, hiszen ezeket már utólag, mivel kevesen vannak, kevés lépésben, az adott hoston, más mértékek alkalmazásával tovább tudom szűkíteni.
Amit eddig ajánlottak:
- Egy determinisztikus függvénnyel az inputból kis szeleteket kiválasztani, és ezekre hagyományos hashelést alkalmazni, majd az eredményeket konkatenálni. Ekkor kis változás csak kevés hashet érintene, így a végeredmény is hasonló volna.
- Az input karaktereinek eltérését valahogyan súlyozva összegezni. (Az eredmény így egy szám.) Ez szimpatikus, csak ismét az eloszláson volna jócskán mit finomítani.
Előre is köszi az ötleteket, üdv