File Coverage

blib/lib/Lingua/PT/Stemmer.pm
Criterion Covered Total %
statement 35 37 94.5
branch 14 16 87.5
condition n/a
subroutine 5 5 100.0
pod 0 2 0.0
total 54 60 90.0


line stmt bran cond sub pod time code
1             package Lingua::PT::Stemmer;
2             $Lingua::PT::Stemmer::VERSION = '0.02';
3 1     1   3678 use 5.006;
  1         2  
4 1     1   3 use strict;
  1         1  
  1         20  
5 1     1   3 use warnings;
  1         4  
  1         1070  
6              
7             my $aa = "\xe1";
8             my $ea = "\xe9";
9             my $ia = "\xed";
10             my $oa = "\xf3";
11             my $ua = "\xfa";
12             my $at = "\xe3";
13             my $ot = "\xf5";
14             my $ac = "\xe2";
15             my $ec = "\xea";
16             my $cc = "\xe7";
17             my %rule;
18              
19             $rule{plural} = {
20             "ns" => [ 1, "m" ],
21             "${ot}es" => [ 3, "${at}o" ],
22             "${at}es" => [ 1, "${at}o" ],
23             "ais" => [ 1, "al" ],
24             "${ea}is" => [ 2, "el" ],
25             "eis" => [ 2, "el" ],
26             "${oa}is" => [ 2, "ol" ],
27             "is" => [ 2, "il" ],
28             "les" => [ 2, "l" ],
29             "res" => [ 3, "r" ],
30             "s" => [ 2, "" ],
31             };
32              
33             $rule{femin} = {
34             "ona" => [ 3, "${at}o" ],
35             "${at}" => [ 2, "${at}o" ],
36             "ora" => [ 3, "or" ],
37             "na" => [ 4, "no" ],
38             "inha" => [ 3, "inho" ],
39             "esa" => [ 3, "${ec}s" ],
40             "osa" => [ 3, "oso" ],
41             "${ia}aca" => [ 3, "${ia}aco" ],
42             "ica" => [ 3, "ico" ],
43             "ada" => [ 3, "ado" ],
44             "ida" => [ 3, "ido" ],
45             "${ia}da" => [ 3, "ido" ],
46             "ima" => [ 3, "imo" ],
47             "iva" => [ 3, "ivo" ],
48             "eira" => [ 3, "eiro" ],
49             };
50              
51             $rule{augment} = {
52             "d${ia}ssimo" => [ 5, '' ],
53             "abil${ia}ssimo" => [ 5,'' ],
54             "${ia}ssimo" => [ 3,'' ],
55             "${ea}simo" => [ 3,'' ],
56             "${ea}rrimo" => [ 4,'' ],
57             "zinho" => [ 2,'' ],
58             "quinho" => [ 4, "c" ],
59             "uinho" => [ 4,'' ],
60             "adinho" => [ 3,'' ],
61             "inho" => [ 3,'' ],
62             "alh${at}o" => [ 4,'' ],
63             "u${cc}a" => [ 4,'' ],
64             "a${cc}o" => [ 4,'' ],
65             "ad${at}o" => [ 4,'' ],
66             "${aa}zio" => [ 3,'' ],
67             "arraz" => [ 4,'' ],
68             "arra" => [ 3,'' ],
69             "z${at}o" => [ 2,'' ],
70             "${at}o" => [ 3,'' ],
71             };
72              
73              
74             $rule{noun} = {
75             "encialista" => [ 4, '' ],
76             "alista" => [ 5, '' ],
77             "agem" => [ 3, '' ],
78             "iamento" => [ 4, '' ],
79             "amento" => [ 3, '' ],
80             "imento" => [ 3, '' ],
81             "alizado" => [ 4, '' ],
82             "atizado" => [ 4, '' ],
83             "izado" => [ 5, '' ],
84             "ativo" => [ 4, '' ],
85             "tivo" => [ 4, '' ],
86             "ivo" => [ 4, '' ],
87             "ado" => [ 2, '' ],
88             "ido" => [ 3, '' ],
89             "ador" => [ 3,'' ],
90             "edor" => [ 3, '' ],
91             "idor" => [ 4, '' ],
92             "at${oa}ria" => [ 5, '' ],
93             "or" => [ 2, '' ],
94             "abilidade" => [ 5,'' ],
95             "icionista" => [ 4, '' ],
96             "cionista" => [ 5, '' ],
97             "ional" => [ 4, '' ],
98             "${ec}ncia" => [ 3, '' ],
99             "${ac}ncia" => [ 4, '' ],
100             "edouro" => [ 3, '' ],
101             "queiro" => [ 3, 'c' ],
102             "eiro" => [ 3, '' ],
103             "oso" => [ 3, '' ],
104             "aliza${cc}" => [ 5, '' ],
105             "ismo" => [ 3, '' ],
106             "iza${cc}" => [ 5, '' ],
107             "a${cc}" => [ 3, '' ],
108             "i${cc}" => [ 3, '' ],
109             "${aa}rio" => [ 3, '' ],
110             "${ea}rio" => [ 6, '' ],
111             "${ec}s" => [ 4, '' ],
112             "eza" => [ 3, '' ],
113             "ez" => [ 4, '' ],
114             "esco" => [ 4, '' ],
115             "ante" => [ 2, '' ],
116             "${aa}stico" => [ 4, '' ],
117             "${aa}tico" => [ 3, '' ],
118             "ico" => [ 4, '' ],
119             "ividade" => [ 5, '' ],
120             "idade" => [ 5, '' ],
121             "oria" => [ 4, '' ],
122             "encial" => [ 5, '' ],
123             "ista" => [ 4, '' ],
124             "quice" => [ 4, 'c' ],
125             "ice" => [ 4, '' ],
126             "${ia}aco" => [ 3, '' ],
127             "ente" => [ 4, '' ],
128             "inal" => [ 3, '' ],
129             "ano" => [ 4, '' ],
130             "${aa}vel" => [ 2, '' ],
131             "${ia}vel" => [ 5, '' ],
132             "ura" => [ 4, '' ],
133             "ual" => [ 3, '' ],
134             "ial" => [ 3, '' ],
135             "al" => [ 4, '' ],
136             };
137              
138              
139             $rule{verb} = {
140             "ar${ia}amo" => [ 2, ''],
141             "eria" => [ 3, '' ],
142             "${aa}ssemo" => [ 2, '' ],
143             "ermo" => [ 3, '' ],
144             "er${ia}amo" => [ 2, '' ],
145             "esse" => [ 3, '' ],
146             "${ec}ssemo" => [ 2, '' ],
147             "este" => [ 3, '' ],
148             "ir${ia}amo" => [ 3, '' ],
149             "${ia}amo" => [ 3, '' ],
150             "${ia}ssemo" => [ 3, '' ],
151             "iram" => [ 3, '' ],
152             "${aa}ramo" => [ 2, '' ],
153             "${ia}ram" => [ 3, '' ],
154             "${aa}rei" => [ 2, '' ],
155             "irde" => [ 2, '' ],
156             "aremo" => [ 2, '' ],
157             "irei" => [ 3, '' ],
158             "ariam" => [ 2, '' ],
159             "irem" => [ 3, '' ],
160             "ar${ia}ei" => [ 2, '' ],
161             "iria" => [ 3, '' ],
162             "${aa}ssei" => [ 2, '' ],
163             "irmo" => [ 3, '' ],
164             "assem" => [ 2, '' ],
165             "isse" => [ 3, '' ],
166             "${aa}vamo" => [ 2, '' ],
167             "iste" => [ 4, '' ],
168             "${ec}ramo" => [ 3, '' ],
169             "amo" => [ 2, '' ],
170             "eremo" => [ 3, '' ],
171             "ara" => [ 2, '' ],
172             "eriam" => [ 3, '' ],
173             "ar${aa}" => [ 2, '' ],
174             "er${ia}ei" => [ 3, '' ],
175             "are" => [ 2, '' ],
176             "${ec}ssei" => [ 3, '' ],
177             "ava" => [ 2, '' ],
178             "essem" => [ 3, '' ],
179             "emo" => [ 2, '' ],
180             "${ia}ramo" => [ 3, '' ],
181             "era" => [ 3, '' ],
182             "iremo" => [ 3, '' ],
183             "er${aa}" => [ 3, '' ],
184             "iriam" => [ 3, '' ],
185             "ere" => [ 3, '' ],
186             "ir${ia}ei" => [ 3, '' ],
187             "iam" => [ 3, '' ],
188             "${ia}ssei" => [ 3, '' ],
189             "${ia}ei" => [ 3, '' ],
190             "issem" => [ 3, '' ],
191             "imo" => [ 3, '' ],
192             "ando" => [ 2, '' ],
193             "ira" => [ 3, '' ],
194             "endo" => [ 3, '' ],
195             "ir${aa}" => [ 3, '' ],
196             "indo" => [ 3, '' ],
197             "ire" => [ 3, '' ],
198             "ondo" => [ 3, '' ],
199             "omo" => [ 3, '' ],
200             "aram" => [ 2, '' ],
201             "ai" => [ 2, '' ],
202             "arde" => [ 2, '' ],
203             "am" => [ 2, '' ],
204             "arei" => [ 2, '' ],
205             "ear" => [ 4, '' ],
206             "arem" => [ 2, '' ],
207             "ar" => [ 2, '' ],
208             "aria" => [ 2, '' ],
209             "uei" => [ 3, '' ],
210             "armo" => [ 2, '' ],
211             "ei" => [ 3, '' ],
212             "asse" => [ 2, '' ],
213             "em" => [ 2, '' ],
214             "aste" => [ 2, '' ],
215             "er" => [ 2, '' ],
216             "avam" => [ 2, '' ],
217             "eu" => [ 3, '' ],
218             "${aa}vei" => [ 2, '' ],
219             "ia" => [ 3, '' ],
220             "eram" => [ 3, '' ],
221             "ir" => [ 3, '' ],
222             "erde" => [ 3, '' ],
223             "iu" => [ 3, '' ],
224             "erei" => [ 3, '' ],
225             "ou" => [ 3, '' ],
226             "${ec}rei" => [ 3, '' ],
227             "i" => [ 3, '' ],
228             "erem" => [ 3, '' ],
229             };
230              
231             $rule{accent} = {
232             $aa => 'a',
233             $ea => 'e',
234             $ia => 'i',
235             $oa => 'o',
236             $ua => 'u',
237             $at => 'a',
238             $ot => 'o',
239             $ec => 'e',
240             $cc => 'c',
241             };
242              
243             sub strip($$) {
244 33     33 0 25 my $cmd = shift;
245 33         24 my $word = shift;
246 33 100       53 if($cmd eq 'accent'){
    100          
    100          
247 5         4 foreach my $a (keys %{$rule{accent}}){
  5         12  
248 45         163 $word =~ s/$a/$rule{accent}->{$a}/eg;
  0         0  
249             }
250             }
251 5         4 elsif($cmd eq 'adv'){ $word =~ s/(.{4,})mente/$1/o; }
252 5         72 elsif($cmd eq 'vowel'){ $word =~ s/(.{3,})$_$/$1/ for qw/a e o/; }
253             else{
254 18         21 my $cmdref = $rule{$cmd};
255 18         11 for my $key (sort { length $b <=> length $a } keys %{$cmdref}){
  4193         2451  
  18         116  
256 731         827 my $patt = join q//, "^(.{", $cmdref->{$key}->[0], ",})", $key, '$';
257 731 100       4308 if($word =~ /$patt/){
258 5         50 $word =~ s/$patt/$1.($cmdref->{$key}->[1])/e;
  5         15  
259 5         9 last;
260             }
261             }
262             }
263 33         82 return $word;
264             }
265              
266             sub stem {
267 1     1 0 8 my @stems;
268 1 50       4 foreach ( ref($_[0]) ? @{$_[0]} : @_ ){
  0         0  
269 5         6 my $word = $_;
270 5 100       18 $word = strip('plural', $word) if $word =~ /s$/o;
271 5 100       13 $word = strip('femin', $word) if $word =~ /a$/o;
272 5         7 foreach my $op (qw/augment adv noun verb vowel accent/){
273 30         33 $word = strip($op, $word);
274             }
275 5         6 push @stems, $word;
276             }
277 1 50       8 wantarray ? @stems : \@stems;
278             }
279              
280              
281             1;
282             __END__