2018. március 23., péntek

A Graph Search-sztori

A téma, amiről néha úgy gondolom, hogy már nem lehet több bőrt lenyúzni, aztán rájövök, hogy mégis. Ha valaki nagyon lemaradt volna, a Graph Search egyszerűsítve a Facebook szemantikus keresője, ami máig működésképtelen olyan módon, ahogyan működnie kellene, viszont megfelelő URL-ek összetákolásával és küldésével rábírható, hogy szinte akármilyen elborult feltétel szerint keressünk a Facebookon belül, az egyetlen előzetes feltétel, hogy a Facebook használati nyelve US English-re legyen beállítva.

Egy-egy ilyen URL entitásazonosítókból és kulcsszavakból áll, egy-egy részterm pedig lényegében mondjuk a magyarral párhuzamba állítva határozóknak, jelzőknek, tárgyaknak vagy alanyoknak feleltethetők meg, az elméleti lényeget vázlatosan ezzel a prezivel mutattam be még 2017. októberében.

Évekkel ezelőtt, amikor a kulcsszavakat elkezdtem bányászni, szinte hihetetlen volt, hogy alig foglalkozott ezzel valaki előttem, pontosabban párhuzamosan velem. A témában egy cikket egy nyelvtechnológiai konferenciára is beadtam évekkel ezelőtt, amit aztán alaposan lehúzott a programbizottság, tök véletlenül pedig szinte ugyanakkor a cikkben megjelölt, akkor ismert kulcsszavakat konkrétan valaki finoman fogalmazva kreatívan újrahasznosította persze egy kőkeményen fizetős szolgáltatásban.

Később belefutottam egy oldalba, ahol már egy rakás kulcsszó kint volt, linkeltem is egy szakmai csoportba kopipészttel, aztán az alapján már megtalálható volt más számára is a spanyol nyelvű oldal, ami még mindig nem tartalmazta a teljes listát. A 2017. októberében bemutatott prezentáción cca. 40 kulcsszó szerepel, de világos volt, hogy ennél több van, ezen kívül nyilván többnek a használata, ha úgy tetszik helyesírása egyszerűen nem volt világos.

Aztán a jóég tudja, hogy hogyan, de 2017. szeptembere körül találtam a Githubon egy forráskódot benne 300-nál is több kulcsszóval, amit egy Huy Do nevű vagy nevet használó japán csávó tett fel, nem világos, hogy ő írta vagy ő is átvette valahonnan, ami viszont durva, hogy 2014. szeptemberében töltötte fel a repójába, holott maga a Graph Search első verziója mindössze 6 hónapos volt. Persze számomra így sem volt értelmetlen a kulcsszavak addigi bányászata, már csak azért sem, mert közben legkülönfélébb alkalmazási lehetőségekre jöttem rá. Más oldalról viszont azt lehetne mondani, hogy újra feltaláltam a kereket, ráadásul ahhoz képest, hogy elvileg éppen a keresés lenne a területem, olyan hülye voltam, hogy nem találtam meg korábban. A magyarázat azért nem olyan ördögien bonyolult: a DuckDuckGo, a Google, a Yandex és a többi egyrészt értelmes kifejezések keresésére van idomítva, egészen egyszerűen azért, mert a forráskódok csak egy töredékét képzik a web tartalmának. Meg persze nem ezzel foglalkoztam látástól Mikulásig.

Valami után kutatás persze nem csak keresésből áll, de jórészt abból. Viszont ha rákeresünk három, kimondottan ritka kulcsszóra, kettő másik mellett mondjuk arra, hogy

commerce_by_product_capability

nos, még mindig kevesebb, mint 200 találatot kapunk a Gugliban. Amire kerestünk, mind valamilyen forráskódba ágyazva vannak, másrészt gyakorlatilag azonosak a forráskódok, esetleg forkok. Azaz tényleg eléggé kevesen ismerték azt a 314 szóból álló szótárat, ami most teljesnek tűnik, ha pedig többen, akkor azok megtartották maguknak illetve nem azzal foglalkoztak, hogy milyen nyelvtannal működőképes. Hogy konkrétabban fogalmazzak: a

Photos taken in Rózsakert Bevásárlóközpont

lekérdezés értelmes visszatérési értékekkel a

