Difference between revisions of "Apertium, Tvorba novej dvojice jazykov"
Line 782: | Line 782: | ||
*[[Building dictionaries]] |
*[[Building dictionaries]] |
||
*[[Finding_errors_in_dictionaries]] |
|||
*[[Cookbook]] |
*[[Cookbook]] |
||
*[[Chunking]] |
*[[Chunking]] |
||
Line 789: | Line 790: | ||
[[Category:HOWTO]] |
[[Category:HOWTO]] |
||
[[Category:Writing dictionaries]] |
[[Category:Writing dictionaries]] |
||
[[Category:Quickstart]] |
Latest revision as of 07:05, 16 February 2015
Apertium - Tvorba novej dvojice jazykov
Tento dokument popíše, ako vytvorit novú dvojicu jazykov pre Apertium, systém pre strojový preklad, od začiatku.
Nepredpokladá žiadne znalosti ohľadom ligvistiky alebo strojového prekladu okrem schopnosti rozlišovať slovné druhy.
Úvod[edit]
Apertium je, ako ste si už pravdepodobne uvedomili, systém pre strojový preklad. Nie je to však presné, ide o platformu pre strojový preklad. Poskytuje podklad a nástroje ktoré vám umožnia vybudovať si takýto systém. Jediné, čo musíte robiť, je poskytnúť mu dáta, obsahujúce trojicu slovníkov a pravidlá pre poradie slov a gramatiku.
Pre podrobnejší úvod do fungovania celého systému, na stránke Publications nájdete výborné zdroje.
Čo budete potrebovať[edit]
- lttoolbox (>= 3.0.0)
- libxml utils (xmllint etc.)
- apertium (>= 3.0.0)
- textový editor (alebo XML editor)
Inštaláciu týchto programov popisuje dokumentácia projektu Apertium.
Z čoho pozostáva jazyková dvojica?[edit]
Apertium je systém s plytkým prenosom pre strojový preklad. To znamená, že pracuje zo slovníkmi a pravidlami na preklad, na rozdiel od systémov s hlbokým prenosom, ktoré vykonávajú plnú syntaktickú analýzu. Pravidlá obyčajne popisujú operácie nad skupinami lexikálnych jednotiek, nie nad syntaktickými stromami. V podstate obsahuje trojicu slovníkov:
- Morfologický slovník pre jazyk xx obsahuje pravidlá pre skloňovanie a časovanie slov v jazyku xx. V našom príklade sa bude nazývať
apertium-sh-en.sh.dix
- Morfologický slovník pre jazyk yy obsahuje pravidlá pre skloňovanie a časovanie slov v jazyku yy. V našom príklade sa bude nazývať code>apertium-sh-en.en.dix
- Dvojjazyčný slovník obsahuje spojenia medzi slovami a symbolmi oboch jazykov. V našom príklade sa bude nazývať
apertium-sh-en.sh-en.dix
Oba jazyky vo dvojici môžu byť rovnako cieľ aj zdroj prekladu.
Taktiež existujú dva súbory pre pravidlá prepisu. Tieto pravidlá riadia poradie slov vo vete, ako napr. chat noir -> cat black -> black cat. Naviac riadia zhody v rode, čísle atď. Tieto pravidlá môžu vkladať alebo mazať lexikálne položky, ako bude popísané neskôr. Tieto súbory sú:
- pravidlá pre prepis z jazyka xx do jazyka yy, popisujúce zmeny jazyka xx pri preklade do jazyka yy. V našom príklade budú v súbore
apertium-sh-en.sh-en.t1x
- pravidlá pre prepis z jazyka yy do jazyka xx, popisujúce zmeny jazyka yy pri preklade do jazyka xx. V našom príklade budú v súbore
apertium-sh-en.en-sh.t1x
Veľké množstvo jazykových dvojíc má aj ďalšie súbory, no tu sa nimi nebudeme zaoberať. Vyššie popísané súbory stačia na vytvorenie funkčného systému.
Dvojica jazykov[edit]
Ako ste už možno zistili z názvov súborov, tento návod použije ako príklad Srbochorváčtiny do Angličtiny, aby vysvetlil spôsob tvorby základného systému. Nie je to ideálna dvojica, pretože systém pracuje lepšie pre príbuzné jazyky, no nebude to problém pre jednoduché príklady použité v dokumente.
Krátka poznámka o pojmoch[edit]
Je zopár pojmov, ktoré treba chápať pre tvorbu novej dvojice.
Prvý je lemma. Lemma je základný tvar slova, ako býva uvedená v slovníkoch. Napríklad lemma slova mačkami je mačka. V Angličtine to bude väčšinou jednotné číslo podstatného mena, alebo neurčitok slovesa bez to.
Ďalší pojem je symbol. V kontexte systému Apertium, symbol je gramatická vlastnosť. Slovo mačky je množné číslo podstatného mena, preto bude mať symboly podstatné meno a plurál. Na vstupe a výstupe modulov pre Apertium, symboly bývajú väčšinou určené medzi ostrými zátvorkami:
<n>
; for noun.<pl>
; for plural.
Iné príklady symbolov sú <sg> singular, <p1> prvá osoba, atď. Napísané v ostrých zátvorkách, symboly môžu byť označované ako tagy. Je vhodné poznamenať, že v časti dvojíc jazykov sú mená symbolov vytvorené skrátením Katalánčiny, ako napríklad vbhaver, vb (verb) a haver ("mať" v Katalánčine). Symboly sú definované v <sdef> tagoch a používane v <s> tagoch.
Tretí výraz je paradigma. V systéme Apertium, paradigma popisuje príklad, ako sa určitá skupina slov ohýba. V morfologickom slovníku sú lemmy spojené s paradigmami, ktoré nám dovolujú popisovať, ako sa daná lema ohýba bez toho, aby sme museli vypisovať všetky koncovky.
Ako príklad užitočnosti paradigiem, keby sme chceli uložiť dve anglické prídavné mená happy a lazy, namiesto okladania dva krát tej istej veci:
- happy, happ (y, ier, iest)
- lazy, laz (y, ier, iest)
Môžeme jednoducho uložiť jedno a potom povedať "lazy, skloňuje sa ako happy", ale aj shy, skloňuje sa ako happy", "naughty, skloňuje sa ako happy", "friendly, skloňuje sa ako happy", atď. V tomto príklade, happy by bolo paradigmou, modelom pre ohýbanie iných slov. Presná definícia bude vysvetlená o chvíľu. Paradigmy sú definovaný tagom <pardef>, používané tagom <par>.
Začíname[edit]
Jednojazyčné slovníky[edit]
- See also: List of dictionaries and Incubator
Začnime tvorbou nášho prvého slovníka. Slovník je XML súbor. Spustite váš textový editor a napíšte:
<?xml version="1.0" encoding="UTF-8"?> <dictionary> </dictionary>
Zatiaľ tento súbor definuje, že chcemem vetvoriť slovník. Aby bol užitočný, treba pridať viac vstupov, prvým je abeceda. Definuje množinu písmen použivaných v Srbochorvátskom slovníku. Bude vyzerať nasledovne, obsahuje všetky znaky Srbochorvátskej abecedy:
<alphabet>ABCČĆDDžĐEFGHIJKLLjMNNjOPRSŠTUVZŽabcčćddžđefghijklljmnnjoprsštuvzž</alphabet>
Abecedu umiestnite pod tag <dictionary>.
Ďalej musíme definovať symboly. Začnime so základmi, podstatné meno (n) môže byť v singulári (sg) alebo v pluráli (pl).
<sdefs> <sdef n="n"/> <sdef n="sg"/> <sdef n="pl"/> </sdefs>
Mená symbolov nemusia byť krátke, no pretože ich budete opakovane písať, je výhodné ich skrátiť.
Naneštastie, nie je to také jednoduché, podstatné mená v Srbochorváčtine skloňuje okrem čísla aj rod a pád. Pre náš príklad však budeme predpokladať, že podstatné mená budú mužského rodu v nominatíve (kompletný príklad nájdete na konci dokumentu).
Ďalej definujeme časť obsahujúcu paradigmy:
<pardefs> </pardefs>
a slovníkovú časť:
<section id="main" type="standard"> </section>
Sú dva typy sekcií, štandardná sekcia obsahujúca slová, príklonky atď. Druhý typ je inconditional section, ktorá obyčajne obsahuje iterpunkciu atp. Takúto sekciu ešte nemáme.
Takže, náš súbor by mal vyzerať nasledovne:
<?xml version="1.0" encoding="UTF-8"?> <dictionary> <sdefs> <sdef n="n"/> <sdef n="sg"/> <sdef n="pl"/> </sdefs> <pardefs> </pardefs> <section id="main" type="standard"> </section> </dictionary>
Keď teraz máme kostru, môžeme začať pridaním podstatného mena. Podstatné meno bude 'gramofon' (čo znamená gramofón).
Prvú vec, ktorú musíme spraviť, je definovať paradigmy, pretožie ešte žiadne nemáme.
Používame nominatív a mužský rod, pridáme teda len paradigmu pre singulár 'gramofon' a plurál 'gramofoni':
<pardef n="gramofon__n"> <e><p><l/><r><s n="n"/><s n="sg"/></r></p></e> <e><p><l>i</l><r><s n="n"/><s n="pl"/></r></p></e> </pardef>
Poznámka: tag '<l/>' (ekvivalnetné s <l></l>) znamená, že už netreba nič pridať ku kmeňu slova v singulári.
Možno to vyzerá ako celkom dlhý spôsob, ako to opísať, no je odôvodnený a rýchlo sa vám stane prirodzený. Zrejme vás zaujíma čo znamená <e>, <p>, <l> a <r>. Takže:
- e znamená záznam (entry).
- p znamená dvojicu (pair).
- l znamená ľavý (left).
- r znamená pravý (right).
Prečo pravý a ľavý? Morfologický slovík bude skompilovaný do konečného automatu. Kompilácia zľava doprava analyzuje slová, a kompilácia zprava doľava vytvára z analýzy slová. Napríklad:
* gramofoni (left to right) gramofon<n><pl> (analýza) * gramofon<n><pl> (right to left) gramofoni (tvorba)
Teraz sme definovali paradigmu, potrebujeme ju spojiť s príslušnou lemmou, gramofon. Vložíme to teda do sekcie ktorú sme definovali.
Záznam pre túto sekciu vyzerá nasledovne:
<e lm="gramofon"><i>gramofon</i><par n="gramofon__n"/></e>
Rýchle rekapitulovanie skratiek:
- lm znamená lemma.
- i znamená identitu (zľava a sprava vyzerá rovnako).
- par znamená paradigmu.
Tento záznam popisuje lemmu slova gramofon, a jej koreň, gramofon, a paradigmu ktorá skloňuje gramofon_n. Rozdiel medzi lemmou a koreňom je že lemma je slovo v základnom tvare a koreň je jeho časť, ku ktorej sa pridávajú rôzne prípony. Bude to jasnejšie keď ukážeme záznam, kde sú tieto dve rozdielne.
Teraz sme pripravenú vyskúšať náš slovník. Uložte ho, a vráťte sa do príkazového riadku. Najprv ho potrebujete skomilovať (s lt-comp) a potom otestovať (s lt-proc).
$ lt-comp lr apertium-sh-en.sh.dix sh-en.automorf.bin
By malo vypísať:
main@standard 12 12
Pri kompilovaní zľava doprava vyrábame analyzátor. Vytvorme teda aj generátor.
$ lt-comp rl apertium-sh-en.sh.dix sh-en.autogen.bin
V tomto štádiu, by mal príkaz vypísať presne to isté.
Teraz ho môžeme otestovať. Spustite lt-proc na analyzátore:
$ lt-proc sh-en.automorf.bin
Na otestovanie, napíšte gramofoni (gramofóny) a sledujte výsledok:
^gramofoni/gramofon<n><pl>$
Anglický slovník by sa konštruoval obdobne, len by sa nahradilo slovo gramofon anglickým výrazom gramophone a zmenil by sa tvar plurálu. Čo ak by ste však chceli použiť správnejšie slovo 'record player'? To vysvetlíme neskôr.
Teraz by ste mali mať v priečinku dva súbory:
- apertium-sh-en.sh.dix obsahujúci základný srbochorvátsky morfologický slovník, a
- apertium-sh-en.en.dix obsahujúci základný anglický morfologický slovník
Dvojjazyčný slovník[edit]
Teraz mámem dva morfologické slovníky, ďalší krok je tvorba dvojjazyčného slovníka, opisujúceho mapovanie medzi slovami. Všetky slovníky používaju ten istý formát, špecifikovaný v DTD, dix.dtd.
Vytvorte nový súbor, apertium-sh-en.sh-en.dix, a pridajte základnú kostru.
<?xml version="1.0" encoding="UTF-8"?> <dictionary> <alphabet/> <sdefs> <sdef n="n"/> <sdef n="sg"/> <sdef n="pl"/> </sdefs> <section id="main" type="standard"> </section> </dictionary>
Teraz potrebujeme pridať záznam na preklad medzi dvoma slovami:
<e><p><l>gramofon<s n="n"/></l><r>gramophone<s n="n"/></r></p></e>
Pretože tu bude veľa takýchto záznamov, bývajú obyčajne kvôli čitateľnosti písané na jeden riadok. Znova používame 'l' a 'r'. Pri kompilácii zľava dostaneme preklad Srbochorváčtina → Angličtina a pri kompilácii zprava dostaneme preklad Angličtina → Srbochorváčtina.
Keď je toto hotové, spustite nasledujúce príkazy:
$ lt-comp lr apertium-sh-en.sh.dix sh-en.automorf.bin $ lt-comp rl apertium-sh-en.en.dix sh-en.autogen.bin $ lt-comp lr apertium-sh-en.en.dix en-sh.automorf.bin $ lt-comp rl apertium-sh-en.sh.dix en-sh.autogen.bin $ lt-comp lr apertium-sh-en.sh-en.dix sh-en.autobil.bin $ lt-comp rl apertium-sh-en.sh-en.dix en-sh.autobil.bin
Aby ste vygenerovali morfologické analyzátory (automorf), morfologické generátory (autogen) a vyhľadávač slov (autobil, bil ako bilingválny).
Pravidlá prenosu[edit]
Teraz máme dva morfologické slovníka a dvojjazyčný slovník. Všetko, čo potrebujeme, sú pravidlá na prenos podstatných mien. Súbory popisujúce tieto pravidlá majú vlstný DTD (transfer.dtd), ktorý môžete nájsť v balíčku Apertium. Ak potrebujete vytvoriť pravidlo, často je dobrý nápad nazrieť do súborov pravidiel iných jazykových dvojíc. Veľa pravidiel môže byť znovu použitých aj medzi jazykmi. Napríklad, tento konkrétky popísaný nižie by bol užitočný pre každý jazyk so zamlčaným podmetom
Začnime ako obyčajne so základnou kostrou:
<?xml version="1.0" encoding="UTF-8"?> <transfer> </transfer>
V tejto chvíli, pretože ignorujeme pády, stačí len vytvoriť pravidlo, ktoré načíta gramatické symboly a zase ich vypíše. At the moment, because we're ignoring case, we just need to make a rule that takes the grammatical symbols input and outputs them again.
Najprv musíme definovať kategórie a atribúty. Obe nám dovoľujú spájať gramatické symboly. Kategórie umožňujú spájať symboly za účelom párovania (napríklad 'n.*' sú všetky podstatné mená). Atribúty zase spájajú skupiny symbolov, z ktorých sa môžu symboly vyberať, napríklad 'sg' a 'pl' môžu byť spojené v atribúte číslo ('number'). We first need to define categories and attributes. Categories and attributes both allow us to group grammatical symbols. Categories allow us to group symbols for the purposes of matching (for example 'n.*' is all nouns). Attributes allow us to group a set of symbols that can be chosen from. For example ('sg' and 'pl' may be grouped a an attribute 'number').
Pridajme teda potrebné sekcie:
<section-def-cats> </section-def-cats> <section-def-attrs> </section-def-attrs>
Pretože iba skloňujeme podstatné mená v singulári a pluráli, potrebujeme pridať kategóriu pre podstatné mena a atribút pre číslo:
Do section-def-cats pridajte:
<def-cat n="nom"> <cat-item tags="n.*"/> </def-cat>
Toto zachytí všetky podstatné mená (lemmy nasledované <n>, potom hocičím) a pomenuje ich "nom" (neskôr to využijeme).
Do sekcie section-def-attrs, pridajte:
<def-attr n="nbr"> <attr-item tags="sg"/> <attr-item tags="pl"/> </def-attr>
a potom and then
<def-attr n="a_nom"> <attr-item tags="n"/> </def-attr>
Prvý definuje atribút nbr (číslo), ktoré môže byť buď singulár alebo plurál.
Druhý definuje atribút a_nom (atribút podstatné meno).
Ďalej potrebujeme pridať sekciu pre globálne premenné:
<section-def-vars> </section-def-vars>
Tieto premenné sú používané na ukladanie alebo prenos atribútov medzi pravidlami. Na teraz potrebujeme len jedno,
<def-var n="number"/>
Nakoniec, potrebujeme pridať pravidlo, ktoré vyberie podstatné meno a vypíše ho v správnom tvare. Budeme potrebovať sekciu pravidiel...
<section-rules> </section-rules>
Zmením tempo z predchádzajúcich príkladov, len sem vložím toto pravidlo a potom ho opíšem.
<rule> <pattern> <pattern-item n="nom"/> </pattern> <action> <out> <lu> <clip pos="1" side="tl" part="lem"/> <clip pos="1" side="tl" part="a_nom"/> <clip pos="1" side="tl" part="nbr"/> </lu> </out> </action> </rule>
Prvý tag je zrejmý, definuje pravidlo. Druhý tag, pattern, v zásade hovorí: "použi toto pravidlo, ak nájdeš tento vzor". V tomto príklade tento vzor pozostáva z jediného podstatného mena (definovného kategóriou nom). Všimnite si, že vzor je napárovaný s najdlším výskytom najprv. Takže ak máte tri pravidlá, prvé zachytáva "<prn><vblex><n>", druhé zachytáva "<prn><vblex>" tretie zachytáva "<n>", a bol zachytený vzor, a vykonané pravidlo bude to prvé.
Pre každý vzor existuje akcia, ktorá produkuje výstup. Tento výstup je lexikálna jednotka (lu).
Tag clip umožnuje používateľovi vybrať a manipulovať atribúty a časti zdrojového jazyka (side="sl"), alebo lexikálne poločky cielového jazyka (side="tl").
Skompilujme a otestuje to. Pravidlá prenosu sú skompilované s :
$ apertium-preprocess-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin
Čo vygeneruje súbor sh-en.t1x.bin
.
Teraz sme takmer pripravení otestovať náš systém pre strojový preklad. Chýba jedna dôležitá časť na určenie slovných druhov (tzv. PoS tagger), no to bude rýchlo vysvetlené. Zatiaľ ho môžeme otestovať v takomto stave:
Najprv, analyzujme slovo, gramofoni:
$ echo "gramofoni" | lt-proc sh-en.automorf.bin ^gramofon/gramofon<n><pl>$
Teraz by PoS tagger vybral správnu verziu podľa slovného druhu, ale keďže ho ešte nemáme, použijeme malý gawk script (vďaka Sergiovi) ktorý vypíše prvú možnosť.
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' ^gramofon<n><pl>$
Teraz pokračujme s pravidlom pre prenos:
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin
Čo vypíše:
^gramophone<n><pl>$^@
- 'gramophone' je lemma (lem) v cielovom jazyku (side="tl") na pozícii 1 (pos="1").
- '<n>' je a_nom v cielovom jazyku na pozícii 1.
- '<pl>' je atribút číslo (nbr) v cielovom jazyku na pozícii 1.
Vyskúšajte zakomentovať niektoré tagy clip, znovu skompilovať a sledovať, čo sa stane.
Takže, teraz máme výstup z prenosu, ostáva len vygenerovať ohnuté tvary na cielový jazyk. Na to použijeme lt-proc, ale v móde generácie (-g), nie analýzy.
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin gramophones\@
A je to! Teraz máte systém pre strojový preklad, ktorý prekladá srbochorvátske podstatné meno na anglické podstatné meno. Očividne ešte nie je veľmi mocný, no dostaneme sa ku komplikovaniejším záležitostiam. Taktiež zachvíľu vysvetlím symbol '@'.
Nájdite iné slová, ktoré sa skloňujú ako gramofon. Skúste ich pridať. Nepotrebujeme pridávať žiadne paradigmy, len záznamy do hlavnej sekcie jednojazyčných a dvojjazyčného slovníka.
Slovesá[edit]
Teraz máme systém, ktorý dokáže prekladať podstatné mená, no nie je veľmi užitočný, chceme prekladať aj slovesá a celé vety! Začnime so slovesom vidieť, aglicky see, srbochorvástky videti. Srbochorváčtina je, na rozdiel od Angličtiny, jazyk so zamlčanými podmetmi, čo znamená že väčšinou nepoužíva osobné zámená pred časovaným slovesom. I see sa do Srbochorváčtiny preloží ako vidim.
- Vidim
- see<p1><sg>
- I see
Poznámka: <p1>
označuje prvú osobu.
Toto sa stane dôležitým pri pravidlách prenosu pre slovesá. Ďalšie príklady jazykov so zamlčaným podmetom sú: Španielčina, Rumunčina a Polština. Taktiež to spôsobuje, že hoci potrebujeme pridať len sloveso do srbochorvátskeho slovníku, do anglického slovníku musíme pridať naviac aj zámená.
Ďalšie tvary slovesa videti sú : vidiš, vidi, vidimo, vidite, vide, korešpondujúce s anglickými tvarmi : you see (singular), he sees, we see, you see (plural), they see.
Existujú dva tvary you see, plurál a formály singulár vidite (vykanie) a neformálny singular vidiš (tykanie). Ideme preložiť vetu "Vidim gramofoni" do "I see gramophones". V záujme miesta, pridáme informáciu len na tento príklad, a necháme vypĺňanie ostatných tvarov časovaného slovesa ako cvičenie pre čitateľa.
Pozorný čitatel si už zrejme uvedomil že nemôžeme preložiť vidim gramofoni pretože to nie je gramaticky správna srbochorvátska veta. Správna veta by bola vidim gramofone, podstatné meno je totiž v akuzatíve. Budeme musieť pridať aj tento tvar, no teraz nepotrebujeme informáciu o pádoch, pridáme ho len ako ďalšiu možnosť pre plurál. Takže len skopírujte 'i' blok a zmente 'i' na 'e'.
Prvú vec, ktorú musíme spraviť, je pridať viac symbolov. Najprv pridáme symbol pre sloveso, ktorý budeme nazývať "vblex" (čo značí lexikálne sloveso, na rozdiel od napr. pomocných slovies). Sloveso má osobu, čas a číslo, takže pridajme symboly aj pre ne. Potrebujeme preložiť "I see", takže osoba bude "p1" a čas "pri", prítomný.
<sdef n="vblex"/> <sdef n="p1"/> <sdef n="pri"/>
Potom, čo sme to spravili, urobíme to isté s podstatnými menami, pridáme paradigmu pre časovanie slovies. Prvý riadok bude:
<pardef n="vid/eti__vblex">
'/' tu značí kde budú pridané prípony (medzi tagmi <l> a </l>).
Potom časovanie pre prvú osobu singuláru bude:
<e><p><l>im</l><r>eti<s n="vblex"/><s n="pri"/><s n="p1"/><s n="sg"/></r></p></e>
'im' je koncovka (ako vo 'vidim'), je potrebné pridať 'eti' do sekcie <r>, pretože to bude useknuté. Zvyšok je jednoduchý, 'vblex' je lexikálne slovesok, 'pri' je prítomný čas, 'p1' je prvá osoba a 'sg' je singulár. Môžeme rovnako pridať plurál, len 'imo' miesto 'im' a 'pl' miesto 'sg'.
Po tomto potrebujeme pridať lemmu, paragdigmu mapujúcu do hlavnej sekcie:
<e lm="videti"><i>vid</i><par n="vid/eti__vblex"/></e>
Poznámka: obsah <i> </i> je koreň, nie lemma. Note: the content of <i> </i> is the root, not the lemma.
Tým sme nateraz dokončili prácu na srbochorvátskom slovníku, skompilujme a otestujme ho.
$ lt-comp lr apertium-sh-en.sh.dix sh-en.automorf.bin main@standard 23 25 $ echo "vidim" | lt-proc sh-en.automorf.bin ^vidim/videti<vblex><pri><p1><sg>$ $ echo "vidimo" | lt-proc sh-en.automorf.bin ^vidimo/videti<vblex><pri><p1><pl>$
Teraz urobíme to isté pre anglický slovník (nezabudnite pridať rovnaké definície symbolov ako do srbochorvátskeho).
Paradigma je:
<pardef n="s/ee__vblex">
pretože minulý čas je 'saw'. Teraz by sme mohli pridať aj prvú a druhú osobu, ale obe majú rovnaký tvar. Všetky, okrem tretej osoby singuláru, majú rovnaký tvar slovesa, teda 'see'. Takže spravíme jeden záznam pre 'see' a dáme mu len 'pri' symbol.
<e><p><l>ee</l><r>ee<s n="vblex"/><s n="pri"/></r></p></e>
a ako vždy, záznam do hlavnej sekcie:
<e lm="see"><i>s</i><par n="s/ee__vblex"/></e>
Uložme, znovu skomilujme a otestujme:
$ lt-comp lr apertium-sh-en.en.dix en-sh.automorf.bin main@standard 18 19 $ echo "see" | lt-proc en-sh.automorf.bin ^see/see<vblex><pri>$
Teraz záznam pre dvojjazyčný slovvík:
<e><p><l>videti<s n="vblex"/></l><r>see<s n="vblex"/></r></p></e>
(znovu, nezabudnite pridať sdef)
A znovu skompilovať:
$ lt-comp lr apertium-sh-en.sh-en.dix sh-en.autobil.bin main@standard 18 18 $ lt-comp rl apertium-sh-en.sh-en.dix en-sh.autobil.bin main@standard 18 18
Otestujme:
$ echo "vidim" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin ^see<vblex><pri><p1><sg>$^@
Analýza zbehla korektne, no keď skúsime generovať výsledný tvar z tohoto, dostaneme '#', ako vidíme nižšie:
$ echo "vidim" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin #see\@
'#' znamená, že generátor nemôže vygenerovať správny lexikálny tvar, pretože ho neobsahuje. Prečo sa to deje?
V podstate, analýza nenašla zhodu pre 'see', pretože v slovníku je see<vblex><pri>, ale see, ktoré dostane analyzátor prenosom je see<vblex><pri><p1><sg>. Srbochorvátska strana slovníka poskytuje viac informácií ako anglická strana vyžaduje. Môžete to otestovať pridaním chýbajúcich symbolov do anglického slovníka a opätovným testom.
Lepší spôsob je však pomocou nového pravidla. Otvoríme teda súbor s pravidlami (apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin
ak ste zabudli).
Potrebujeme pridať novú kategóriu pre sloveso ('verb').
<def-cat n="vrb"> <cat-item tags="vblex.*"/> </def-cat>
Musíme tiež pridať atribúty pre osobu a čas. Spravíme to zatiaľ veľmi jednoduché, môžete pridať aj p2 a p3, ale ja budem šetriť miestom.
<def-attr n="temps"> <attr-item tags="pri"/> </def-attr> <def-attr n="pers"> <attr-item tags="p1"/> </def-attr>
Teraz by sme mali aj pridať atribút slovesám.
<def-attr n="a_verb"> <attr-item tags="vblex"/> </def-attr>
A teraz pravidlo: Now onto the rule:
<rule> <pattern> <pattern-item n="vrb"/> </pattern> <action> <out> <lu> <clip pos="1" side="tl" part="lem"/> <clip pos="1" side="tl" part="a_verb"/> <clip pos="1" side="tl" part="temps"/> </lu> </out> </action> </rule>
Keď se skúsili zakomentovať 'clip' tagy v predchádzajúcom pravidle, a tie potom zmizly z prenosu, tak tu robíme prakticky to isté. Vezmeme sloveso s plnou analýzou, ale vrátime len jej časť (lemma + tag slovesa + tag času).
Ak teda teraz rekompilujeme, dostaneme:
$ echo "vidim" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin ^see<vblex><pri>$^@
a:
$ echo "vidim" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin see\@
Teraz to skúste s 'vidimo' (we see), či dostávame správny výstup.
Teraz to skúste s "vidim gramofone":
$ echo "vidim gramofoni" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin see gramophones\@
But what about personal pronouns?[edit]
To je úžasné, ale stále nám chýba osobné zámeno potrebné v Angličtine. Aby sme ho pridali, musíme najprv pozmeniť anglický morfologický slovník.
Najprv musíme pridať potrebné symboly:
<sdef n="prn"/> <sdef n="subj"/>
prn je prísudok, a subj je podmet.
Pretože tu nie je žiaden koreň, alebo 'lemma' pre osobné zámená, pridáme len nasledovné paradigmy:
<pardef n="prsubj__prn"> <e><p><l>I</l><r>prpers<s n="prn"/><s n="subj"/><s n="p1"/><s n="sg"/></r></p></e> </pardef>
Kde 'prsubj' je 'osobný podmet'. Zvyšok z nich (You, We atď.) je ponechaný ako cvičenie pre čitateľa.
Môžeme pridať záznam do hlavnej sekcie:
<e lm="personal subject pronouns"><i/><par n="prsubj__prn"/></e>
Takže, rekompilujte a testujte, mali by sme dostať niečo ako:
$ echo "I" | lt-proc en-sh.automorf.bin ^I/PRPERS<prn><subj><p1><sg>$
Poznámka: Je to veľkými písmenami pretože 'I' je veľkými písmenami.
Teraz potrebujeme doplniť 'verb' pravidlo, aby vracalo osobné zámeno spolu so správnym tvarom slovesa.
Najprv, pridáme kategóriu (čo sa už zrejme stáva trochu obyčajné):
<def-cat n="prpers"> <cat-item lemma="prpers" tags="prn.*"/> </def-cat>
Teraz pridáme typy prísudkov ako atribúty. Môžeme aj pridať typ 'obj', hoci ho zatiaľ nebudeme potrebovať:
<def-attr n="tipus_prn"> <attr-item tags="prn.subj"/> <attr-item tags="prn.obj"/> </def-attr>
A teraz vstup pre pravidlo:
<rule> <pattern> <pattern-item n="vrb"/> </pattern> <action> <out> <lu> <lit v="prpers"/> <lit-tag v="prn"/> <lit-tag v="subj"/> <clip pos="1" side="tl" part="pers"/> <clip pos="1" side="tl" part="nbr"/> </lu> <b/> <lu> <clip pos="1" side="tl" part="lem"/> <clip pos="1" side="tl" part="a_verb"/> <clip pos="1" side="tl" part="temps"/> </lu> </out> </action> </rule>
Toto je prakticky rovnalé pravidlo ako vyššie, spravili sme len zopár malých zmien.
Potrebovali sme výstup:
^prpers<prn><subj><p1><sg>$ ^see<vblex><pri>$
tak aby mohol generátor vybrať správny prísudok a správny tvar slovesa.
Takže, rýchly prehlad:
<lit>
, vypíše reťazec, v tomto prípade "prpers"<lit-tag>
, vypíše tag, pretože nemôžeme získať tagy zo slovesa, pridáme teda vlastné, "prn" pre prísudok, a "subj" pre podmet., vypíše medzeru.
Všimnite si že sme získali informáciu pre číslo a pád priamo zo slovesa.
Ak teda rekompilujeme a otestujeme znovu:
$ echo "vidim gramofone" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin I see gramophones
Čo, hoci nie je práve oceňované dielo (ako preklad tohoto článku), je cekom presné.
Povedzte mi o svojom digitálnom gramofóne (slovné spojenia)[edit]
Hoci je gramofón anglické slovo, nie je to najpresnejší preklad. Gramofón väčšinou označuje veľmi starý druh prístroja, s ihlou a bez zosilovača. Lepší preklad by bol 'record player'. Je to viacslovné spojenie, no môžeme ho považovať za jedno slovo, ak použijeme konštrukciu multiword.
Nepotrebujeme meniť srbochorvátsky slovník, stačí len anglický a bilingválny.
Plurál 'record player' je 'record players', takže používa rovnakú paradigmu ako gramopnohe (gramophone__n) — len pridávame 's'. Pridáme teda len nový záznam do hlavnej sekcie.
<e lm="record player"><i>record<b/>player</i><par n="gramophone__n"/></e>
Jediný rozdiel je použite tagu , ktorý tiež nie je pre nás úplne nový.
Takže, znovu rekompilujeme a testujeme:
$ echo "vidim gramofone" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin I see record players
Perfektné. Veľká výhoda používania konštrukcie multiword je preklad idióm bez potreby prekladať jednotlivé slová. Napríklad anglická fráza "at the moment" by bola preložená ako "trenutno" (trenutak = chvíľa, trenutno je odvodená príslovnka) — nebolo by možné preložiť túto anglickú frázu slovo po slove.
Ako sa vysporiadať s obmenami[edit]
Srbochorváčtina má zopár spôsobov, ako zapísať každé slovo, kvôli nárečovým odchýlkam. Má totiž fonetický systém písania, teda píš ako počuješ. Napríklad, ľudia hovoriaci po Ijekavsky povedia "rječnik", kým ľudia hovoriaci po Ekavsky povedia "rečnik", čo odráža odlišnosti vo výslovnosti protoslovanskej samohlásky yat.
Analýza[edit]
Mala by byť celkom jednoduchá cesta, ako sa s týmto vysporiadať, a to pomocou paradigiem. Paradigmy niesu pužívané len pre pridávanie gramatických symbolov, ale môžu byť taktiež použité na zámenu znakov za iné. Napríklad, táto paradigma akceptuje aj "e" aj "je" v analýze. Mala by byť jednojazyčnom srbochorvátskom slovíku.
<pardef n="e_je__yat"> <e> <p> <l>e</l> <r>e</r> </p> </e> <e> <p> <l>je</l> <r>e</r> </p> </e> </pardef>
Potom v hlavnej sekcii:
<e lm="rečnik"><i>r</i><par n="e_je__yat"/><i>čni</i><par n="rečni/k__n"/></e>
Toto nám umožnuje analyzovať oba tvary. Na tvorbu oboch tvarov by bolo potrebné viac práce.