Esperantilo Blogo en Esperanto pri projekto Esperantilo kaj komputila lingvistiko

28.5.2007

Pioniroj de esperanta komputila lingvistiko

Filed under: ĝenerale — artur @ 15:08

Komputila lingvistiko ekestis preskaŭ samtempe kun apero de unuaj komputiloj. Esperanto ekzistas jam pli longe ol informatiko. Do interese estus scii, kiam informadikistoj unue ekinteresiĝis pri Esperanto. Mi lastatempe trovis interesan ftp-servilon kun kelkaj maljunaj dosieroj sur: ftp://ftp.stack.nl/pub/esperanto.
Tre interesa estas dosiero translator
kiu enhavas la tradukan programon esperanto-angla.
La programo estas skribita en jaro 1994-1995 de Jui-Yuan Fred Hsu!
Mi pensas, ke la projekto estas lanĉita sur univestitato Cornell. La projekto jam estis sur la GPL permesilo.
Mi trarigardis dosierojn de tiu projekto. Kvankam la aŭtoro skribis en dokumentaro, ke la projekto ne atingis la planitajn celojn, la projekto estis en tre progresinta stato. Interesa estis la tekniko.
La projekto uzas du programajn lingvojn: Lisp kaj C++. La sintaksa analizilo estas skribita en Lispo surbaze de libro: Natural Language Understanding de James Allen. La dosierujo enhavas la kompletan „chart parser“ analizilon de James Allen. Do la tekniko estas tre progresinta. Mi trovis ankaŭ anglan vortaron kun pli ol 30000 vortoj. La libro de Allen kvankam iom maljuna estas rekomendinda kaj mi tuj komencis legi ĝin.

Demandinde estus, kiom da tiaj projektoj kuŝas ie sur forgesitaj diskoj aŭ serviloj. Eble antaŭ la tempo, kiam oni publikigis programojn en la reto. Kiom da horoj programistoj kreis tiajn programojn. Aŭtoroj certe delonge forgesis pri Esperanto, sed datoj ekzistas.

Sur sama servilo mi ankaŭ retrovis aliajn maljunajn programojn. Unu de ili estis programita por sistemo Amiga, kiun mi uzis antaŭ 12 jaroj.

Aliaj projektoj

Mi trovis en reto aliaj projektoj, kiuj temas pri esperanto:

Aliaj novaj programoj

Mi ricevis leteron de Eckhard Stoll, kiu estas aŭtoro de alia traduka programo ecoso. La programo povas laŭ baza maniero traduki de esperanta lingvo al germana lingvo. Kvankam ambaŭ projektoj ekzistas sufiĉe longo. Ni ambaŭ ne sciis pri la projekto de la alia.

15.5.2007

Elekto de tradukoj ĉe maŝina tradukado

Filed under: maŝina tradukado — artur @ 18:35

Unu de plej malfacilaj problemoj ĉe maŝina tradukado, kiu estas bazita sur leksikono, estas la elekto de la plej taŭga traduko de vortaro. Estas normala afero, ke por unu fonta vorto oni trovas kelkajn tradukojn en vortaro. Ofte tiuj tradukoj estas sinonimoj, do ĉiu traduko estas egale korekta. En alia kazo la fonta vorto povas havi kelkajn sencojn kaj tiuj sencoj estas tradukita diference. Ni trovas en vortarojn ofte suban strukturon:

fonta vorto:
senco1: traduko_1_1, traduko_1_2
senco2: traduko_2_1, traduko_2_2

La difino de senco (aŭ sencokampoj) estas en tiu punkto tre malklara afero. Precipe oni povas ĉiam dividi sencojn en pri detalaj sencoj. Do ne ekzistas metodo por klare difini la sencojn. En naturaj lingvoj (ankaŭ en Esperanto) vortojn ofte iom post iom ŝanĝiĝas la sencojn. En diferencaj fakoj aŭ homgrupoj vortojn havas iom alian sencon. Tial ankaŭ la difino de sinonimo ne estas klara. Diferencaj nacioj komprenas la sencojn diference kaj tio estas la trajto de ilia kulturo. En tradukaj vortaroj ne estas ankaŭ evidente, ĉu la sencoj estis difinitaj laŭ fonta aŭ cela lingvo. Tial ankaŭ la difino de sinonimo, kiel samsenca vorto, estas dubinda. La tradukaj vortaroj venkas tiujn malfacilaĵojn per aldonaj priskriboj. Ofte estas uzataj ekzemploj.

Ekzemploj

Ni rigardu la vorton "granda" kaj ĝiaj tradukoj por pola, germana kaj angla lingvo.

Pola lingvo "granda: duży, wielki, silny, spory"
Germana lingvo "granda: groß, berühmnt, heftig, stark"
Angla lingvo "granda: big, large, great"