https://www.facebook.com/search/1280747421959605/photos-in/

URL-lel áll össze, viszont a

Photos taken in Rózsakert Bevásárlóközpont from June 2016

már valahogy így:

https://www.facebook.com/search/1280747421959605/photos-in/jun/2016/date-2/photos/intersect

Az, hogy összetett kifejezés /intersect-tel zárandó, világos, ahogy az is, hogy diszkrét értékként adjuk meg entity_id-vel, hogy mivel kapcsolatban keresünk, azt viszont már véletlenül nem lehet kitalálni, hogy időbeli szűkítésnél:

- a photos-in kulcsszó kerül előre
- az időre való szűkítést, mint résztermet utána, a hónap három betűs rövidítésével kell megadni
- utána az évet
- de olyan módon, hogy azt a date-2, nem pedig például a logikusan várható date kulcsszó követi
- utána ismét jelölni kell, hogy fotót keresünk

Na most ilyenre véletlenül nem lehet rájönni, ez világos. Olyan logikával lehet próbálkozni, hogy magába a keresősávba külön-külön megadjuk, hogy

Photos taken in Rózsakert Bevásárlóközpont

illetve

Photos taken in 2016

aztán az első néhány értelmes találat alatti "See all" URL-jét kipuskázzuk, viszont ennyi alapján nem lehet megállapítani, hogy a kettőt hogyan kellene összetákolni összetett feltételt kifejező termmé, ha pedig kézzel adjuk meg a keresősávba, hogy mit keresnénk, szinte 1000%, hogy tokenizálni sem tudja a hülye Graph Search, hogy mit is kellene keresnie. Mármint első keresésnél biztosan, amit korábban lefuttattunk, annál nyilván más a helyzet.

Életszerűtlen, hogy valaki annyi ideig próbálgassa, amíg rá nem jön a fenti 5 szabályra még egy ilyen egyszerű keresés esetében is, én is inkább suggestek alapján túrtam ki, amit kitúrtam.

Az egész persze semmiféle hivatalos fejlesztői dokumentációban nem lehető fel, a szókészletet egészbe nézve pedig eléggé világos, hogy nem is embereknek szánták, hanem tényleg belső lekérdezőnyelvként, amit majd a gép tákol össze önmagának már ha megértette egy NLP-pipeline alapján, hogy mit kellene keresni. Például a napos pontosságú időpontra való keresésnél ezért találták ki hanyag eleganciával, hogy date-3 épüljön az URL-be, mert nem kell, hogy human readable legyen...

Annyi mankó talán van, hogy például Huy Do kódjából lehet erre-arra következtetni a nyelv nyelvtanával kapcsolatban, aztán hol full egyszerű a szabály, hol közel sem, de alighanem az alapján majd írok egy komolyabb "nyelvtankönyvet" is.

Ami eléggé sanszos, na meg az én sejtésem, mintha az egészet úgy találták volna ki, hogy azt szépnevű nyomozóhatóságok tudják kifinomult keresésekre használni. Mivel a Graph Search sokáig konkrétan nem vette figyelembe a privacy selectorokat, azaz hogy találatként mit mutathat majd meg. A másik, ami szinte biztos, hogy eredetileg magától a Facebooktól szivárogtak ki a kulcsszavak és a nyelvtan, amiket tehát nem is felhasználóknak, nem is fejlesztőknek, csupán az okos GS-nak építettek. Az API-n futó appok nem dobálják vissza a kulcsszavakat, azaz aligha vicceskedte ki valaki azokat ilyen módon.

Hatalmas hiba lenne azért azt gondolni, hogy na, akkor most megvan a svájci bicskánk a világ egyik legnagyobb élő adattárházához kis képzavarral élve. Mivel még a kulcsszavak és a szintaktika ismeretében is gyakorolni kell ahhoz, hogy ésszerű idő alatt tényleg azt találjuk meg, amit szeretnénk, az itt nem részletezett buktatókról nem is beszélve.

Kulcsszólista erre, azt meg kétszer is meggondolom, hogy a nyelvtant mennyire és milyen körben osszam meg, amint teljes lesz. 

https://github.com/bardoczi/facebook-graph-search/blob/master/facebook-graph-search-keywords