2007. november 1.

Keresés a Diogenesszel

A TLG vagy PHI adatbázisban egy-egy szóra keresve gyakran szembesülünk azzal a problémával, hogy a keresőkifejezést nagyon rövidre kell vennünk, aminek következtében rengeteg nem kívánt találatot is kapunk. Például: ha a rex szó előfordulásaira vagyunk kíváncsiak, akkor a re keresőkifejezést kell megadnunk, így viszont találatként fog jelentkezni a rego 3, a res és még rengeteg szó még inkább rengeteg alakja (és ha nem jeleztük azt, hogy szó elején áll a re, akkor a találatok száma tovább sokszorozódik). Ritkább szavaknál persze könnyebb dolgunk volna: ha például a flagitatio témáján dolgoznánk, akkor még kapóra is jönne, hogy a flagit szókezdetre való keresés a flagito 1-ből képzett szavakat is megtalálná.

Ám ha nem ilyen szerencsésen választottunk kutatási témát, akkor nagy szükségünk van egy olyan rendszerre, amely összetettebb szabályok alapján is tud keresni - például "ismeri" egy-egy szó teljes paradigmáját, és ezáltal megoldást nyújt az előbb említett problémára. A Diogenes új verziója, melyről nemrég írtam (és amelyhez közben megjelent két hibajavítás: jelenleg a 3.1.6-os verziónál tart), ilyen rendszer: ha nem egyszerű, hanem morfológiai keresést indítunk a rex szóra, a program az összes ragozott alakot megtalálja, anélkül, hogy pl. a regno 1 és társai szerepelnének a találatok között (természetesen a regis alak esetében pl. továbbra is nekünk kell az egyes találatoknál eldöntenünk, hogy a rex vagy a rego ragozott alakjáról van szó).

Csakhogy a Diogenes morfológiai keresője sem "csodafegyver": sok esetben megkönnyíti a munkánkat, de bizonyos esetekben nem használhatjuk. Például akkor, ha két szó egymás közelében való előfordulásaira vagyunk kíváncsiak (márpedig ez a Diogenes másik legfontosabb szolgáltatása), illetve akkor, ha nem egy adott szó különböző ragozott alakjait keressük, hanem különböző szavak hasonló (de nem feltétlenül azonos) alakjait - mondjuk, az összes part. ipf. activit (pontosabban: az ahhoz hasonlóan nt-tövű névszót) egy adott szövegben.

Ebben az esetben vethető be sikerrel a Diogenes kevésbé reklámozott, első látásra bonyolult, de annál sokoldalúbb szolgáltatása: a "szabályos kifejezés" (regular expression, röv. regexp) alapján való keresés. Ez lényegében azt jelenti, hogy nem egy (vagy több, egymás után felsorolt) keresőkifejezés alapján indítjuk a keresést, hanem egy "képletet" állítunk össze, és a program azokat a betűsorozatokat (szándékosan nem azt írom, hogy szavakat!) találja meg, melyekre megfelelnek ennek a képletnek.

Lássunk egy egyszerű példát: az " anim[ao]s " keresőképlet (melynek az idézőjelek nem részei!) arra utasítja a Diogenest, hogy találja meg azokat a szavakat, melyek kezdete anim, az utolsó betűjük s (a keresőkifejezést nyitó és záró szóköz jelzi a szókezdetet és -véget), az utolsó előtti pedig vagy a, vagy o. A képlet tehát úgy néz ki, hogy a "biztos" betűk mellett "bizonytalanokat, változókat" is megadunk - ez utóbbiakat speciális jelek kíséretében.

A Diogenesben használható speciális jelek és jelentésük a következő:

[ab] vagy a vagy b (ez csak egy-egy karakter esetében használható)
(abd|def) vagy abc, vagy def
? azt jelzi, hogy az előtte álló betű vagy "egység" - tehát [...] vagy (...) - opcionális
* azt jelzi, hogy az előtte álló betű vagy "egység" többször is (akárhányszor) előfordulhat (de nem kell feltétlenül előfordulnia)
+
a *-tól eltérően azt jelzi, hogy az előtte álló betűnek/egységnek legalább egyszer elő kell fordulnia