La vortaro REVO difinas por la vorto "granda" 2 sencojn.

  1. Superanta la ordinarajn dimensiojn
  2. Superanta la ordinaran gradon, intensa, altkvalita.

Unue la vorto povas priskribi aĵojn, kiuj havas dimension en alia kaŭzo ĉiujn aĵojn, kiujn oni povas ordigi (Do logike senco 2 enhavas ankaŭ la sencon 1). La vorto granda povas esti anstataŭigata en apartaj kuntekstoj (laŭ la tezaŭro) per vortoj: ega, kolosa, fama, glora, renoma, forta, impetega, fortega, potenca, alta. Ĉiuj tiuj vortoj priskribas malkutiman gradon de iu kvalito. Evidentiĝas, ke tiu vorto estas tre malfacila por difino kaj traduko. Ni pritraktu kelkajn tradukojn de vorto "granda" kun substantivo.

Esperanta Lingvo Pola Lingvo
granda domo duży dom
granda komponisto wielki kompozytor
granda tertremo silne trzęsienie ziemi, wielkie trzęsienie ziemi
granda problemo duży problem, wielki problem
granda milito wielka wojna

Ne estas facile diri, kio diferencas la polan tradukon "duży" kaj "wielki". La vorto "duży" precipe pritraktas dimension kaj vorto "wielki" aliajn kvalitojn. Sed oni povas priskribi per "granda" ankaŭ abstraktaj nociojn kiel "problemo". Ŝajnas ankaŭ, ke vorto "wielki" estas stile pli nobla ol popola aŭ parolata "duży". En pola korpuso Poliqarp "duży problem" estas iom pli ofta ol "wielki problem" (granda problemo). Se ni priskribas personojn kaj oni ne volas priskribi la altecon de homo, oni devas uzi la vorton "wielki". En pola lingvo la vorto "wielki" emfazas ankaŭ la signifon de iu objekto por homoj. Do oni parolas pri "wielka wojna" (granda milito), se temas pri la dua mondmilito. La duopon "duża wojna" mi trovis nur unu fojon. Oni parolas pri "silne trzęsienie ziemi" (forta tertremo), se temas pri fizike mezurebla forteco, sed la tertremon en San Francisco 1906 oni nomiĝas "wielkie trzęsienie ziemi".

Implikoj por maŝina tradukado

Oni vidas, ke la elekto de taŭga traduko estas tre grava por kvalito de tradukado. Unue oni povas elekti por tradukado tiun tradukon, kiu estas oportuna por la plej granda kvanto de tekstoj. Tiu estas traduko, kies senco korespondas tre preciza al la senco de fonta vorto. Precipe la plej ofta vorto de cela lingvo estas la plej taŭga. Sed tio ne solvas la problemon kun la vorto "granda". Ankaŭ se la tradukilo ne povas difini la sencon de fonta teksto, ĝi povas analizi la kuntekston de vorto. Tie helpas la statistika metodo kaj granda korpuso de cela lingvo. Ĉe elekto de la plej taŭga traduko oni analizas la oftecon de kunteksto ĉe cela lingvo. Evidente oni povas komputi, ke la traduko "wielka wojna" estas multoble pli ofta ol la traduko "duża wojna". La malavantaĝo de tiu solvo estas, ke ĝi bezonas longdaŭran kalkuladon. Parton de tiu kalkulado oni povas prepari frue en speciala datumbanko, simile kiel mi tion faris en Esperantilo ĉe bazo de frazpartoj (Menuo Lingvistiko->Uzado de frazpartoj). La dua eblo estas la traduka vortaro de tutaj frazpartoj. Tia vortaro estas tre komforta por difini esceptojn sed iĝus tro abunda por tutaj klasoj de tradukado. Oni do devus difini tutajn seriojn de tradukoj: "granda poeto, granda matematikisto, granda homo, granda instruisto". La lasta eble devenas de kutimaj vortaroj, kiuj simple donas ekzemplojn de uzado aŭ mallongan klarigon. En kaŭzo de komputila prilaboro tiu priskribo devas esti kompreneble de komputilo. La natura kunteksto de adjektivo estas la priskribata substantivo. Ĉar Esperantilo havas ĉe tradukado la kompletan sintaksan arbon, ĝi povas facili trovi koncernan substantivon.

Ekzemple en frazo: "Adam Mickiewicz estas granda pola poeto." la natura kunteksto de adjektivo "granda" estas la substantivo "poeto". Nun oni devas informigi la tradukilon, ke ĉe personoj kaj aliaj difinitaj vortoj, ĝi traduku la vorton "granda" al vorto "wielki". Mi nun enprogramis tiun eblecon en Esperantilo. En traduka vortaro oni povas priskribi en kampo "senco" tiujn aldonajn informojn. Ekzemple por la vorto "granda" ni havas.

