štvrtok 24. apríla 2008

Nedočkavosť

Síce som si chcel dať pár dní pauzu, ale nepodarilo sa :) Takže rovno včera som sa pustil do druhej fázy. Upravil som program, tak aby akceptoval časť značky zadanú nie ako reťazec, ale ako regulárny výraz. To znamená, že sa to už dá používať aj na hádanie značiek. Samozrejme, že by to chcelo viac vzorov, ale zatiaľ to potrebujem len na dva pády pri predložkách. Existujú síce predložky s tromi pádmi, ale výskyty sú celkom o ničom.

Prepočítal som predložky o, na, pred, vo (pôvodne som myslel, že tam mám aj v; takže to až zajtra). Predložky pred a vo (500K a 700K výskytov) priniesli rapídny nárast preklepov v nespracovanej časti (15-20%) a zhruba 800 nových prídavných mien. Predložka o ich dala 2 tisíc a pri predložke na (~4M) ich na mňa čaká ďalších takmer 6 tisíc. Posledná veľká predložka, ktorá ostáva je v (~5M).

Začal som písať článok na konferenciu, ale príliš sa mi do toho nechce. Takže očakávam, že keď sa vyspím, tak sa pokúsim využiť vzory na tvorbu vzťahov medzi slovami (stupňovanie, negácia). Toto by teoreticky nemal byť žiaden väčší problém, ale človek nikdy nevie. Omnoho väčší problém mi robí prefixácia, pretože mi je jasné, že minimálne číselné prefixy by sa mali dať nejako skladať. Na strane druhej to znamená povedať, že popisovať morfológiu čisto cez systém vzorov je chobotina. Ledaže by som to popísal vzorom :)

utorok 22. apríla 2008

Koniec prvej etapy práce s prídavnými menami

Dnes sa mi podarilo prejsť aj posledné prídavné mená (predložka s, vzor pekný) z prvej etapy. V nej som sa zameral na prídavné mená (bez vzoru otcov/matkin, ktorý sa v podstate tvorí automaticky), ktoré sa spájajú s niektorou z jednopádových predložiek. Takže krátke zhrnutie: 27940 kandidátov na dvojicu lemma:vzor, z nich bolo správnych 26104 (podľa mňa, ale skutočné čísla budú asi dosť podobné) = ~93.5%. Chybovosť sa od počiatku pohybovala na úrovni päť percent a stúpať začala až v poslednej tretine. Predpokladám, že pri dopĺňaní ďalších slov to bude ešte rásť. Prekrývanie s ispellom v slovách, ktoré sú správne podľa oboch je 8970 slov tj. pozná 33% mojich slov. Ja nepoznám okolo šesťtisíc jeho slov, to znamená že priestor na zlepšovanie je aj u mňa :)

Prvú etapu som zavŕšil tým, že som presťahoval projekt z ~/tmp/predlozky na /nlp/projekty/langusta. V druhej etape sa chcem zamerať hneď na niekoľko vecí:
  • predložky, ktoré sa viažu s dvoma pádmi (~10 miliónov výskytov)
  • vzťahy medzi predložkami (negácia a stupňovanie)
  • rozmýšlam nad prefixami, ale to by som skôr nechal na neskôr
Na konci tejto fázy by som mal mať pokrytých dostatok prídavných mien. Aby som zlepšil svoju efektivitu, tak sa pokúsim zapojiť do opravovania ispell (s mojími korektnými slovami). Najbližších pár dní si, ale od predložiek oddýchnem a budem sa snažiť robiť niečo iné.

sobota 19. apríla 2008

Prídavné mená v korpuse - koniec teoretizovania

Dnes som prišiel na to, že všetko je úplne inak ako som si myslel. Podarilo sa mi objaviť chybu v metóde single, ktorá sa prejavovala v prípade, že slovo malo síce len jednu možnosť lemma:vzor, ale opakovala sa (rozdiel bol v gramatickej značke). Okamžite sa prejavilo, že nemám ošetrené prípady pre vzor dub s poslednou dlhou slabikou (tie sa pletú s prídavnými menami). Vďaka Michalovi sa podarilo nahodiť nové Ubuntu na tri asterie (Xeon 2Ghz, 4GB). Na nich dokážem reálne dosahovať rýchlosť okolo 80 tisíc konkordancií za minútu, tj. do pol hodiny mám aj tú najfrekventovanejšiu predložku :)

