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.31 2020.09.26 - Fix for Latin1/UTF8 issue in documentation
26              
27             2.30 2020.06.20 - Version renumber for module consistency
28              
29             1.01 2003.09.28 - Documenation 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         35  
40 1     1   5 use warnings;
  1         2  
  1         30  
41              
42 1     1   525 use Lingua::Stem::Snowball::No;
  1         1191  
  1         34  
43              
44 1     1   7 use Exporter;
  1         2  
  1         40  
45 1     1   5 use Carp;
  1         1  
  1         58  
46 1     1   5 use vars qw (@ISA @EXPORT_OK @EXPORT %EXPORT_TAGS $VERSION);
  1         2  
  1         88  
47             BEGIN {
48 1     1   18 @ISA = qw (Exporter);
49 1         4 @EXPORT = ();
50 1         3 @EXPORT_OK = qw (stem clear_stem_cache stem_caching);
51 1         514 %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 => 'no', -exceptions => \%exceptions });
67              
68             Stems a list of passed words using the rules of Danish. Returns
69             an anonymous array reference to the stemmed words.
70              
71             Example:
72              
73             my $stemmed_words = Lingua::Stem::No::stem({ -words => \@words,
74             -locale => 'no',
75             -exceptions => \%exceptions,
76             });
77              
78             =back
79              
80             =cut
81              
82             sub stem {
83 1 50   1 1 4 return [] if ($#_ == -1);
84 1         2 my $parm_ref;
85 1 50       3 if (ref $_[0]) {
86 1         2 $parm_ref = shift;
87             } else {
88 0         0 $parm_ref = { @_ };
89             }
90            
91 1         2 my $words = [];
92 1         2 my $locale = 'no';
93 1         2 my $exceptions = {};
94 1         5 foreach (keys %$parm_ref) {
95 3         6 my $key = lc ($_);
96 3 100       9 if ($key eq '-words') {
    100          
    50          
97 1         2 @$words = @{$parm_ref->{$key}};
  1         3  
98             } elsif ($key eq '-exceptions') {
99 1         3 $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         2 local $_;
108 1 50       3 my $use_cache = ($Stem_Caching > 1) ? 1 : 0;
109 1         4 my $stemmer = Lingua::Stem::Snowball::No->new( use_cache => $use_cache );
110 1         15 foreach (@$words) {
111              
112             # Check against exceptions list
113 2 50       11 if (exists $exceptions->{$_}) {
114 0         0 $_ = $exceptions->{$_};
115 0         0 next;
116             }
117              
118             # Check against cache of stemmed words
119 2         4 my $original_word = $_;
120 2 0 33     4 if ($Stem_Caching && exists $Stem_Cache->{$original_word}) {
121 0         0 $_ = $Stem_Cache->{$original_word};
122 0         0 next;
123             }
124              
125 2         7 $_ = $stemmer->stem("$_");
126 2 50       528 $Stem_Cache->{$original_word} = $_ if $Stem_Caching;
127             }
128              
129 1 50       4 $Stem_Cache = {} if ($Stem_Caching < 2);
130            
131 1         11 return $words;
132             }
133              
134             ##############################################################
135              
136             =over 4
137              
138             =item stem_caching({ -level => 0|1|2 });
139              
140             Sets the level of stem caching.
141              
142             '0' means 'no caching'. This is the default level.
143              
144             '1' means 'cache per run'. This caches stemming results during a single
145             call to 'stem'.
146              
147             '2' means 'cache indefinitely'. This caches stemming results until
148             either the process exits or the 'clear_stem_cache' method is called.
149              
150             =back
151              
152             =cut
153              
154             sub stem_caching {
155 0     0 1   my $parm_ref;
156 0 0         if (ref $_[0]) {
157 0           $parm_ref = shift;
158             } else {
159 0           $parm_ref = { @_ };
160             }
161 0           my $caching_level = $parm_ref->{-level};
162 0 0         if (defined $caching_level) {
163 0 0         if ($caching_level !~ m/^[012]$/) {
164 0           croak(__PACKAGE__ . "::stem_caching() - Legal values are '0','1' or '2'. '$caching_level' is not a legal value");
165             }
166 0           $Stem_Caching = $caching_level;
167             }
168 0           return $Stem_Caching;
169             }
170            
171             ##############################################################
172              
173             =over 4
174              
175             =item clear_stem_cache;
176              
177             Clears the cache of stemmed words
178              
179             =back
180              
181             =cut
182              
183             sub clear_stem_cache {
184 0     0 1   $Stem_Cache = {};
185             }
186              
187             ##############################################################
188              
189             =head1 NOTES
190              
191             This code is a wrapper around Lingua::Stem::Snowball::No written by
192             Ask Solem Hoel,
193              
194             =head1 SEE ALSO
195              
196             Lingua::Stem Lingua::Stem::Snowball::No
197              
198             =head1 AUTHOR
199              
200             Integration in Lingua::Stem by
201             Jerilyn Franz, FreeRun Technologies,
202            
203              
204             =head1 COPYRIGHT
205              
206             Jerilyn Franz, FreeRun Technologies
207              
208             This code is freely available under the same terms as Perl.
209              
210             =head1 BUGS
211              
212             =head1 TODO
213              
214             =cut
215              
216             1;