TraceLab Component Library
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties
NorwegianStemmer.cs
Go to the documentation of this file.
1 /*
2  * Port of Snowball stemmers on C#
3  * Original stemmers can be found on http://snowball.tartarus.org
4  * Licence still BSD: http://snowball.tartarus.org/license.php
5  *
6  * Most of stemmers are ported from Java by Iveonik Systems ltd. (www.iveonik.com)
7  */
8 using System;
9 using System.Collections.Generic;
10 using System.Text;
11 
12 namespace TraceLab.Components.DevelopmentKit.Preprocessors.Stemmers.Snowball.Languages
13 {
18  {
19  private readonly static NorwegianStemmer methodObject = new NorwegianStemmer();
20 
21 
22 
23  private readonly static Among[] a_0 =
24  {
25  new Among ( "a", -1, 1, null ),
26  new Among ( "e", -1, 1, null ),
27  new Among ( "ede", 1, 1, null ),
28  new Among ( "ande", 1, 1, null ),
29  new Among ( "ende", 1, 1, null ),
30  new Among ( "ane", 1, 1, null ),
31  new Among ( "ene", 1, 1, null ),
32  new Among ( "hetene", 6, 1, null ),
33  new Among ( "erte", 1, 3, null ),
34  new Among ( "en", -1, 1, null ),
35  new Among ( "heten", 9, 1, null ),
36  new Among ( "ar", -1, 1, null ),
37  new Among ( "er", -1, 1, null ),
38  new Among ( "heter", 12, 1, null ),
39  new Among ( "s", -1, 2, null ),
40  new Among ( "as", 14, 1, null ),
41  new Among ( "es", 14, 1, null ),
42  new Among ( "edes", 16, 1, null ),
43  new Among ( "endes", 16, 1, null ),
44  new Among ( "enes", 16, 1, null ),
45  new Among ( "hetenes", 19, 1, null ),
46  new Among ( "ens", 14, 1, null ),
47  new Among ( "hetens", 21, 1, null ),
48  new Among ( "ers", 14, 1, null ),
49  new Among ( "ets", 14, 1, null ),
50  new Among ( "et", -1, 1, null ),
51  new Among ( "het", 25, 1, null ),
52  new Among ( "ert", -1, 3, null ),
53  new Among ( "ast", -1, 1, null )
54  };
55 
56 
57 
58  private readonly static Among[] a_1 =
59  {
60  new Among ( "dt", -1, -1, null ),
61  new Among ( "vt", -1, -1, null )
62  };
63 
64 
65  private readonly static Among[] a_2 =
66  {
67  new Among ( "leg", -1, 1, null ),
68  new Among ( "eleg", 0, 1, null ),
69  new Among ( "ig", -1, 1, null ),
70  new Among ( "eig", 2, 1, null ),
71  new Among ( "lig", 2, 1, null ),
72  new Among ( "elig", 4, 1, null ),
73  new Among ( "els", -1, 1, null ),
74  new Among ( "lov", -1, 1, null ),
75  new Among ( "elov", 7, 1, null ),
76  new Among ( "slov", 7, 1, null ),
77  new Among ( "hetslov", 9, 1, null )
78  };
79 
80  private static readonly char[] g_v = {(char)17, (char)65, (char)16, (char)1, (char)0, (char)0, (char)0,
81  (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0,
82  (char)0, (char)0, (char)48, (char)0, (char)128 };
83 
84  private static readonly char[] g_s_ending = { (char)119, (char)125, (char)149, (char)1 };
85 
86 
87  private int I_x;
88  private int I_p1;
89 
90 
91  private void copy_from(NorwegianStemmer other)
92  {
93  I_x = other.I_x;
94  I_p1 = other.I_p1;
95  base.copy_from(other);
96  }
97 
98 
99  private bool r_mark_regions()
100  {
101  bool subroot = false;
102  int v_1;
103  int v_2;
104  // (, line 26
105  I_p1 = limit;
106  // test, line 30
107  v_1 = cursor;
108  // (, line 30
109  // hop, line 30
110  {
111  int c = cursor + 3;
112  if (0 > c || c > limit)
113  {
114  return false;
115  }
116  cursor = c;
117  }
118  // setmark x, line 30
119  I_x = cursor;
120  cursor = v_1;
121  // goto, line 31
122  while (true)
123  {
124  v_2 = cursor;
125  do
126  {
127  if (!(in_grouping(g_v, 97, 248)))
128  {
129  break;
130  }
131  cursor = v_2;
132  subroot = true;
133  if (subroot) break;
134  } while (false);
135  if (subroot) { subroot = false; break; }
136  cursor = v_2;
137  if (cursor >= limit)
138  {
139  return false;
140  }
141  cursor++;
142  }
143  // gopast, line 31
144  while (true)
145  {
146  do
147  {
148  if (!(out_grouping(g_v, 97, 248)))
149  {
150  break;
151  }
152  subroot = true;
153  if (subroot) break;
154  } while (false);
155  if (subroot) { subroot = false; break; }
156  if (cursor >= limit)
157  {
158  return false;
159  }
160  cursor++;
161  }
162  // setmark p1, line 31
163  I_p1 = cursor;
164  // try, line 32
165  do
166  {
167  // (, line 32
168  if (!(I_p1 < I_x))
169  {
170  break;
171  }
172  I_p1 = I_x;
173  } while (false);
174  return true;
175  }
176 
177 
178  private bool r_main_suffix()
179  {
180  bool subroot = false;
181  int among_var;
182  int v_1;
183  int v_2;
184  int v_3;
185  // (, line 37
186  // setlimit, line 38
187  v_1 = limit - cursor;
188  // tomark, line 38
189  if (cursor < I_p1)
190  {
191  return false;
192  }
193  cursor = I_p1;
194  v_2 = limit_backward;
195  limit_backward = cursor;
196  cursor = limit - v_1;
197  // (, line 38
198  // [, line 38
199  ket = cursor;
200  // substring, line 38
201  among_var = find_among_b(a_0, 29);
202  if (among_var == 0)
203  {
204  limit_backward = v_2;
205  return false;
206  }
207  // ], line 38
208  bra = cursor;
209  limit_backward = v_2;
210  switch (among_var)
211  {
212  case 0:
213  return false;
214  case 1:
215  // (, line 44
216  // delete, line 44
217  slice_del();
218  break;
219  case 2:
220  // (, line 46
221  // or, line 46
222  do
223  {
224  v_3 = limit - cursor;
225  do
226  {
227  if (!(in_grouping_b(g_s_ending, 98, 122)))
228  {
229  break;
230  }
231  subroot = true;
232  if (subroot) break;
233  } while (false);
234  if (subroot) { subroot = false; break; }
235  cursor = limit - v_3;
236  // (, line 46
237  // literal, line 46
238  if (!(eq_s_b(1, "k")))
239  {
240  return false;
241  }
242  if (!(out_grouping_b(g_v, 97, 248)))
243  {
244  return false;
245  }
246  } while (false);
247  // delete, line 46
248  slice_del();
249  break;
250  case 3:
251  // (, line 48
252  // <-, line 48
253  slice_from("er");
254  break;
255  }
256  return true;
257  }
258 
259 
260  private bool r_consonant_pair()
261  {
262  int v_1;
263  int v_2;
264  int v_3;
265  // (, line 52
266  // test, line 53
267  v_1 = limit - cursor;
268  // (, line 53
269  // setlimit, line 54
270  v_2 = limit - cursor;
271  // tomark, line 54
272  if (cursor < I_p1)
273  {
274  return false;
275  }
276  cursor = I_p1;
277  v_3 = limit_backward;
278  limit_backward = cursor;
279  cursor = limit - v_2;
280  // (, line 54
281  // [, line 54
282  ket = cursor;
283  // substring, line 54
284  if (find_among_b(a_1, 2) == 0)
285  {
286  limit_backward = v_3;
287  return false;
288  }
289  // ], line 54
290  bra = cursor;
291  limit_backward = v_3;
292  cursor = limit - v_1;
293  // next, line 59
294  if (cursor <= limit_backward)
295  {
296  return false;
297  }
298  cursor--;
299  // ], line 59
300  bra = cursor;
301  // delete, line 59
302  slice_del();
303  return true;
304  }
305 
306 
307  private bool r_other_suffix()
308  {
309  int among_var;
310  int v_1;
311  int v_2;
312  // (, line 62
313  // setlimit, line 63
314  v_1 = limit - cursor;
315  // tomark, line 63
316  if (cursor < I_p1)
317  {
318  return false;
319  }
320  cursor = I_p1;
321  v_2 = limit_backward;
322  limit_backward = cursor;
323  cursor = limit - v_1;
324  // (, line 63
325  // [, line 63
326  ket = cursor;
327  // substring, line 63
328  among_var = find_among_b(a_2, 11);
329  if (among_var == 0)
330  {
331  limit_backward = v_2;
332  return false;
333  }
334  // ], line 63
335  bra = cursor;
336  limit_backward = v_2;
337  switch (among_var)
338  {
339  case 0:
340  return false;
341  case 1:
342  // (, line 67
343  // delete, line 67
344  slice_del();
345  break;
346  }
347  return true;
348  }
349 
350 
351  private bool CanStem()
352  {
353  int v_1;
354  int v_2;
355  int v_3;
356  int v_4;
357  // (, line 72
358  // do, line 74
359  v_1 = cursor;
360  do
361  {
362  // call mark_regions, line 74
363  if (!r_mark_regions())
364  {
365  break;
366  }
367  } while (false);
368  cursor = v_1;
369  // backwards, line 75
370  limit_backward = cursor; cursor = limit;
371  // (, line 75
372  // do, line 76
373  v_2 = limit - cursor;
374  do
375  {
376  // call main_suffix, line 76
377  if (!r_main_suffix())
378  {
379  break;
380  }
381  } while (false);
382  cursor = limit - v_2;
383  // do, line 77
384  v_3 = limit - cursor;
385  do
386  {
387  // call consonant_pair, line 77
388  if (!r_consonant_pair())
389  {
390  break;
391  }
392  } while (false);
393  cursor = limit - v_3;
394  // do, line 78
395  v_4 = limit - cursor;
396  do
397  {
398  // call other_suffix, line 78
399  if (!r_other_suffix())
400  {
401  break;
402  }
403  } while (false);
404  cursor = limit - v_4;
405  cursor = limit_backward;
406  return true;
407  }
408 
414  public string Stem(string s)
415  {
416  this.setCurrent(s.ToLowerInvariant());
417  this.CanStem();
418  return this.getCurrent();
419  }
420  }
421 }