Dansk introduktion

From Apertium
Jump to navigation Jump to search

Open Source maskinoversættelse med Apertium

Introduktion

Vi er nok mange der kender problemet: Man har en tekst på dansk og skal bruge den på engelsk. Eller omvendt. Eller man har noget på russisk, og man vil meget gerne lige se om netop det svar man søger måske står i teksten, men kan ikke et ord russisk.

Heldigvis har vi jo Google Oversæt: Vupti, ind med teksten på http://translate.google.com/ og ud kommer en mere eller mindre forståelig oversættelse af teksten.

Men... se nu hvad der sker hvis vi tager en tilfældig side (fra svensk wikipedia) og oversætter til dansk:

Trakterna kring Fredriksberg räknas som bebodda sedan 1600-talet.

Google Oversæt giver:

Områderne omkring Fredriksberg tælles som har været besat siden 1600-tallet.

Hmm... er Google nu egentlig en hjælp?

Den rigtige oversættelse er:

Områderne omkring Fredriksberg regnes som beboede siden 1600-tallet.

Generelt skelner man mellem to brugssituationer:

  • Formidling - maskinoversættelsen giver en råtekst til efterredigering. Målet er at få redigeringsdistancen (dvs antal rettelser der skal til for at rette maskinoversættelsen så den er acceptabel som en rigtig oversættelse) så langt ned som muligt.
  • Forståelse - man kan ikke forstå kildesproget (f.eks. russisk) og bruger derfor en maskine til at lave en oversættelse som man kan forstå.

Google Oversæt har problemer på begge fronter: Redigeringsdistancen er ikke ret meget mindre i forhold til bare at rette den svenske tekst, og forståelsen er gået fløjten (beboet -> besat).

Apertium svensk-dansk

Apertium er et open source maskinoversættelsessystem med p.t. over 20 sprogpar og mange flere undervejs.

Apertium er unikt, fordi:

  • ikke blot maskinoversættelsesmotoren, men også alle sprogdata og alle supplerende værktøjer er frigivet under GPL
  • det har et meget aktivt og hjælpsomt miljø omkring sig
  • det kan udvikles uden at have en universitetsgrad i hverken lingvistik eller IT
  • det er hurtigt voksende og omfattende. Således er der blot de sidste 2 måneder kommet engelsk-esperanto, nynorsk-bokmål og svensk-dansk til

Alle sprogpar kan bruges fra http://apertium.org/, men kan også nemt hentes og installeres på UNIX-baserede systemer. Dertil kommer at det findes i som en del af standarddistribtionen af Ubuntu, desværre i en gammel udgave, så vi installerer det fra bunden, hvilket heldigvis ikke er så svært.

Først de nødvendige forudsætninger:

sudo apt-get install git build-essential g++ pkg-config libxml2 libxml2-dev libxml2-utils xsltproc flex automake autoconf libtool libpcre3-dev