Potom som sa pustil do pridávania slov do centrálnej databázy. Aktuálne je v nej 14 tisíc kandidátov na prídavné mená a za správne je označených okolo 95%. Nesprávne sa nevymazávajú, ale sa len označia, takže ich nemusím prechádzať pri každej predložke. Zatiaľ som sa sústredil len na 'skutočné' prídavné mená, tj. vzory pekný, cudzí a vtáčí. Vzor otcov si nechávam do rezervy, pretože to všetko by malo byť odvodené od podstatných mien. Najbližším cieľom je skontrolovať aj zvyšných ~7 tisíc kandidátov na prídavné mená. Na porovnanie, slovenský ispell má necelých 15 'skutočných' prídavných mien, SSJČ obsahuje 30 tisíc značiek príd. zo 120 tisíc slov. Normálne slovníky, vrátane SSJČ, majú v skutočnosti tých prídavných mien viac, pretože ispell (a zatiaľ ani ja) nespája stupňovanie pod jednu lemmu.

piatok 18. apríla 2008

Hľadanie v korpuse IV

Moja pracovná nálada stále nepoľavuje a pretože už za sebou začínam vidieť reálne výsledky, tak to snáď ešte chvíľku vydrží. Ale pekne po poriadku. Po včerajšom neúspechu s inštaláciou Ubuntu (fakt divný problém s DHCP) a úspešnom návrate môjho počítača z reklamácie som sa vrátil k predložkám.

Podarilo sa mi vytvoriť nové vzory alchýmia a aféra, ktoré odfiltrovali najčastejšie včerajśie chyby. Pôvodne som myslel, že budem potrebovať aj vzor dub (resp. nejaký jeho podvzor), ale takéto slová padli pod vzor aféra. Čo síce nie je správne, ale vzory pre podstatné mená slúžia momentálne len na hľadanie konfliktov a neočakávam, že dávajú stopercentne korektné výsledky. So vzorom alchýmia bol ešte ten problém, źe som testoval len prvý rozklad slova na hlásky a keďže tam vzniklo ia, tak to nepasovalo s poslednou hláskou, ktorá mala byť a.

Po týchto úpravach som zase všetko pregeneroval, vypadlo toho o kúsok menej ako naposledy, ale podľa mňa sa výrazne zvýšila kvalita. Pri metóde single ubudlo ~tisíc kandidátov a pri metóde intersect (tá
kompilikovanejšia, čo dáva viac výsledkov) to kleslo o ~2500 výsledných priradení lemma:vzor. Pre vzory prídavných mien nám toho ubudlo viac ako pribudlo, kvôli novým vzorom, takže aktuálne čísla pre single sú 12 tisíc a pre intersect 41 tisíc (tu už máme zlúčené aj malé a veľké písmená)

Aby som si overil kvalitu výsledných dát, tak som výsledky pre predložku cez (single) prešiel ručne. Do vzoru vtáčí nám nepatrilo nič, do vzoru cudzí nám patrilo 41 slov a všetky boli správne. Najväčšia skupina patrila do vzoru pekný. Z nich som vybral tie, ktoré začínajú aj malým písmenom, to preto aby som sa vyhol vlastným menám. Týchto slov som mal 2281 a z nich som za pofidérne označil 75 (3.2%), takéto slová sú buď preklepy, alebo som si nebol istý či sú správne (napr. zhluknutý, elektornický). V každom prípade, takúto chybovosť považujem za prijateľnú a môžem sa pustiť do overovania aj zvyšných desiatich tisíc prídavných mien :)

Zo včerajšieho todo listu ubudli: oprava vzorov a prejdenie pár tisíc slov, čo bolo viacmenej nahradené za prejdenie všetkých slov :) takže som si príliš nepomohol.

streda 16. apríla 2008

Hľadanie v korpuse III

Do systému na hľadanie slov za predložkami (asi by si zaslúžil nejaké rozumné meno) som pridal vzor vysvedčenie (balenie - balení) a vzor ulica (abstrakcia - abstrakcií; genitív plurálu chýba). Taktiež som pridal predložky s veľkým výskytom, ktoré sa viažu s jedným pádom: od, do, s/so, z/zo, ... To znamená, že surových dát mám viac než dosť. Ak zanedbáme slová priradené k vzorom ulica a vysvedčenie, kde nemáme na výber a padne tam aj to, čo tam nepatrí, tak nám zostane zhruba 40 tisíc prídavných mien (pekný, cudzí, vtáčí, otcov).

