File Coverage

blib/lib/Lingua/FI/Inflect.pm
Criterion Covered Total %
statement 9 43 20.9
branch 0 36 0.0
condition 0 348 0.0
subroutine 3 5 60.0
pod 0 2 0.0
total 12 434 2.7


line stmt bran cond sub pod time code
1             package Lingua::FI::Inflect;
2              
3 1     1   24537 use 5.008;
  1         4  
  1         41  
4 1     1   5 use strict;
  1         1  
  1         31  
5 1     1   4 use warnings;
  1         6  
  1         5655  
6             require Exporter;
7              
8             our @ISA = qw(Exporter);
9             our %EXPORT_TAGS = ( 'all' => [ qw(taivuta to_number %sijamuodot) ] );
10             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
11             our @EXPORT = qw( );
12             our $VERSION = '0.02';
13              
14             our %sijamuodot=(
15             monikko => 0,
16             genetiivi => 1,
17             inessiivi => 2,
18             elatiivi => 3,
19             adessiivi => 4,
20             ablatiivi => 5,
21             partitiivi => 6,
22             essiivi => 7,
23             illatiivi => 8,
24             translatiivi=> 9,
25             );
26              
27             # haluaa taivuttamattoman sanan
28             # palauttaa taivutetun sanan
29             sub taivuta{
30 0     0 0   my($sijamuoto_id,$sana)=@_;
31              
32             # järjestä ao. lista ensin pituuden mukaan, sitten aakkosjärjestykseen
33             # konsonantit
34             # viimeinen id=6
35              
36 0           my $k ="bcdfghjklmnpqrstvwxz";
37 0           my $k2="smnl";
38 0           my $k5="k";
39 0           my $k4="lr";
40 0           my $k3="vh";
41 0           my $k6="h";
42 0           my $k7="kptq";
43            
44             # järjestä ao. lista ensin pituuden mukaan, sitten aakkosjärjestykseen
45             # vokaalit
46             # viimeinen id=2
47              
48 0           my $v ="aeiouy:;";
49 0           my $v2="i";
50              
51              
52             # muuta ä-kirjaimet kaksoispisteiksi ja ö-kirjaimet puolipisteiksi
53             # hae käytetäänkö sanassa skandeja vai ei
54             # $a == a tai ä
55             # $o == o tai ö
56              
57 0           (local $_,my $a,my $o)=to_number($sana);
58              
59              
60             # määritä sijamuodon sijapääte $p-muuttujaan
61             # määritä $p1-muuttujaan sijapääte ilman skandeja
62             # määritä $p2-muuttujaan sijapääte skandeilla varustettuna
63              
64 0 0         my($p)=(
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
65             $sijamuoto_id == 0 ? "t" # monikko
66             : $sijamuoto_id == 1 ? "n" # genetiivi
67             : $sijamuoto_id == 2 ? "ss$a" # inessiivi
68             : $sijamuoto_id == 3 ? "st$a" # elatiivi
69             : $sijamuoto_id == 4 ? "ll$a" # adessiivi
70             : $sijamuoto_id == 5 ? "lt$a" # ablatiivi
71             : $sijamuoto_id == 6 ? "$a" # partitiivi
72             : $sijamuoto_id == 7 ? "n$a" # essiivi
73             : $sijamuoto_id == 8 ? "$a"."n" # illatiivi
74             : $sijamuoto_id == 9 ? "ksi" # translatiivi
75             : die "Wrong case");
76 0           (my $p1=$p) =~ tr/y:;/uao/;
77 0           (my $p2=$p) =~ tr/aou/:;y/;
78              
79              
80             # 1 = regex
81             # 2 = käytettävän säännön id; viimeinen id = 111
82             # 3 = esimerkkisanan alku
83             # 4 = esimerkkisanan loppu ; isolla kirjaimet, jotka ovat aina juuri nämä
84             # 5 = esimerkkisanan lopun käännös ; isolla kirjaimet, jotka ovat aina juuri nämä
85             # 6 = ryhmän id, johon regex kuuluu; viimeinen id = 10
86             # 7 = ryhmän järjestys; pienin ensin. Laita perään +, jos järjestys jaetaan jonkun muun kanssa
87             #
88             # 1 2 3 4 5 6 7
89              
90             # illatiivi (kotiin)
91 0 0 0       $sijamuoto_id == 8 && (
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
      0        
92             s/(.*[$v])([$v]) $ /$1$2h$2n !77 /x
93              
94             # poikkeukset
95             || s/^([th])(uu?l)i $ /$1$2een !92 /x
96             || s/^kivi $ /kiveen !93 /x #
97              
98             # monikko
99             || s/(.*)([$v])(\2)t $ /$1$2isiin !94 /x # lampaat lampaisiin
100             || s/(.*)([$k])([a:])t $ /$1$2$o\0ihin!95 /x # perunat perunoihin
101              
102             || s/(.*)(s) $ /$1kseen !96 /x # sirkus kseen
103             || s/(.*)(e) $ /$1$2$2seen !78 /x # hame hameeseen
104             || s/(.*)(nk)(i) $ /$1$2een !79 /x # henki henkeen
105             || s/(.*)([$v]) $ /$1$2$2n !80 /x # kissa kissaan
106             || s/(.*)([$k]+) $ /$1$2iin !81 /x # kiss kissiin
107             )
108              
109             # partitiivi
110             || $sijamuoto_id == 6 && (
111             s/(.*[$v])([$v]) $ /$1$2t$a !82 /x
112              
113             # poikkeukset
114             || s/^([th])(uu?l)i $ /$1$2ta !108/x #
115             || s/^kivi $ /kive$a !98 /x #
116              
117             # monikko
118             || s/(.*)([$v])(\2)t $ /$1$2it$a !99 /x # lampaat lampaita
119             || s/(.*)([$v])([$k])([a:])t $ /$1$2$3$o\0it$a!100/x # perunat perunoita
120             || s/(.*)([$k])([a:])t $ /$1$2$o\0j$a ! /x # aika aikoja
121             || s/(.*)([$k])([$v])t $ /$1$2$3j$a ! /x # jauhot jauhoja
122              
123             || s/(.*)(s) $ /$1$2ta !109/x # sirkus ta
124             || s/(.*)(e) $ /$1$2tt$a !83 /x # hame hametta
125             || s/(.*)(nk)(i) $ /$1$2e$a !84 /x # henki henkeä
126             || s/(.*)([$v]) $ /$1$2$a !85 /x # kissa kissaa
127             || s/(.*)([$k]+) $ /$1$2i$a !86 /x # kiss kissiä
128             )
129              
130             # essiivi
131             || $sijamuoto_id == 7 && (
132             s/(.*[$v])([$v]) $ /$1$2n$a !87 /x
133              
134             # poikkeukset
135             || s/^([th])(uu?l)i $ /$1$2ena !110/x
136             || s/^kivi $ /kiven$a !102/x #
137              
138             # monikko
139             || s/(.*)([$v])(\2)t $ /$1$2in$a !103/x # lampaat lampaina
140             || s/(.*)([$k])([a:])t $ /$1$2$o\0in$a!104/x # perunat perunoina
141              
142             || s/(.*)(s) $ /$1ksena !111/x # sirkus ksena
143             || s/(.*)(e) $ /$1$2$2n$a !88 /x # hame hameena
144             || s/(.*)(nk)i $ /$1$2en$a !89 /x # henki henkenä
145             || s/(.*)([$v]) $ /$1$2n$a !90 /x # kissa kissana
146             || s/(.*)([$k]+) $ /$1$2in$a !91 /x # kiss kissinä
147             )
148              
149             # lainasanat, jotka päättyvät vokaaliin
150             || s/(
151             andante
152             |anime
153             |apache
154             |appassionato
155             |beta
156             |beeta
157             |blanko
158             |byte
159             |delta
160             |data
161             |desi
162             |curry
163             |copy
164             |collie
165             |college
166             |chippendale
167             |city
168             |bluffi
169             |beige
170             |bridge
171             |boutique
172             |cache
173             |case
174             |deadline
175             |freestyle
176             |foto
177             |fleece
178             |empire
179             |epo
180             |esperanto
181             |extreme
182             |fluori
183             |expo
184             |folklore
185             |ellipsi
186             |ensemble
187             |forte
188             ) $ /$1$p !59 /x
189              
190             # lainasanat, jotka päättyvät konsonanttiin
191              
192             || s/(
193             blues
194             |charleston
195             |evergreen
196             |automarket
197             |bouquet
198             |bullshit
199             |burnout
200             |chat
201             |debet
202             |et
203             |exit
204             |fahrenheit
205             |kermit
206             ) $ /$1i$p !60 /x
207              
208             # monikko
209             || /t$/ && (
210             s/([a:])t $ /$o\0i$p !105/x # kal AT oi 10 2
211             || s/([$v])t $ /$1$p !106/x # pul u u
212             || s/(.) $ /$1i$p !107/x # marke T tIT
213             )
214              
215             # numerot 8-10
216              
217             || s/(
218             seitsem:
219             |ykdeks:
220             |kahdeksa
221             |kymmene
222             )n $ /$1$p !73 /x # 10 1
223              
224             # säännöt, jotka toimivat myös nimille
225              
226             || s/nen $ /se$p !22 /x # kisu NEN SEN 10 2
227              
228             # nimet
229             || s/^([A-Z45].*)([$k7])\2([$v])$ /$1$2$3$p !67 /x # Ja tta ta 9 0
230             || s/^([A-Z45].*[$v]) $ /$1$p !61 /x # Vil e e 9 1
231             || s/^([A-Z45].*) $ /$1i$p !62 /x # Ki m mI 9 2
232              
233             # pronominit
234              
235             || $sijamuoto_id == 0 && (
236             s/^min: $ /me !63 /x
237             || s/^sin: $ /te !63 /x
238             || s/^h:n $ /he !63 /x
239             || s/^t:m: $ /n:m: !63 /x
240             || s/^tuo $ /nuo !63 /x
241             || s/^se $ /ne !63 /x
242             )
243              
244             || (
245             s/^min: $ /minu$p1 !63 /x
246             || s/^sin: $ /sinu$p1 !63 /x
247             || s/^h:n $ /h:ne$p2 !63 /x
248             || s/^me $ /meid:$p2 !63 /x
249             || s/^te $ /teid:$p2 !63 /x
250             || s/^he $ /heid:$p2 !63 /x
251             || s/^n:m: $ /n:ide$p2 !63 /x
252             || s/^nuo $ /noide$p1 !63 /x
253             || s/^ne $ /niide$p2 !63 /x
254             || s/^t:m: $ /t:m:$p2 !63 /x
255             || s/^tuo $ /tuo$p1 !63 /x
256             || s/^se $ /se$p2 !63 /x
257             )
258              
259             # yksittäiset sanat, joita ei voi laittaa yhdyssanaan
260              
261             || s/^aika $ /aja$p !64 /x # vrt. taika -> taia
262             || s/^([th])(uu?l)i $ /$1$2e$p !64 /x # vrt. kuli -> kulin
263              
264             # yksittäiset sanat, mahdolliset myös yhdyssanoissa
265              
266             || s/poika $ /poja$p !66 /x # reliikki
267             || s/mies $ /miehe$p !66 /x # vrt. hies -> hiekse
268             || s/yhteys $ /yhteyde$p !66 /x # vrt. risteys -> risteykse
269             || s/haku $ /hau$p !66 /x # vrt. laku -> laku
270             || s/laki $ /lai$p !66 /x # vrt. khaki -> khaki
271             || s/tuoli $ /tuoli$p !66 /x # vrt. huoli -> huole
272             || s/henki $ /henge$p !66 /x # vrt. renki -> rengi
273             || s/puomi $ /puomi$p !66 /x # vrt. luomi -> luome
274             || s/(th])uli $ /$1uule$p !66 /x # vrt. muuli -> muuli
275             || s/nauris $ /naurii$p !66 /x
276             || s/veli $ /velje$p !66 /x # vrt. peli -> peli
277             || s/ruis $ /rukii$p !66 /x
278             || s/ananas $ /ananakse$p !66 /x
279             || s/business $ /businekse$p !66 /x
280             || s/kirves $ /kirvee$p !66 /x
281              
282             # numerot 1-6
283              
284             || s/(y|ka)ksi $ /$1hde$p !1 /x
285             || s/(kolme|nelj:) $ /$1$p !1 /x
286             || s/^(vii)si $ /$1de$p !1 /x # numero - kuitenkin aviisi -> aviisi
287             || s/(kuu)si $ /$1de$p !1 /x
288              
289             # numerot 11-19
290              
291 0           || s/(.+)(toista) $ /(taivuta($sijamuoto_id,$1))[0].$2.'!74' /ex
292              
293             # järjestysluvut 1-10
294              
295             || s/(
296             yhde
297             |kahde
298             |kolma
299             |nelj:
300             |viide
301             |kuude
302             |seitsem:
303             |kahdeksa
304             |yhdeks:
305             |kymmene
306             )s $ /$1nne$p !75 /x
307              
308              
309              
310             # varmat säännöt, joissa etsimisosan säännöt ovat ilman muuttujia (esim. $1)
311             || s/^([vm])(er)i $ /$1$2e$p !33 /x # vERI > verE
312             || s/(n)si $ /$1$1e$p !38 /x # ka NSI > nnE
313             || s/(m)pi $ /$1$1e$p !11 /x # la MPI > mmE
314             || s/(iel)i $ /$1e$p !19 /x # k IELI > elE
315             || s/([yu]psi) $ /$1$p !55 /x # r yPSI > ypsi 8 1
316             || s/(p)(s)i $ /$1$2e$p !32 /x # la PSI > psE 8 2
317             || s/d([a:])s $ /t$1$1$p !24 /x # hi DAS > TAA
318             || s/([st])(([ou]u)|([;y]y))s$ /$1$2de$p !44 /x # out oUS > ouDE
319             || s/([$v])\1 $ /$1$1$p !58 /x # atelj ee > ee
320              
321             # sekalaiset säännöt
322              
323             || s/(m)\1([a:])s $ /$1p$2$2$p !41 /x # ha MmAS > hamPaa 3 -2
324             || s/(n)\1([a:])s $ /$1$1$2kse$p !42 /x # ka NnAS > nnaKSE 3 0
325             || s/([$k])\1([a:])s $ /$1t$2$2$p !36 /x # ma llAS > malTaa 3 -1
326             || s/([$k])d([a:])s $ /$1t$2$2$p !40 /x # a hDAS > ahTaa 3 -0.5
327             || s/(n)\1e $ /$1tee$p !12 /x # la NnE > nTEE 3 1+
328             || s/(m)\1e $ /$1$1ee$p !13 /x # a MmE > mmEE 3 1+
329             || s/([$k2])\1([$v]) $ /$1$1$2$p !29 /x # ki ssa > ssa 3 2
330             || s/([$k7])\1([$v]) $ /$1$2$p !02 /x # ta tti > ti
331             || s/(r)si $ /$1$1e$p !43 /x # vi RSI > rrE
332             || s/(sv|rm|sm)(i) $ /$1$2$p !68 /x # ka RmI > rmI
333             || s/([$k])([$k3])$v2 $ /$1$2e$p ! 3 /x # hi rvi > rvE
334             || s/([$v])\1s $ /$1$1de$p ! 4 /x # tilais uus > uuDE 1 1
335             || s/([$v])([$v])s $ /$1$2kse$p ! 5 /x # lauk auS > auKSE 1 2
336             || s/([$v])([$v])k([a:]) $ /$1$2$3$p ! 9 /x # s iiKA > iiA
337             || s/([$v])p([$v]) $ /$1v$2$p !16 /x # n aPa > aVa
338             || s/([$v])([$k])([a:])s $ /$1$2$2$3$3$p!25 /x # hi DAS > TAA 4 0
339             || s/([$k])([$k])([a:])s $ /$1$2$3$3$p !37 /x # ka rvAS > karvaa 3 0
340             || s/([$v])s $ /$1kse$p !23 /x # tik aS > aKSE 4 1
341             || s/(tt)([$v])n $ /$1$2i$p !28 /x # 4 3
342             || s/(t)(i)n $ /$1$1$2me$p !45 /x # lii TIN > ttiME 4 4+
343             || s/(t)([o;])n $ /$1$1$2m$a$p !26 /x # ehdo TON > ttoMA 4 4+
344             || s/(l)(i)n $ /$1$2me$p !30 /x # puhe LIN > liME 4 4+
345             || s/(e)(n) $ /$1$2e$p !49 /x # ahv EN > enE 4 5
346             || s/([$v])([$k]) $ /$1$2i$p !17 /x # kerm it > itI 4 6
347             || s/([$v])(\1si) $ /$1$2$p !52 /x # m uuSI > uusi 6 1
348             || s/([$v])si $ /$1de$p ! 6 /x # ka uSI > uDE 6 2
349             || s/([$v])(t)(e) $ /$1$2$2$3$3$p!20 /x # ka TE > ttee 2 -2
350             || s/d(e) $ /t$1$1$p !21 /x # kai DE > Tee 2 -1
351             || s/(sk)(e) $ /$1$2$2$p !50 /x # rui SKE > skee 2 -0.5
352             || s/(k)(e) $ /$1$1$2$2$p !46 /x # pil KE > kkee 2 -0.5
353             || s/(e) $ /$1$1$p !18 /x # ven E > ee 2 0
354             || s/(te[$k6])ti $ /$1di$p !56 /x # arkki TEhTI > tehDI 2 1.1
355             || s/(e[$k6])ti $ /$1de$p !57 /x # le hTI > hDE 2 1.2
356             || s/([$k6])t([$v]) $ /$1d$2$p !27 /x # jo hTo > hDo 2 1
357             || s/([$v])t([$v]) $ /$1d$2$p !10 /x # ha uTa > uDa 2 2
358             || s/([$k])(i)(v)i $ /$1$2$3e$p !14 /x # k ivI > ivE 2 3
359             || s/([$k])([o;])([$k])i $ /$1$2$3i$p !51 /x # aero sOlI > olI 5 1
360             || s/([o;]ni) $ /$1$p !54 /x # p ONI > oni 5 3
361             || s/([o;])\1([$k])i $ /$1$1$2i$p !69 /x # b OolI > ooli 5 4
362             || s/([o;])([$k])i $ /$1$2e$p !31 /x # hu OlI > olE 5 5
363             || s/([$k4])t([a:]) $ /$1$1$2$p ! 7 /x # si lTA > llA
364             || s/(n)k([$v]) $ /$1g$2$p !28 /x # la NKo > ngo
365             || s/(n)t([$v]) $ /$1$1$2$p !15 /x # ka NTo > nno
366             || s/((au)|(:y))ki $ /$1e$p !47 /x # h AUKI > auE
367             || s/([o;]im|ie[$k])i $ /$1e$p !48 /x # t OIMI > oimE
368             || s/(l)t([$v]) $ /$1$1$2$p !70 /x # pe LTi > lli
369             || s/(l)k([i]) $ /$1je$p !72 /x # ky LKI > lJE
370             || s/(l)k([a:]) $ /$1$2$p !71 /x # su LKa > a
371              
372             # perussäännöt
373             || s/([$v]) $/$1$p ! 8 /x # kirj a > a 7 1
374             || s/(.*) $/$1i$p !53 /x # aid S > sI 7 2
375             ;
376              
377 0           tr/:;/\ä\ö/;
378              
379 0           m/^(.*?) *!(.*)/;
380 0           return $1,$2;
381             }
382              
383             # change scandinavic letters 'ä' to ':' and 'ö' to ';' in the given word
384             # return changed word,a-skand,o-scand
385             # a-skand == 'a' if scands are not used and ':' if they are
386             # o-skand == 'o' if scands are not used and ';' if they are
387             sub to_number{
388 0     0 0   my($temp)=@_;
389 0           my($muisti,$apu,$scand)=undef;
390 0           $scand=1;
391 0           foreach my $kirjain(split //,$temp){
392 0           my $ascii=ord($kirjain);
393 0 0         if($ascii == 195){
394 0           $muisti=1;
395             }else{
396 0 0 0       if($ascii == 164 && $muisti){
    0 0        
397 0           $kirjain=":";
398             }elsif($ascii == 182 && $muisti){
399 0           $kirjain=";";
400             }
401 0           $muisti=0;
402 0           $apu.=$kirjain;
403             }
404 0 0         $scand=1 if $kirjain =~ /[y:;]/;
405 0 0         $scand=0 if $kirjain =~ /[aou]/;
406             }
407 0 0         return $apu,$scand ? ":" : "a",$scand ? ";" : "o";
    0          
408             }
409              
410             1;
411              
412             __END__