File Coverage

blib/lib/Lingua/Stem/Sv.pm
Criterion Covered Total %
statement 47 64 73.4
branch 12 26 46.1
condition 1 3 33.3
subroutine 8 10 80.0
pod 3 3 100.0
total 71 106 66.9


line stmt bran cond sub pod time code
1             package Lingua::Stem::Sv;
2              
3             =head1 NAME
4              
5             Lingua::Stem::Sv - Stemming algorithm for Swedish
6              
7             =head1 SYNOPSIS
8              
9             use Lingua::Stem::Sv;
10             my $stems = Lingua::Stem::Sv::stem({ -words => $word_list_reference,
11             -locale => 'sv',
12             -exceptions => $exceptions_hash,
13             });
14              
15             =head1 DESCRIPTION
16              
17             This routine applies a stemming slgorithm to a passed anon array of Swedish words,
18             returning the stemmed words as an anon array.
19              
20             It is a 'convienence' wrapper for 'Lingua::Stem::Snowball::Se' that provides
21             a standardized interface and caching.
22              
23             =head1 CHANGES
24              
25             2.31 2020.09.26 - Fix for Latin1/UTF8 issue in documentation
26              
27             2.30 2020.06.20 - Version renumbering for module consistency
28              
29             1.01 2003.09.28 - Documentation fix
30              
31             1.00 2003.04.05 - Initial release
32              
33             =cut
34              
35             #######################################################################
36             # Initialization
37             #######################################################################
38              
39 1     1   7 use strict;
  1         2  
  1         32  
40 1     1   6 use warnings;
  1         1  
  1         29  
41              
42 1     1   501 use Lingua::Stem::Snowball::Se;
  1         1249  
  1         35  
43              
44 1     1   7 use Exporter;
  1         2  
  1         37  
45 1     1   5 use Carp;
  1         1  
  1         57  
46 1     1   5 use vars qw (@ISA @EXPORT_OK @EXPORT %EXPORT_TAGS $VERSION);
  1         2  
  1         84  
47             BEGIN {
48 1     1   17 @ISA = qw (Exporter);
49 1         4 @EXPORT = ();
50 1         3 @EXPORT_OK = qw (stem clear_stem_cache stem_caching);
51 1         531 %EXPORT_TAGS = ();
52             }
53             $VERSION = "2.31";
54              
55             my $Stem_Caching = 0;
56             my $Stem_Cache = {};
57              
58             =head1 METHODS
59              
60             =cut
61              
62             #######################################################################
63              
64             =over 4
65              
66             =item stem({ -words => \@words, -locale => 'sv', -exceptions => \%exceptions });
67              
68             Stems a list of passed words using the rules of Swedish. Returns
69             an anonymous array reference to the stemmed words.
70              
71             Example:
72              
73             my $stemmed_words = Lingua::Stem::Sv::stem({ -words => \@words,
74             -locale => 'sv',
75             -exceptions => \%exceptions,
76             });
77              
78             =back
79              
80             =cut
81              
82             sub stem {
83 1 50   1 1 3 return [] if ($#_ == -1);
84 1         2 my $parm_ref;
85 1 50       3 if (ref $_[0]) {
86 1         3 $parm_ref = shift;
87             } else {
88 0         0 $parm_ref = { @_ };
89             }
90            
91 1         1 my $words = [];
92 1         2 my $locale = 'sv';
93 1         1 my $exceptions = {};
94 1         5 foreach (keys %$parm_ref) {
95 3         6 my $key = lc ($_);
96 3 100       13 if ($key eq '-words') {
    100          
    50          
97 1         1 @$words = @{$parm_ref->{$key}};
  1         3  
98             } elsif ($key eq '-exceptions') {
99 1         2 $exceptions = $parm_ref->{$key};
100             } elsif ($key eq '-locale') {
101 1         3 $locale = $parm_ref->{$key};
102             } else {
103 0         0 croak (__PACKAGE__ . "::stem() - Unknown parameter '$key' with value '$parm_ref->{$key}'\n");
104             }
105             }
106              
107 1         3 local $_;
108 1 50       3 my $use_cache = ($Stem_Caching > 1) ? 1 : 0;
109 1         4 my $stemmer = Lingua::Stem::Snowball::Se->new( use_cache => $use_cache );
110 1         14 foreach (@$words) {
111              
112             # Check against exceptions list
113 1 50       3 if (exists $exceptions->{$_}) {
114 0         0 $_ = $exceptions->{$_};
115 0         0 next;
116             }
117              
118             # Check against cache of stemmed words
119 1         1 my $original_word = $_;
120 1 50 33     4 if ($Stem_Caching && defined ($Stem_Cache->{$original_word})) {
121 0         0 $_ = $Stem_Cache->{$original_word};
122 0         0 next;
123             }
124              
125 1         4 $_ = $stemmer->stem("$_");
126 1 50       234 $Stem_Cache->{$original_word} = $_ if $Stem_Caching;
127             }
128 1 50       3 $Stem_Cache = {} if ($Stem_Caching < 2);
129            
130 1         11 return $words;
131             }
132              
133             ##############################################################
134              
135             =over 4
136              
137             =item stem_caching({ -level => 0|1|2 });
138              
139             Sets the level of stem caching.
140              
141             '0' means 'no caching'. This is the default level.
142              
143             '1' means 'cache per run'. This caches stemming results during a single
144             call to 'stem'.
145              
146             '2' means 'cache indefinitely'. This caches stemming results until
147             either the process exits or the 'clear_stem_cache' method is called.
148              
149             =back
150              
151             =cut
152              
153             sub stem_caching {
154 0     0 1   my $parm_ref;
155 0 0         if (ref $_[0]) {
156 0           $parm_ref = shift;
157             } else {
158 0           $parm_ref = { @_ };
159             }
160 0           my $caching_level = $parm_ref->{-level};
161 0 0         if (defined $caching_level) {
162 0 0         if ($caching_level !~ m/^[012]$/) {
163 0           croak(__PACKAGE__ . "::stem_caching() - Legal values are '0','1' or '2'. '$caching_level' is not a legal value");
164             }
165 0           $Stem_Caching = $caching_level;
166             }
167 0           return $Stem_Caching;
168             }
169            
170             ##############################################################
171              
172             =over 4
173              
174             =item clear_stem_cache;
175              
176             Clears the cache of stemmed words
177              
178             =back
179              
180             =cut
181              
182             sub clear_stem_cache {
183 0     0 1   $Stem_Cache = {};
184             }
185              
186             ##############################################################
187              
188             =head1 NOTES
189              
190             This code is a wrapper around Lingua::Stem::Snowball::Sv written by
191             Ask Solem Hoel,
192              
193             =head1 SEE ALSO
194              
195             Lingua::Stem Lingua::Stem::Snowball::Sv
196              
197             =head1 AUTHOR
198              
199             Integration in Lingua::Stem by Jerilyn Franz
200              
201             =head1 COPYRIGHT
202              
203             Jerilyn Franz
204              
205             =head1 BUGS
206              
207             =head1 TODO
208              
209             =cut
210              
211             1;