traduko senco ordo
duży {kun %persono milito} 2
traduko 1

Nova estas la esprimo "{kun %persono milito}", kiu influas la elekton de sinonimo depende de kunteksto. Tiu esprimo signifas, ke tiu traduko estas uzate, se la priskribata persono estas de tipo "%persono" aŭ estas vorto "milito". Se tiu testo ne sukcesis, la plej grava por elekto de traduko estas la kampo "ordo". En tiu kazo la traduko "duży" havas pli malgrandan valoron al la traduko "wielki", do la traduko "duży" estos uzata. La nocio "%persono" dependas al tiel nomataj semantikaj retojtaksonomio. Esperantilo nun ne enhavas taksonomian sistemon, sed tio estas mia celo por venonta programado. La prototipo estas pro mi la semantika reto de projekto WordNet. En Esperanto oni tre facile povas indiki, ĉu la vorto signifas personon. Oni povas ja ekzameni la sufikson je "ano, ino, isto, estro" aŭ ĉe "-o", aŭ ekzameni ĉu pro radiko la sufikso "-ino" ekzistas (filo, filino). La vera semantika reto por Esperanto estas granda defio. Mi pensas, ke interesa solvo estas aŭtomate aldoni tiujn priskribojn laŭ aŭtomata analizo de pola korpuso. Por tiu mi devis programi almenaŭ minimuman sintaksan analizilon por pola lingvo.

Preciza fonta teksto

Se oni mem preparas la tekston por maŝina tradukado, oni povas eviti la problemojn ĉe tradukado jam dum la kompilo de fonta teksto. La strategio estas uzi ĉiam la plej specialajn vortojn. Do oni povas skribi: "granda komponisto" - "fama, elstara komponisto" "granda princo" - "potenca princo" "granda tertremo" - "forta tertremo" Sed aliflanke tiuj specialaj vortoj estas pli maloftaj, kaj tial la teksto ne estas bone legebla aŭ eĉ tro faka.

Kiom da strategioj plu?

Nun Esperantilo konas kelkajn strategiojn de maŝina tradukado. Tio estas:

  1. Kampo "ordo" ĉe ĉiu traduko
  2. Vortaro de frazpartoj
  3. Reguloj fikse enprogramitaj por plej komplikaj kazoj
  4. priskribo de fako je ĉiu vorto (komputiko, medicino, ...)
  5. priskribo de kunteksto

En la maŝina tradukado konataj estas ankaŭ multaj aliaj strategioj. Nuntempe tre popularaj estas statistikaj metodoj, kiuj tamen bezonas grandajn paralelajn tekstarojn. La demando estas: Kiom da ili estas bezonataj? Mi opinias, ke oni devas kombini multajn strategiojn por atingi bonajn rezultojn. La praktika kaŭzo estas, ke mi ne disponas je altkvalitaj vortaroj kaj produkto de tiuj vortaroj estas tre temporaba. Feliĉe la kompletigon de vortaroj mi povas transdoni al uzantoj. Ankaŭ se mi ne plu disvolvigos la programon, la kvalito de tradukado povus daŭre plialtigi helpe de uzantoj. Mia takso estas nun pretigi la teknikan framon por multaj metodoj.

4.5.2007

Programlingvo „Scheme“

Filed under: programado — artur @ 19:05

Mi ĝenerale interesiĝas pri programaj lingvoj (vidu: enciklopedio de programaj lingvoj) kaj mi lernis kaj provis multe da ili. Unu el la plej malnovaj kaj elstaraj lingvoj estas Lispo. Oni ofte mencias Lispon en diferencaj libroj, sed mi neniam vidis, ke iu uzis tiun lingvon profesie aŭ praktike. Mi jam kelkfoje provis programi ion per Lispo, sed mi ĉiam malsukcesis. La unua problemo estas la elekto de programa medio. Ekzistas multaj Lisp-dialektoj kaj ili ofte tre diferencas. Tiuj programaj medioj por Lispo ne estas ankaŭ komfortaj por uzantoj. Ili havas kutime uzeblecon de unuaj enigmaj programoj de 70-aj jaroj. La erarmesaĝoj estas enigmaj kaj mi ne sukcesis lerni la lingvon. La dokumentaro por Lispo preskaŭ ne ekzistas por iu konkreta medio. La plej konata estas la programo Emacs. Do oni ne povas direkte programi laŭ iu libro aŭ dokumentaro, ĉar la ekzemploj ne funkcias por tiu dialekto, kiun ni ĵus uzas. Tamen en literaturo ekzistas fantastaj priskriboj de eblecoj de tiu lingvo. En unuaj libroj, kiujn mi legis pri Lispo la ekzemploj estis tre matematikaj kaj ofte jam post unu paĝo tre abstraktaj. Mi pensas, ke la ĉefa kaŭzo pro tio estis, ke la aŭtoroj de tiuj libroj mem konstruis la programan lingvon kaj interesiĝis nur por kelkaj aspektoj de lingvo, sed ne pri praktika apliko. Do mi neniam sukcesis konkrete solvi problemojn per tiu lingvo. Mi pensas ankaŭ, ke la precipa solvmaniero de prilaboro per rekursio estas por multaj hodiaŭaj programistoj tute ne konata (Ekzemplo de iu komputila diskutgrupo). La strikte matematika pensmaniero ne estas ankaŭ praktika por programado, ĉar la rezultaj programoj simple estas tro malrapidaj. Ekzemple mi tre miris pri la solvo de problemo, ĉu iu nombro estas para aŭ malpara. Por matematikisto estas evidente, ke

  1. 0 estas para nombro
  2. n estas para, se n-1 estas malpara
  3. n estas malpara, se n-1 estas para