Pôvodne som si veľmi pekne vymyslel pravidlo, ktoré bolo postavené na tom, že drvivá väčšina slov má jedno lemma. Ukázalo sa, že to bola dosť naivná predstava :) Idea bola taká, že ak pre daný slovný tvar bolo niekoľko kandidátskych dvojíc lemma:vzor, tak som našiel ďalšie slovné tvary, ktoré obsahovali tento lemma:vzor a spravil prienik. Dá sa povedať, že to aj tak trochu funguje, pretože bez toho by sme získali len asi 15 tisíc prídavných mien. Ale IMHO nám tých chýb pribudne až príliš. Preto bola táto varianta zahodená a lemma:vzor určím len vtedy ak je práve jedna takáto dvojica. Ten zbytok bude použiteľný na nejaké overovanie. Príklad slova, ktoré to kazí:


akreditovaním : akreditovanie : vysvedčenie
akreditovaním : akreditovaní : vtáčí
akreditovanou : akreditovaní : vtáčí
akreditovanou : akreditovaný : pekný
akreditovanými : akreditovaný : pekný


Z toho dostanem akreditovaný:pekný a akreditovaní:vtáčí. Na spôsob ako z toho dostať akreditovanie:vysvedčenie bez zapisovania explicitných pravidiel sa mi zatiaľ nepodarilo prísť.

Ak si zoberieme ten osekaný 15tisícový výstup, tak sa mi podarilo nájsť nasledovné chyby:
  • alchýmí:[vtáčí], kardiológí:[vtáčí] (tj. problém so vzorom: malo by patriť pod ulicu)
  • chýbajúce dĺžne a mäkčene: afganský:[pekný], afgánsky:[pekný] (tj. problém vstupných dát)
  • preklepy: atký:[pekný], agenúry:[pekný]
  • aféry:[pekný], agentúry:pekný (tj. chýba vzor: žena s dlhou poslednou slabikou)
Do úvahy som nebral slová, ktorým bol určený vzor pre podstatné mená, pretože tam bude treba tých konfliktov riešiť omnoho viac.

Taktiež sa mi podarilo napísať aj skript, ktorý overí prídavné mená voči slovám, ktoré sú v slovenskej databáze ispellu. Ten obsahuje 14tisíc prídavných mien, prekryv s mojimi je 9224 resp. 4682 (zo 40 tisíc resp. 15 tisíc).

Medzi ďalšie plány patria:
  • oprava vzorov
  • spájanie podobných slov do zhlukov (ročný, dvojročný, ...) a ich popis
  • vyhľadávanie stupňovania, negácie
  • slová, ktoré sa líšia len v diakritike (obvykle preklep)
  • výber slov s rozumnou frekvenciou (zatiaľ neviem koľko je rozumná a ani ako to vlastne merať)
  • prejsť a označiť +/- aspoň pár tisíc prídavných mien

piatok 11. apríla 2008

Hľadanie v korpuse II

Tak trochu neočakávane sa mi dnes podarilo dosiahnu obe položky zo včerajšieho ToDo-listu. Pri jednoduchých vzoroch (napr. pekný) si dokážem vziať všetky potrebné údaje zo vzoru definovaného v Languste. Samozrejme, že ak tam sú komplikovanejšie zmeny vo vzore, tak to bude ešte nemálo roboty, ale zatiaľ to stačí. Napísať tento generátor by nebol až taký problém, keby nie kombinácie Perl & RegExp &Unicode. Samozrejme, že sa mi podarilo dosiahnuť SEGFAULT :( Nakoniec som ich nahradil za prácu s podreťazcami a všetko funguje, aj keď pomalšie.

Keďže už funguje generátor, tak som ho otestoval aj na predložke pre (frekvencia ~700K). Aj keď sa frekvencia zdvihla len o polovicu, tak počet výsledkov sa zdvihol na štvornásobok. Počet false-positive sa zdvihol zo skoro zanedbateľného množstva na priveľa. Neznamená to, že je chyba v algoritme ako sa na prvý pohľad zdá. Ale fakt, že napr. slovo balení by úplne kľudne mohlo byť základným tvarom prídavného mena. Ak by sme mali vo vzoroch aj vysvedčenie, tak by tieto slová mali stále viac než jeden možný vzor a nemali by sme žiaden výsledok. Existuje ešte pár prípadov, kde nám iné slová smú robiť nejaké problémy, ale ich počet je dosť nízky. Tento problém je ešte výraznejší pri podstatných menách, kde vďaka tomu vzniká takmer dokonalý chaos. Úplne rovnaký problém som riešil aj v Languste, kde som sa nakoniec rozhodol, že sa nebudem pokúšať vytvoriť základný tvar slova. Tam som mal, ale využíval len zoznam slovných tvarov, použitie pádov v predložkových väzbách by mohlo výrazne pomôcť.

ToDo:
  • pridať vzor vysvedčenie
  • prepočítať predložky pre a pri [kvôli novému vzoru]
  • pridať ďalšiu predložky a vyskúšať, že aký má zmysel spájať medzivýsledky

streda 9. apríla 2008

Hľadanie v korpuse

Trvalo mi dosť dlho, kým som sa vysekal z prevádzkových problémov a mohol sa venovať zase niečomu zaujímavejšiemu :) Pretože som momentálne nahradil poker za scrabble, tak som si povedal, že prečo nespaviť program proti ktorému by sa dalo hrať. Ja viem, že to chce dostatočnú slovnú zásobu a vhodnú stratégiu. Zatiaľ budem spokojný ak to bude schopné hrať písomné súťaže, kde hrá človek po sebe dva ťahy. Tam stratégiu netreba, jednoducho sa vyskúšajú všetky možnosti (a zatiaľ nemám ani predstavu ako dlho by to trvalo).