Dernæst lttoolbox (en 'lingvistisk værktøjskasse' som Apertium afhænger af), og så Apertium selv (man kan kopiere nedenstående instrukser fra http://bit.ly/5K45lb eller http://wiki.apertium.org/wiki/Dansk_introduktion):

mkdir apertium
cd apertium

git clone https://github.com/apertium/lttoolbox
cd lttoolbox
sh autogen.sh
make
sudo make install
sudo ldconfig
cd ..

git clone https://github.com/apertium/apertium
cd apertium
sh autogen.sh
make
sudo make install
sudo ldconfig
cd ..

git clone https://github.com/apertium/apertium-swe-dan
cd apertium-swe-dan
sh autogen.sh
make
sudo make install
cd ..


Par skal installeres samme sted som Apertium, i /usr/local/ (så brugte du standardpakkerne i Debian ovenfor skal du skrive: sh autogen.sh --prefix=/usr, ellers kan Apertium ikke finde dit sprogpar).

Nu er vi klar til at prøve en hel oversættelse. Apertium er lavet helt i UNIX-ånden og virker naturligvis med en pipe:

echo "Trakterna kring Fredriksberg räknas som bebodda sedan 1600-talet" | apertium sv-da


Resultatet kommer prompte:

*Trakterna omkring *Fredriksberg regnes som *bebodda siden 1600-talen


Stjerner er ord som Apertium sv-da p.t. ikke kender (men det har jo åben kildekode, så det kan vi jo lave om på - mere herom i en senere artikel). Den slags advarsler kan fjernes med parameteren -u hvis man helst er fri for dem.

Man kan også oversætte filer, i de mest almindelige formater (txt, html, rtf, odt, docx og et par andre) med parameteren -f.

Her prøver jeg at oversætte artiklen her til svensk.

apertium -u -f odt da-sv apertium-dkuug-artikel.odt artikel-svensk.odt


Første afsnit af artiklen her bliver oversat af Apertium med:

Vi är nog många dit känner problemet: Man har en text på danska och skal brukar den på engelska. Eller omvende. Eller man har något på ryska, och man vill mycket gerne lika se om just det svara man søg kanske står i texten, mena kan icke et ord ryska.

Retningen fra dansk til svensk er ikke klar endnu (her bliver det rart med -u), så resultatet bliver blandet:

$ echo "Retningen fra dansk til svensk er ikke klar endnu (her bliver det rart med -u), så resultatet bliver blandet:" | apertium da-sv -u

Riktningen från danska til svenska är icke klara ännu (hit blir det behagfull med -u), så resultatet blir bland:


Dog er det nok stadig hurtigere at efterredigere denne tekst end at skulle oversætte den danske tekst fra bunden af.

Hvordan virker det? - forklaring for de viderekomne

Præcist hvordan oversættelsen skal foregå, dvs hvilke led der skal gås igennem, styres ved gode gammeldaws UNIX-pipes. For svensk → dansk står det i filen modes/sv-da.mode (i /usr/share/apertium/ eller hvor det nu ligger):

lt-proc sv-da.automorf.bin |

apertium-tagger -g sv-da.prob |

apertium-pretransfer |

apertium-transfer apertium-sv-da.sv-da.t1x sv-da.t1x.bin sv-da.autobil.bin |

lt-proc -g sv-da.autogen.bin


Her kommer en kort forklaring på hvert trin i pipen (normalt er det kun udviklere der har brug for at forstå principperne jeg her forklarer, så fortvivl ikke hvis du syns det er lidt svært at overskue).

For nemheds skyld starter jeg i den modsatte retning, med dansk → svensk, så jeg kan forklare de første trin med danske eksempler.

Det første trin (lt-proc) laver en morfologisk analyse hvor overfladeformen af hvert ord bliver oversat til leksikalsk form. F.eks bliver ordet 'husenes' oversat til hus<n><nt><pl><def><gen> hvilket betyder 'hus' navneord, intetkøn, flertal, bestemt form, genitiv:

$ echo "Husene" | lt-proc da-sv.automorf.bin

^Husene/Hus<n><nt><pl><def><nom>$


$ echo "Hunden ser katten slås" | lt-proc da-sv.automorf.bin

^Hunden/Hund<n><ut><sg><def><nom>$ ^ser/se<vblex><pres><actv>$ ^katten/kat<n><ut><sg><def><nom>$ ^slås/slå<n><ut><sg><ind><gen>/slå<vblex><pres><pasv>/slå<vblex><inf><pasv>$


Så 'ser' er verbet 'se' i nutid (præsens - <pres>) aktiv. 'katten' er navneordet 'kat' der er fælleskøn (utrum - <ut>), ental (singularis - <sg>).

Men hvad sker der med 'slås'? Jo, det er flertydigt, det kan både en slå, dvs en krog til at lukke en dør med ('bag lås og slå') i ejeform 'en slås form', og så kan det være udsagnsordet 'slå' i infinitiv passiv ('der slås græs'). Her skal der vælges og en række alternativer står med skråstreger / imellem.

Det næste trin, taggeren, vælger hvad der mon menes:

$ echo "Hunden ser katten slås" | lt-proc da-sv.automorf.bin | apertium-tagger -g da-sv.prob

^Hund<n><ut><sg><def><nom>$ ^se<vblex><pres><actv>$ ^kat<n><ut><sg><def><nom>$ ^slå<n><ut><sg><ind><gen>$


Overfladeformerne er væk fra datastrømmen og der er valgt præcis ét alternativ (så alle skråstreger er væk).

Her vælges desværre det forkerte 'slå' (navneordet), og det illustrerer et af de mange klassiske problemer som maskinoversættelsessystemer (incl Apertium) slås med. Her skyldes det dog at taggeren ikke er korrekt trænet for dansk (det er indtil videre kun svensk → dansk der er offentliggjort).

Det tredje trin apertium-pretransfer klarer en detalje omkring multiord (f.eks 'vågne op', 'byde velkommen', 'finde på' er bedre at behandle som ét ord) hvor de grammatiske mærker skal flyttes til sidst (^vågne<vblex><pres><actv># op$ bliver til ^vågne# op<vblex><pres><actv>$)

I det fjerde trin, apertium-transfer, bliver ordene i fra kildesproget erstattet med ord på målsproget, og samtidig bliver et sæt regler for, hvordan oversættelse mellem de to sprog skal ske, anvendt.

Lad os nu gå over til eksempler fra svensk → dansk igen. Sætningen 'Den stora hunden vaknar.' ser, lige før apertium-transfer, sådan her ud:

^Den<det><def><ut><sg>$ ^stor<adj><pst><un><pl><ind>$ ^hund<n><ut><sg><def><nom>$ ^vakna<vblex><pres><actv>$^.<sent>$

På dansk bruger vi ikke dobbelt bestemt form, så 'Den<def> store hunden<def>' skal laves om til 'Den<def> store hund<ind>' (<def>=definit/bestemt form, <ind>=indefinit/ubestemt form). Samtidig skal 'vakna' erstattes med 'vågne op' (de andre ord bliver også erstattet, men de hedder det samme på dansk og svensk)

^Den<det><def><ut><sg>$ ^stor<adj><pst><un><pl><ind>$ ^hund<n><ut><sg><ind><nom>$ ^vågne<vblex><pres><actv># op$^.<sent>$


Det sidste trin laver det modsatte af det første trin; morfologisk genering, dvs sørger for at oversætte de leksikalsk former til overfladeformer:

echo "^Den<det><def><ut><sg>$ ^stor<adj><pst><un><pl><ind>$ ^hund<n><ut><sg><ind><nom>$ ^vågne<vblex><pres><actv># op$^.<sent>$" | lt-proc -g sv-da.autogen.bin

Den store hund vågner op.


Apertium lægger uden om disse et de-formattering og et re-formatteringsfilter så man kan oversætte f.eks HTML eller ODF-filer.

Her ses de forskellige trin på skematisk form:


[[Image:]]

Som sagt sker de ovenstående trin uafhængigt af hinanden, med pipes, og derfor kan ethvert element udskiftes eller udbygges efter behov. Det giver en meget stor fleksibilitet (som også er nødvendig da vi har med sprog at gøre).

For eksempel får taggeren i trin to, der vælger i tilfælde af tvetydigheder baseret på statistiske metoder (skjulte markovkæder), ofte en 'forbrænder' på som på forhånd udelukker nogle muligheder ud fra nogle regler (GramTrans' Constraint Grammar - også under GPL).

Der er også mange sprogpar som bruger tre eller flere undertrin i det fjerde trin (transfer), for at fange dybere sproglige strukturer end det er nødvendigt at fange mellem dansk og svensk (for f.eks. engelsk-esperanto er der 5 undertrin).


Boks 1

[[Image:]]Svensk-dansk blev hovedsageligt lavet af Michael Kristensen der fik et af Googles sommerstipender (Google Summer of Code - SCoC) til arbejdet over sommeren 2009.

I 2010 er igen stipendier fra Google på ca. 27000 kr til studerende der vil arbejde med Open Source. Interesserede bør kontakte Jacob allerede i marts måned. Der er også foredrag om GSoC i Ballerup onsdag den 3. marts kl 15.15 i lokale X1.80 på Ingeniørhøjskolen i København, se http://dejo.dk/gsoc .


Boks 2

Jacob Nordfalk er ekstern lektor på Ingeniørhøjskolen i København og medudvikler på Apertium, hvor han har lavet esperanto-engelsk. I foråret 2009 var han mentor på udviklingen af det svensk-danske sprogpar.

Jacob er interesseret i at finde folk der vil samarbejde omkring Apertium og holder gerne foredrag om det:

Boks 3

Se også:

- http://apertium.org - Apertiums hjemmeside

- http://wiki.apertium.org - wiki med masser af hjælp

- IRC-kanalen #apertium på irc.oftc.net - hjælp til alt om Apertium, ca. 20 timer i døgnet.

- http://gramtrans.com/ - Den bedste maskinoversætter mellem svensk og dansk (desværre ikke med åben kildekode).

- http://hdl.handle.net/10045/12024 artikel om det svensk-danske sprogpar