File Coverage

blib/lib/Lingua/Stem/No.pm
Criterion Covered Total %
statement 47 64 73.4
branch 11 26 42.3
condition 1 3 33.3
subroutine 8 10 80.0
pod 3 3 100.0
total 70 106 66.0


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