Na toto je treba slušnú morfologickú databázu, alebo aspoň zoznam platných slov. Pretože taká veľká morfologická databáza sa dá použiť aj v úplne bežných veciach ako je fulltextové vyhľadávanie, tak som sa do toho pustil. Ako to robiť poloautomaticky som navrhol už v diplomke (rýchlosť pridávania cca 300 slov / hodinu). Na to, aby som to takto robil som však príliš lenivý. A tak som sa rozhodol použiť veľký korpus (SNK - 300 miliónov).

V neoznačkovanom (či v tomto prípade štatisticky označkovanom) korpuse sa nedá spoliehať na nič okrem slovných tvarov. Ako som už predtým zistil jedna z najťažších vecí je nájsť, čo je vlastne základný tvar (lemma). V podstate sa nie poriadne čoho chytiť. Ak vychádzame len zo slov, tak je to dosť dobré pre človeka, ale všetko automatické dávalo hrozné (potrebujeme skoro 100%) výsledky. Jediná vec, ktorú ma napadlo použiť sú predložky. Najma tie, ktoré sa viažu len s jedným pádom. Okamžite totiž vieme pád a to sa dá slušne využiť, pretože lemma sa dá tipnúť (tj. vyskúšať všetky možnosti - vďaka kritériam na priradeniu do vzoru sa zbavíme najvačších hlúpostí.)

Zatiaľ som robil pokusy len s prídavnými menami a predložkou pri (frekvencia ~500K). Po úvodnom spracovaní som získal asi 30K možných priradení slov k lemma/vzor. To vyzeralo asi takto:

absurdnej:k2gFnSc6d1:absurdn
absurdnej:k2gFnSc6d1:absurdni
absurdnej:k2gFnSc6d1:absurdní
absurdnej:k2gFnSc6d1:absurdny
absurdnej:k2gFnSc6d1:absurdný
absurdných:k2gMnPc6d1:absurdn
absurdných:k2gMnPc6d1:absurdný
Z toho sa mi podarilo vybrať len tie varianty, ktoré pripadali do úvahy. To za mňa spravila Langusta (generátor a GUI na pridávanie slov) a už hotové vzory pre prídavné mená. Následne som získal:


absurdnej:k2gFnSc6d1:absurdní:[vtáčí]
absurdnej:k2gFnSc6d1:absurdný:[pekný]
absurdných:k2gMnPc6d1:absurdný:[pekný]


A to už vyzerá omnoho lepšie. Posledným krokom je nechať len tie dvojice (lemma:vzor), ktoré sú v prieniku existujúch. V tomto prípade to bude len 'absurdný:pekný'. Je vidno, že taká koncovka -ej mi je pri prídavných menách vcelku nanič, pretože patrí do každého vzoru. Aj napriek tomu sa podarilo nájsť 4117 prídavných mien a ich základných tvarov. Samozrejme, že časť z toho budú preklepy - ale budú určené správnou značkou. Objavilo sa aj pár (<10) style="font-style: italic;">kí, (zo slova dom) - ktoré bude treba neskor označiť, pretože by mali mať málo výskytov. Toto sa, ale chystám riešiť až keď bude tých výsledkov viac.

ToDo:
  • overiť aj na predložke pre
  • generovať tieto pravidlá z existujúcich vzorov (to nebude až tak ľahké a niekedy ani možné)