Ezek a kifejezések természetesen kombinálhatók, és hierarchikusan is alkalmazhatók; a segítségükkel akár egy szó teljes paradigmája megadható. Lássunk erre is egy példát (melyet a szerző is mellékel a Diogeneshez): " re(x|g(is?(bus)?|e[ms]?|um)) ". Ezzel a rex összes alakja megtalálható. A képlet így értelmezhető: a keresett szó úgy kezdődik, hogy re; utána vagy x áll (és vége a szónak), vagy pedig g. Ez utóbbi esetben viszont a szónak még nem lehet vége: áll utána vagy egy i (és utána opcionálisan s vagy bus), vagy egy e (és utána opcionálisan m vagy s), vagy pedig um. Ezután a szónak mindenképpen véget kell érnie. A képlet természetesen könnyen adaptálható bármelyik msh-tövű 3. declinatiós főnévre: pl. a dux-hoz csak az elejét kell cserélni: " du(x|c. Kicsit eltérően nézne ki egy gyenge i-tövű, például a navis összes alakját kereső képlet: " ign(i(s|bus|um)?|e[ms]?) ".

A képletet persze kiegészíthetjük a gyakori -que, -ve, -ne szócskákkal: ez esetben a képletet záró szóköz elé kell beszúrnunk a következőt: "(que|ve|ne)?" (idézőjelek nélkül természetesen; a kérdőjel jelzi, hogy a szócskának nem feltétlenül kell szerepelnie).

Ha csak egy szóról van szó, akkor - mint írtam - a morfológiai kereső használata egyszerűbb és gyorsabb; de ha pl. a rex és az imperium egymáshoz közeli előfordulásaira vagyunk kíváncsiak, akkor gyorsabban, és pontosabb eredményt kapunk, ha a "search for conjunctions ..." funkciót választjuk, és a következő két képletet adjuk meg:
1. " re(x|g(is?(bus)?|e[ms]?|um))(que|ve|ne)? "
2. " imperi(um|is?|o(rum)?|a)?(que|ve|ne)? " (az utolsó előtti kérdőjel azért szerepel, hogy megtaláljuk az összevont imperi alakot is)

Rákereshetünk minden prae- igekötős ige inf. ipf. activijére (azzal a szépséghibával, hogy megtaláljuk így pl. a praeteriere praes. pf. alakot és a praeclare adverbiumot is): " prae[abcdefghijklmnopqrstuvwxyz]*[aei]re " (a * előtti [...] jelzi, hogy bármilyen és bármennyi betű állhat ott, de szóköz nem).

És végül, ha már példaként említettem fent: "az összes part. ipf. activi (pontosabban: az ahhoz hasonlóan nt-tövű névszó) egy adott szövegben" a következő képletet igényelné: "n(s|t(e[ms]?|is?(bus)?|i?um))(que|ve|ne)? " (i?um, hogy a participiumok -um végű plur. genitivusi alakjait is megkapjuk; a képlet elején a szóköz hiányával jelezzük, hogy szóvégre, nem teljes szóra keresünk)

A fenti példákkal természetesen csak a keresési formában rejlő lehetőségeket igyekeztem megmutatni; és csupán remélhetem, hogy vannak, akiket nem riasztottam el a használatától! ;-)

1 megjegyzés:

Névtelen írta...

A Diogenés PERL programozási nyelvben készült, és a fejlesztő külön kiemeli, hogy a kereséseknél használhatók a PERL "szabályos kifejezései" (regular expressions).

Ezek lényegéről általánosan:
http://hu.wikipedia.org/wiki/Szab%C3%A1lyos_kifejez%C3%A9sek

Speciálisan a PERL nyelv esetében:
http://perldoc.perl.org/perlre.html#Regular-Expressions

Mindezt pusztán azért, hogy lássuk az elvi alapját ennek a "hókuszpókusznak".

Ősz F