(define (para? n)
   (cond
     [(= n 0) true]
     [else (malpara? (- n 1))]))
(define (malpara? n)
   (cond
      [(= n 0) false]
      [else (para? (- n 1))]))

La programo estas genia, sed se oni pensas, kion faras la komputilo sur tre baza nivelo por plenumi la kalkuladon, tiam oni rimarkas, ke tiu solvo ne estas taŭga. Mi frue programis en Asemblo kaj C. Tial mi scias, ke la plej rapida solvo en alia lingvo estas la testado de lasta bitumo. Ĉar la nombroj jam estas en bituma reprezento, tiu operacio estas tre tre rapida. Do mi precipe konas la funkciadon de komputilo kaj ĝiajn limigojn.
boolean estasPara(int n) { return n & 1 == 1 ? false : true; }
Tamen por granda parto de problemoj Lispo oferas tre abundajn eblojn de abstraktado, kiu helpas tre elegante difini la programon. Mi legis la blogan artikolon The Perils of JavaSchools – Joel Spolsky, kaj tiu artikolo denove vekis mian intereson pro Ŝemo (angle Scheme) (programa lingvo, kiu estas modernigita Lisp). La aŭtoro de tiu artikolo tre bedaŭras, ke hodiaŭaj Java-programistoj ne komprenas tre gravajn konceptojn de informatiko kaj ne kapablas nek programi en tre baza nek en tre abstrakta nivelo. Mi trovis ankaŭ la programan medion DrScheme kaj instruan retan libron How to Design Programs An Introduction to Computing and Programming. Tiu estas vere la unua medio por Ŝemo kaj instrua libro por tiu lingvo, kiuj estis farita por normalaj mortemuloj. Finfine ekzistas bona libro, kiu klarigas la programadon per Ŝemo. Do mi malrapide tralaboras la libron kaj povas per ekzercoj kaj la programa medio tuj apliki la novan scion. Post kelkaj ekzercoj mi vere devas konfesi, ke Ŝemo estas tre eleganta lingvo.

Mi eĉ komprenis kaj mem programis kelkajn variantojn de QuickSort. Mi rimarkis, ke la programo bezonas multe da labora memoro (120 MB) kaj ne estas tre rapida. Tamen, kompare al Java, tio ne estas surpriza afero. DrScheme estas ankaŭ programita por instruaj kialoj kaj rapideco ne estis ilia plej grava trajto. Ekzistas ankaŭ alia libera eldono de Schema, kiu estas eble pli rapida kaj memorŝpara. Tiu estas programo Guile. Kvankam tiu lingvo havis tre fortan aprobon de konata programisto Richard Stallman, ĝi ne estas tre populara kompare al aliaj tn. skriptaj lingvoj.

Mi pensas, ke programado per tiu lingvo estas tiom alia kaj dokumentaro tiom malbona, ke la plejparto de programistoj tute ne havas ŝancojn lerni ĝin. Rimarkinde neniu granda firmao subtenas tiun lingvon kaj precipe funkciajn lingvojn. Nur lastatempe Microsoft en sia .NET subtenas la lingvon OCalm sub nova nomo F#, kiu havas similajn trajtojn kiel Ŝemo. Ankaŭ tiu subteno havas ĝis nun nur akademian karakteron. Do eble tiuj funkciaj lingvoj iam estos ankaŭ gravaj por profesia programado.

Ekzistas ankaŭ alia libro pri la programlingvo Ŝemo Structure and Interpretation of Computer Programs. Sed tiu libro ankaŭ apartenas al libroj, kiujn oni kiel novulo maleble povas kompreni. Mi esperas, se iam mi ankaŭ povus iam legi kaj kompreni ankaŭ tiun libron.

Fine mi sukcesis eklerni Lispon (kiel Ŝemo). Por programistoj tio estas kvazaŭ la sekva ŝtupo de informadika scipovo.

Powered by WordPress