| Lingua-FI-Inflect documentation | Contained in the Lingua-FI-Inflect distribution. |
Lingua::FI::Inflect - Finnish inflect
Lingua::FI::Inflect - suomen taivutus
use Lingua::FI::Inflect qw(taivuta to_number %sijamuodot);
my($inflected)=taivuta($sijamuodot{genetiivi},"kissa"); # inflects word "kissa" to its genitive
print $inflected; # prints "kissan"
or
use Lingua::FI::Inflect qw(taivuta to_number %sijamuodot);
foreach my $sijamuoto(sort keys %sijamuodot){ # käy läpi kaikki sijamuodot
my($taivutettu,$rule_id)=taivuta($sijamuodot{$sijamuoto},"kissa"); # taivuttaa sanan ko. sijamuotoon
print "$sijamuoto: $taivutettu (sääntö == $rule_id)\n";
}
use Lingua::FI::Inflect qw(taivuta to_number %sijamuodot);
my($taivutettu)=taivuta($sijamuodot{genetiivi},"kissa"); # taivuttaa sanan "kissa" genetiiviin
print $taivutettu; # tulostaa ruutuun "kissan"
tai
use Lingua::FI::Inflect qw(taivuta to_number %sijamuodot);
foreach my $sijamuoto(sort keys %sijamuodot){ # käy läpi kaikki sijamuodot
my($taivutettu,$rule_id)=taivuta($sijamuodot{$sijamuoto},"kissa"); # taivuttaa sanan ko. sijamuotoon
print "$sijamuoto: $taivutettu (sääntö == $rule_id)\n";
}
taivuta() returns an inputted word inflected to the chosen case.
Supposes that given word is a name if the first letter is capilalized.
taivuta() palauttaa annetun sanan taivutettuna haluttuun sijamuotoon.
Olettaa, että sana on nimi, mikäli ensimmäinen kirjain on iso.
CASE SINGULAR PLURAL
genetiivi very good poor
inessiivi good poor
elatiivi good poor
adessiivi good poor
ablatiivi good poor
partitiivi good poor
essiivi good poor
illatiivi good poor
translatiivi good poor
plural good -
Plural is being considered as one of the cases. For example if You want to inflect word "kissa" - that is cat - to plural translative, first inflect "kissa" to plural ("kissat") and then inflect "kissat" to translative ("kissoiksi").
SIJAMUOTO YKSIKKÖ MONIKKO
genetiivi erittäin hyvä huono
inessiivi hyvä huono
elatiivi hyvä huono
adessiivi hyvä huono
ablatiivi hyvä huono
partitiivi hyvä huono
essiivi hyvä huono
illatiivi hyvä huono
translatiivi hyvä huono
monikko hyvä -
Monikko tulkitaan ykdeksi sijamuodoista. Jos haluat esim taivuttaa yksikössä olevan sanan "kissa" monikon translatiiviin, taivuta "kissa" ensin monikkoon ("kissat") ja taivuta se sitten translatiiviin ("kissoiksi").
Doesn't know all odd words.
Works only the inputted word is non-inflected (plural is also ok).
What comes to names, works well only with Christian names.
Works good only with numbers smaller than twenty.
Ei tunne kaikkia erikoisesti taipuvia sanoja.
Toimii vain yksikön tai monikon perusmuodossa oleville sanoille.
Nimistä taivuttaa hyvin vain etunimet
Taivuttaa hyvin vain kahtakymmentä pienemmät luvut.
Ville Jungman
<ville_jungman@hotmail.com, ville.jungman@frakkipalvelunam.fi>
If You just use this module or have some comments I would be glad to hear them.
Ville Jungman
<ville_jungman@hotmail.com, ville.jungman@frakkipalvelunam.fi>
Jos käytät tätä moduulia tai jos on jotain parannusehdotuksia, niin olis tosi hauskaa saada palautetta.
Copyright 2004 Ville Jungman
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Tämä kirjastomoduli on vapaa; voit jakaa ja/tai muuttaa sitä samojen ehtojen mukaisesti kuin Perliä itseään.
| Lingua-FI-Inflect documentation | Contained in the Lingua-FI-Inflect distribution. |
package Lingua::FI::Inflect; use 5.008; use strict; use warnings; require Exporter; our @ISA = qw(Exporter); our %EXPORT_TAGS = ( 'all' => [ qw(taivuta to_number %sijamuodot) ] ); our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); our @EXPORT = qw( ); our $VERSION = '0.02'; our %sijamuodot=( monikko => 0, genetiivi => 1, inessiivi => 2, elatiivi => 3, adessiivi => 4, ablatiivi => 5, partitiivi => 6, essiivi => 7, illatiivi => 8, translatiivi=> 9, ); # haluaa taivuttamattoman sanan # palauttaa taivutetun sanan sub taivuta{ my($sijamuoto_id,$sana)=@_; # järjestä ao. lista ensin pituuden mukaan, sitten aakkosjärjestykseen # konsonantit # viimeinen id=6 my $k ="bcdfghjklmnpqrstvwxz"; my $k2="smnl"; my $k5="k"; my $k4="lr"; my $k3="vh"; my $k6="h"; my $k7="kptq"; # järjestä ao. lista ensin pituuden mukaan, sitten aakkosjärjestykseen # vokaalit # viimeinen id=2 my $v ="aeiouy:;"; my $v2="i"; # muuta ä-kirjaimet kaksoispisteiksi ja ö-kirjaimet puolipisteiksi # hae käytetäänkö sanassa skandeja vai ei # $a == a tai ä # $o == o tai ö (local $_,my $a,my $o)=to_number($sana); # määritä sijamuodon sijapääte $p-muuttujaan # määritä $p1-muuttujaan sijapääte ilman skandeja # määritä $p2-muuttujaan sijapääte skandeilla varustettuna my($p)=( $sijamuoto_id == 0 ? "t" # monikko : $sijamuoto_id == 1 ? "n" # genetiivi : $sijamuoto_id == 2 ? "ss$a" # inessiivi : $sijamuoto_id == 3 ? "st$a" # elatiivi : $sijamuoto_id == 4 ? "ll$a" # adessiivi : $sijamuoto_id == 5 ? "lt$a" # ablatiivi : $sijamuoto_id == 6 ? "$a" # partitiivi : $sijamuoto_id == 7 ? "n$a" # essiivi : $sijamuoto_id == 8 ? "$a"."n" # illatiivi : $sijamuoto_id == 9 ? "ksi" # translatiivi : die "Wrong case"); (my $p1=$p) =~ tr/y:;/uao/; (my $p2=$p) =~ tr/aou/:;y/; # 1 = regex # 2 = käytettävän säännön id; viimeinen id = 111 # 3 = esimerkkisanan alku # 4 = esimerkkisanan loppu ; isolla kirjaimet, jotka ovat aina juuri nämä # 5 = esimerkkisanan lopun käännös ; isolla kirjaimet, jotka ovat aina juuri nämä # 6 = ryhmän id, johon regex kuuluu; viimeinen id = 10 # 7 = ryhmän järjestys; pienin ensin. Laita perään +, jos järjestys jaetaan jonkun muun kanssa # # 1 2 3 4 5 6 7 # illatiivi (kotiin) $sijamuoto_id == 8 && ( s/(.*[$v])([$v]) $ /$1$2h$2n !77 /x # poikkeukset || s/^([th])(uu?l)i $ /$1$2een !92 /x || s/^kivi $ /kiveen !93 /x # # monikko || s/(.*)([$v])(\2)t $ /$1$2isiin !94 /x # lampaat lampaisiin || s/(.*)([$k])([a:])t $ /$1$2$o\0ihin!95 /x # perunat perunoihin || s/(.*)(s) $ /$1kseen !96 /x # sirkus kseen || s/(.*)(e) $ /$1$2$2seen !78 /x # hame hameeseen || s/(.*)(nk)(i) $ /$1$2een !79 /x # henki henkeen || s/(.*)([$v]) $ /$1$2$2n !80 /x # kissa kissaan || s/(.*)([$k]+) $ /$1$2iin !81 /x # kiss kissiin ) # partitiivi || $sijamuoto_id == 6 && ( s/(.*[$v])([$v]) $ /$1$2t$a !82 /x # poikkeukset || s/^([th])(uu?l)i $ /$1$2ta !108/x # || s/^kivi $ /kive$a !98 /x # # monikko || s/(.*)([$v])(\2)t $ /$1$2it$a !99 /x # lampaat lampaita || s/(.*)([$v])([$k])([a:])t $ /$1$2$3$o\0it$a!100/x # perunat perunoita || s/(.*)([$k])([a:])t $ /$1$2$o\0j$a ! /x # aika aikoja || s/(.*)([$k])([$v])t $ /$1$2$3j$a ! /x # jauhot jauhoja || s/(.*)(s) $ /$1$2ta !109/x # sirkus ta || s/(.*)(e) $ /$1$2tt$a !83 /x # hame hametta || s/(.*)(nk)(i) $ /$1$2e$a !84 /x # henki henkeä || s/(.*)([$v]) $ /$1$2$a !85 /x # kissa kissaa || s/(.*)([$k]+) $ /$1$2i$a !86 /x # kiss kissiä ) # essiivi || $sijamuoto_id == 7 && ( s/(.*[$v])([$v]) $ /$1$2n$a !87 /x # poikkeukset || s/^([th])(uu?l)i $ /$1$2ena !110/x || s/^kivi $ /kiven$a !102/x # # monikko || s/(.*)([$v])(\2)t $ /$1$2in$a !103/x # lampaat lampaina || s/(.*)([$k])([a:])t $ /$1$2$o\0in$a!104/x # perunat perunoina || s/(.*)(s) $ /$1ksena !111/x # sirkus ksena || s/(.*)(e) $ /$1$2$2n$a !88 /x # hame hameena || s/(.*)(nk)i $ /$1$2en$a !89 /x # henki henkenä || s/(.*)([$v]) $ /$1$2n$a !90 /x # kissa kissana || s/(.*)([$k]+) $ /$1$2in$a !91 /x # kiss kissinä ) # lainasanat, jotka päättyvät vokaaliin || s/( andante |anime |apache |appassionato |beta |beeta |blanko |byte |delta |data |desi |curry |copy |collie |college |chippendale |city |bluffi |beige |bridge |boutique |cache |case |deadline |freestyle |foto |fleece |empire |epo |esperanto |extreme |fluori |expo |folklore |ellipsi |ensemble |forte ) $ /$1$p !59 /x # lainasanat, jotka päättyvät konsonanttiin || s/( blues |charleston |evergreen |automarket |bouquet |bullshit |burnout |chat |debet |et |exit |fahrenheit |kermit ) $ /$1i$p !60 /x # monikko || /t$/ && ( s/([a:])t $ /$o\0i$p !105/x # kal AT oi 10 2 || s/([$v])t $ /$1$p !106/x # pul u u || s/(.) $ /$1i$p !107/x # marke T tIT ) # numerot 8-10 || s/( seitsem: |ykdeks: |kahdeksa |kymmene )n $ /$1$p !73 /x # 10 1 # säännöt, jotka toimivat myös nimille || s/nen $ /se$p !22 /x # kisu NEN SEN 10 2 # nimet || s/^([A-Z45].*)([$k7])\2([$v])$ /$1$2$3$p !67 /x # Ja tta ta 9 0 || s/^([A-Z45].*[$v]) $ /$1$p !61 /x # Vil e e 9 1 || s/^([A-Z45].*) $ /$1i$p !62 /x # Ki m mI 9 2 # pronominit || $sijamuoto_id == 0 && ( s/^min: $ /me !63 /x || s/^sin: $ /te !63 /x || s/^h:n $ /he !63 /x || s/^t:m: $ /n:m: !63 /x || s/^tuo $ /nuo !63 /x || s/^se $ /ne !63 /x ) || ( s/^min: $ /minu$p1 !63 /x || s/^sin: $ /sinu$p1 !63 /x || s/^h:n $ /h:ne$p2 !63 /x || s/^me $ /meid:$p2 !63 /x || s/^te $ /teid:$p2 !63 /x || s/^he $ /heid:$p2 !63 /x || s/^n:m: $ /n:ide$p2 !63 /x || s/^nuo $ /noide$p1 !63 /x || s/^ne $ /niide$p2 !63 /x || s/^t:m: $ /t:m:$p2 !63 /x || s/^tuo $ /tuo$p1 !63 /x || s/^se $ /se$p2 !63 /x ) # yksittäiset sanat, joita ei voi laittaa yhdyssanaan || s/^aika $ /aja$p !64 /x # vrt. taika -> taia || s/^([th])(uu?l)i $ /$1$2e$p !64 /x # vrt. kuli -> kulin # yksittäiset sanat, mahdolliset myös yhdyssanoissa || s/poika $ /poja$p !66 /x # reliikki || s/mies $ /miehe$p !66 /x # vrt. hies -> hiekse || s/yhteys $ /yhteyde$p !66 /x # vrt. risteys -> risteykse || s/haku $ /hau$p !66 /x # vrt. laku -> laku || s/laki $ /lai$p !66 /x # vrt. khaki -> khaki || s/tuoli $ /tuoli$p !66 /x # vrt. huoli -> huole || s/henki $ /henge$p !66 /x # vrt. renki -> rengi || s/puomi $ /puomi$p !66 /x # vrt. luomi -> luome || s/(th])uli $ /$1uule$p !66 /x # vrt. muuli -> muuli || s/nauris $ /naurii$p !66 /x || s/veli $ /velje$p !66 /x # vrt. peli -> peli || s/ruis $ /rukii$p !66 /x || s/ananas $ /ananakse$p !66 /x || s/business $ /businekse$p !66 /x || s/kirves $ /kirvee$p !66 /x # numerot 1-6 || s/(y|ka)ksi $ /$1hde$p !1 /x || s/(kolme|nelj:) $ /$1$p !1 /x || s/^(vii)si $ /$1de$p !1 /x # numero - kuitenkin aviisi -> aviisi || s/(kuu)si $ /$1de$p !1 /x # numerot 11-19 || s/(.+)(toista) $ /(taivuta($sijamuoto_id,$1))[0].$2.'!74' /ex # järjestysluvut 1-10 || s/( yhde |kahde |kolma |nelj: |viide |kuude |seitsem: |kahdeksa |yhdeks: |kymmene )s $ /$1nne$p !75 /x # varmat säännöt, joissa etsimisosan säännöt ovat ilman muuttujia (esim. $1) || s/^([vm])(er)i $ /$1$2e$p !33 /x # vERI > verE || s/(n)si $ /$1$1e$p !38 /x # ka NSI > nnE || s/(m)pi $ /$1$1e$p !11 /x # la MPI > mmE || s/(iel)i $ /$1e$p !19 /x # k IELI > elE || s/([yu]psi) $ /$1$p !55 /x # r yPSI > ypsi 8 1 || s/(p)(s)i $ /$1$2e$p !32 /x # la PSI > psE 8 2 || s/d([a:])s $ /t$1$1$p !24 /x # hi DAS > TAA || s/([st])(([ou]u)|([;y]y))s$ /$1$2de$p !44 /x # out oUS > ouDE || s/([$v])\1 $ /$1$1$p !58 /x # atelj ee > ee # sekalaiset säännöt || s/(m)\1([a:])s $ /$1p$2$2$p !41 /x # ha MmAS > hamPaa 3 -2 || s/(n)\1([a:])s $ /$1$1$2kse$p !42 /x # ka NnAS > nnaKSE 3 0 || s/([$k])\1([a:])s $ /$1t$2$2$p !36 /x # ma llAS > malTaa 3 -1 || s/([$k])d([a:])s $ /$1t$2$2$p !40 /x # a hDAS > ahTaa 3 -0.5 || s/(n)\1e $ /$1tee$p !12 /x # la NnE > nTEE 3 1+ || s/(m)\1e $ /$1$1ee$p !13 /x # a MmE > mmEE 3 1+ || s/([$k2])\1([$v]) $ /$1$1$2$p !29 /x # ki ssa > ssa 3 2 || s/([$k7])\1([$v]) $ /$1$2$p !02 /x # ta tti > ti || s/(r)si $ /$1$1e$p !43 /x # vi RSI > rrE || s/(sv|rm|sm)(i) $ /$1$2$p !68 /x # ka RmI > rmI || s/([$k])([$k3])$v2 $ /$1$2e$p ! 3 /x # hi rvi > rvE || s/([$v])\1s $ /$1$1de$p ! 4 /x # tilais uus > uuDE 1 1 || s/([$v])([$v])s $ /$1$2kse$p ! 5 /x # lauk auS > auKSE 1 2 || s/([$v])([$v])k([a:]) $ /$1$2$3$p ! 9 /x # s iiKA > iiA || s/([$v])p([$v]) $ /$1v$2$p !16 /x # n aPa > aVa || s/([$v])([$k])([a:])s $ /$1$2$2$3$3$p!25 /x # hi DAS > TAA 4 0 || s/([$k])([$k])([a:])s $ /$1$2$3$3$p !37 /x # ka rvAS > karvaa 3 0 || s/([$v])s $ /$1kse$p !23 /x # tik aS > aKSE 4 1 || s/(tt)([$v])n $ /$1$2i$p !28 /x # 4 3 || s/(t)(i)n $ /$1$1$2me$p !45 /x # lii TIN > ttiME 4 4+ || s/(t)([o;])n $ /$1$1$2m$a$p !26 /x # ehdo TON > ttoMA 4 4+ || s/(l)(i)n $ /$1$2me$p !30 /x # puhe LIN > liME 4 4+ || s/(e)(n) $ /$1$2e$p !49 /x # ahv EN > enE 4 5 || s/([$v])([$k]) $ /$1$2i$p !17 /x # kerm it > itI 4 6 || s/([$v])(\1si) $ /$1$2$p !52 /x # m uuSI > uusi 6 1 || s/([$v])si $ /$1de$p ! 6 /x # ka uSI > uDE 6 2 || s/([$v])(t)(e) $ /$1$2$2$3$3$p!20 /x # ka TE > ttee 2 -2 || s/d(e) $ /t$1$1$p !21 /x # kai DE > Tee 2 -1 || s/(sk)(e) $ /$1$2$2$p !50 /x # rui SKE > skee 2 -0.5 || s/(k)(e) $ /$1$1$2$2$p !46 /x # pil KE > kkee 2 -0.5 || s/(e) $ /$1$1$p !18 /x # ven E > ee 2 0 || s/(te[$k6])ti $ /$1di$p !56 /x # arkki TEhTI > tehDI 2 1.1 || s/(e[$k6])ti $ /$1de$p !57 /x # le hTI > hDE 2 1.2 || s/([$k6])t([$v]) $ /$1d$2$p !27 /x # jo hTo > hDo 2 1 || s/([$v])t([$v]) $ /$1d$2$p !10 /x # ha uTa > uDa 2 2 || s/([$k])(i)(v)i $ /$1$2$3e$p !14 /x # k ivI > ivE 2 3 || s/([$k])([o;])([$k])i $ /$1$2$3i$p !51 /x # aero sOlI > olI 5 1 || s/([o;]ni) $ /$1$p !54 /x # p ONI > oni 5 3 || s/([o;])\1([$k])i $ /$1$1$2i$p !69 /x # b OolI > ooli 5 4 || s/([o;])([$k])i $ /$1$2e$p !31 /x # hu OlI > olE 5 5 || s/([$k4])t([a:]) $ /$1$1$2$p ! 7 /x # si lTA > llA || s/(n)k([$v]) $ /$1g$2$p !28 /x # la NKo > ngo || s/(n)t([$v]) $ /$1$1$2$p !15 /x # ka NTo > nno || s/((au)|(:y))ki $ /$1e$p !47 /x # h AUKI > auE || s/([o;]im|ie[$k])i $ /$1e$p !48 /x # t OIMI > oimE || s/(l)t([$v]) $ /$1$1$2$p !70 /x # pe LTi > lli || s/(l)k([i]) $ /$1je$p !72 /x # ky LKI > lJE || s/(l)k([a:]) $ /$1$2$p !71 /x # su LKa > a # perussäännöt || s/([$v]) $/$1$p ! 8 /x # kirj a > a 7 1 || s/(.*) $/$1i$p !53 /x # aid S > sI 7 2 ; tr/:;/\ä\ö/; m/^(.*?) *!(.*)/; return $1,$2; } # change scandinavic letters 'ä' to ':' and 'ö' to ';' in the given word # return changed word,a-skand,o-scand # a-skand == 'a' if scands are not used and ':' if they are # o-skand == 'o' if scands are not used and ';' if they are sub to_number{ my($temp)=@_; my($muisti,$apu,$scand)=undef; $scand=1; foreach my $kirjain(split //,$temp){ my $ascii=ord($kirjain); if($ascii == 195){ $muisti=1; }else{ if($ascii == 164 && $muisti){ $kirjain=":"; }elsif($ascii == 182 && $muisti){ $kirjain=";"; } $muisti=0; $apu.=$kirjain; } $scand=1 if $kirjain =~ /[y:;]/; $scand=0 if $kirjain =~ /[aou]/; } return $apu,$scand ? ":" : "a",$scand ? ";" : "o"; } 1; __END__