TraceLab Component Library
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties
DutchStemmer.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 DutchStemmer methodObject = new DutchStemmer();
20 
21 
22  private readonly static Among[] a_0 =
23  {
24  new Among ( "", -1, 6, null ),
25  new Among ( "\u00E1", 0, 1, null ),
26  new Among ( "\u00E4", 0, 1, null ),
27  new Among ( "\u00E9", 0, 2, null ),
28  new Among ( "\u00EB", 0, 2, null ),
29  new Among ( "\u00ED", 0, 3, null ),
30  new Among ( "\u00EF", 0, 3, null ),
31  new Among ( "\u00F3", 0, 4, null ),
32  new Among ( "\u00F6", 0, 4, null ),
33  new Among ( "\u00FA", 0, 5, null ),
34  new Among ( "\u00FC", 0, 5, null )
35  };
36 
37 
38  private readonly static Among[] a_1 =
39  {
40  new Among ( "", -1, 3, null ),
41  new Among ( "I", 0, 2, null ),
42  new Among ( "Y", 0, 1, null )
43  };
44 
45 
46  private readonly static Among[] a_2 =
47  {
48  new Among ( "dd", -1, -1, null ),
49  new Among ( "kk", -1, -1, null ),
50  new Among ( "tt", -1, -1, null )
51  };
52 
53 
54  private readonly static Among[] a_3 =
55  {
56  new Among ( "ene", -1, 2, null ),
57  new Among ( "se", -1, 3, null ),
58  new Among ( "en", -1, 2, null ),
59  new Among ( "heden", 2, 1, null ),
60  new Among ( "s", -1, 3, null )
61  };
62 
63 
64  private readonly static Among[] a_4 =
65  {
66  new Among ( "end", -1, 1, null ),
67  new Among ( "ig", -1, 2, null ),
68  new Among ( "ing", -1, 1, null ),
69  new Among ( "lijk", -1, 3, null ),
70  new Among ( "baar", -1, 4, null ),
71  new Among ( "bar", -1, 5, null )
72  };
73 
74 
75  private readonly static Among[] a_5 =
76  {
77  new Among ( "aa", -1, -1, null ),
78  new Among ( "ee", -1, -1, null ),
79  new Among ( "oo", -1, -1, null ),
80  new Among ( "uu", -1, -1, null )
81  };
82 
83 
84  private static readonly char[] g_v = {(char)17, (char)65, (char)16, (char)1, (char)0, (char)0, (char)0,
85  (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0,
86  (char)0, (char)0, (char)128 };
87 
88  private static readonly char[] g_v_I = {(char)1, (char)0, (char)0, (char)17, (char)65, (char)16, (char)1,
89  (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0,
90  (char)0, (char)0, (char)0, (char)0, (char)0, (char)128 };
91 
92  private static readonly char[] g_v_j = { (char)17, (char)67, (char)16, (char)1, (char)0, (char)0,(char)0,
93  (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0,
94  (char)0, (char)0, (char)128 };
95 
96  private int I_p2;
97  private int I_p1;
98  private bool B_e_found;
99 
100 
101  private void copy_from(DutchStemmer other)
102  {
103  I_p2 = other.I_p2;
104  I_p1 = other.I_p1;
105  B_e_found = other.B_e_found;
106  base.copy_from(other);
107  }
108 
109 
110  private bool r_prelude()
111  {
112  bool subroot = false;
113  int among_var;
114  int v_1;
115  int v_2;
116  int v_3;
117  int v_4;
118  int v_5;
119  int v_6;
120  // (, line 41
121  // test, line 42
122  v_1 = cursor;
123  // repeat, line 42
124  replab0: while (true)
125  {
126  v_2 = cursor;
127  do
128  {
129  // (, line 42
130  // [, line 43
131  bra = cursor;
132  // substring, line 43
133  among_var = find_among(a_0, 11);
134  if (among_var == 0)
135  {
136  break;
137  }
138  // ], line 43
139  ket = cursor;
140  switch (among_var)
141  {
142  case 0:
143  subroot = true;
144  break;
145  case 1:
146  // (, line 45
147  // <-, line 45
148  slice_from("a");
149  break;
150  case 2:
151  // (, line 47
152  // <-, line 47
153  slice_from("e");
154  break;
155  case 3:
156  // (, line 49
157  // <-, line 49
158  slice_from("i");
159  break;
160  case 4:
161  // (, line 51
162  // <-, line 51
163  slice_from("o");
164  break;
165  case 5:
166  // (, line 53
167  // <-, line 53
168  slice_from("u");
169  break;
170  case 6:
171  // (, line 54
172  // next, line 54
173  if (cursor >= limit)
174  {
175  subroot = true;
176  break;
177  }
178  cursor++;
179  break;
180  }
181  if (subroot) { subroot = false; break; }
182  else if (!subroot)
183  {
184  goto replab0;
185  }
186  } while (false);
187  cursor = v_2;
188  break;
189  }
190  cursor = v_1;
191  // try, line 57
192  v_3 = cursor;
193  do
194  {
195  // (, line 57
196  // [, line 57
197  bra = cursor;
198  // literal, line 57
199  if (!(eq_s(1, "y")))
200  {
201  cursor = v_3;
202  break;
203  }
204  // ], line 57
205  ket = cursor;
206  // <-, line 57
207  slice_from("Y");
208  } while (false);
209  // repeat, line 58
210  replab3: while (true)
211  {
212  v_4 = cursor;
213  do
214  {
215  // goto, line 58
216  while (true)
217  {
218  v_5 = cursor;
219  do
220  {
221  // (, line 58
222  if (!(in_grouping(g_v, 97, 232)))
223  {
224  break;
225  }
226  // [, line 59
227  bra = cursor;
228  // or, line 59
229  do
230  {
231  v_6 = cursor;
232  do
233  {
234  // (, line 59
235  // literal, line 59
236  if (!(eq_s(1, "i")))
237  {
238  break;
239  }
240  // ], line 59
241  ket = cursor;
242  if (!(in_grouping(g_v, 97, 232)))
243  {
244  break;
245  }
246  // <-, line 59
247  slice_from("I");
248  subroot = true;
249  if (subroot) break;
250  } while (false);
251  if (subroot) { subroot = false; break; }
252  cursor = v_6;
253  // (, line 60
254  // literal, line 60
255  if (!(eq_s(1, "y")))
256  {
257  subroot = true;
258  break;
259  }
260  // ], line 60
261  ket = cursor;
262  // <-, line 60
263  slice_from("Y");
264  } while (false);
265  if (subroot) { subroot = false; break; }
266  cursor = v_5;
267  subroot = true;
268  if (subroot) break;
269  } while (false);
270  if (subroot) { subroot = false; break; }
271  cursor = v_5;
272  if (cursor >= limit)
273  {
274  subroot = true;
275  break;
276  }
277  cursor++;
278  }
279  if (subroot) { subroot = false; break; }
280  else if (!subroot)
281  {
282  goto replab3;
283  }
284  } while (false);
285  cursor = v_4;
286  break;
287  }
288  return true;
289  }
290 
291 
292  private bool r_mark_regions()
293  {
294  bool subroot = false;
295  // (, line 64
296  I_p1 = limit;
297  I_p2 = limit;
298  // gopast, line 69
299  // golab0:
300  while (true)
301  {
302  do
303  {
304  if (!(in_grouping(g_v, 97, 232)))
305  {
306  break;
307  }
308  subroot = true;
309  if (subroot) break;
310  } while (false);
311  if (subroot) { subroot = false; break; }
312  if (cursor >= limit)
313  {
314  return false;
315  }
316  cursor++;
317  }
318  // gopast, line 69
319  while (true)
320  {
321  do
322  {
323  if (!(out_grouping(g_v, 97, 232)))
324  {
325  break;
326  }
327  subroot = true;
328  if (subroot) break;
329  } while (false);
330  if (subroot) { subroot = false; break; }
331  if (cursor >= limit)
332  {
333  return false;
334  }
335  cursor++;
336  }
337  // setmark p1, line 69
338  I_p1 = cursor;
339  // try, line 70
340  do
341  {
342  // (, line 70
343  if (!(I_p1 < 3))
344  {
345  break;
346  }
347  I_p1 = 3;
348  } while (false);
349  // gopast, line 71
350  while (true)
351  {
352  do
353  {
354  if (!(in_grouping(g_v, 97, 232)))
355  {
356  break;
357  }
358  subroot = true;
359  if (subroot) break;
360  } while (false);
361  if (subroot) { subroot = false; break; }
362  if (cursor >= limit)
363  {
364  return false;
365  }
366  cursor++;
367  }
368  // gopast, line 71
369  while (true)
370  {
371  do
372  {
373  if (!(out_grouping(g_v, 97, 232)))
374  {
375  break;
376  }
377  subroot = true;
378  if (subroot) break;
379  } while (false);
380  if (subroot) { subroot = false; break; }
381  if (cursor >= limit)
382  {
383  return false;
384  }
385  cursor++;
386  }
387  // setmark p2, line 71
388  I_p2 = cursor;
389  return true;
390  }
391 
392 
393  private bool r_postlude()
394  {
395  bool subroot = false;
396  int among_var;
397  int v_1;
398  // repeat, line 75
399  replab0: while (true)
400  {
401  v_1 = cursor;
402  do
403  {
404  // (, line 75
405  // [, line 77
406  bra = cursor;
407  // substring, line 77
408  among_var = find_among(a_1, 3);
409  if (among_var == 0)
410  {
411  break;
412  }
413  // ], line 77
414  ket = cursor;
415  switch (among_var)
416  {
417  case 0:
418  subroot = true;
419  break;
420  case 1:
421  // (, line 78
422  // <-, line 78
423  slice_from("y");
424  break;
425  case 2:
426  // (, line 79
427  // <-, line 79
428  slice_from("i");
429  break;
430  case 3:
431  // (, line 80
432  // next, line 80
433  if (cursor >= limit)
434  {
435  subroot = true;
436  break;
437  }
438  cursor++;
439  break;
440  }
441  if (subroot) { subroot = false; break; }
442  else if (!subroot)
443  {
444  goto replab0;
445  }
446  } while (false);
447  cursor = v_1;
448  break;
449  }
450  return true;
451  }
452 
453 
454  private bool r_R1()
455  {
456  if (!(I_p1 <= cursor))
457  {
458  return false;
459  }
460  return true;
461  }
462 
463 
464  private bool r_R2()
465  {
466  if (!(I_p2 <= cursor))
467  {
468  return false;
469  }
470  return true;
471  }
472 
473 
474  private bool r_undouble()
475  {
476  int v_1;
477  // (, line 90
478  // test, line 91
479  v_1 = limit - cursor;
480  // among, line 91
481  if (find_among_b(a_2, 3) == 0)
482  {
483  return false;
484  }
485  cursor = limit - v_1;
486  // [, line 91
487  ket = cursor;
488  // next, line 91
489  if (cursor <= limit_backward)
490  {
491  return false;
492  }
493  cursor--;
494  // ], line 91
495  bra = cursor;
496  // delete, line 91
497  slice_del();
498  return true;
499  }
500 
501 
502  private bool r_e_ending()
503  {
504  int v_1;
505  // (, line 94
506  // unset e_found, line 95
507  B_e_found = false;
508  // [, line 96
509  ket = cursor;
510  // literal, line 96
511  if (!(eq_s_b(1, "e")))
512  {
513  return false;
514  }
515  // ], line 96
516  bra = cursor;
517  // call R1, line 96
518  if (!r_R1())
519  {
520  return false;
521  }
522  // test, line 96
523  v_1 = limit - cursor;
524  if (!(out_grouping_b(g_v, 97, 232)))
525  {
526  return false;
527  }
528  cursor = limit - v_1;
529  // delete, line 96
530  slice_del();
531  // set e_found, line 97
532  B_e_found = true;
533  // call undouble, line 98
534  if (!r_undouble())
535  {
536  return false;
537  }
538  return true;
539  }
540 
541 
542  private bool r_en_ending()
543  {
544  int v_1;
545  int v_2;
546  // (, line 101
547  // call R1, line 102
548  if (!r_R1())
549  {
550  return false;
551  }
552  // and, line 102
553  v_1 = limit - cursor;
554  if (!(out_grouping_b(g_v, 97, 232)))
555  {
556  return false;
557  }
558  cursor = limit - v_1;
559  // not, line 102
560  {
561  v_2 = limit - cursor;
562  do
563  {
564  // literal, line 102
565  if (!(eq_s_b(3, "gem")))
566  {
567  break;
568  }
569  else if ((eq_s_b(3, "gem")))
570  {
571  return false;
572  }
573  } while (false);
574  cursor = limit - v_2;
575  }
576  // delete, line 102
577  slice_del();
578  // call undouble, line 103
579  if (!r_undouble())
580  {
581  return false;
582  }
583  return true;
584  }
585 
586 
587  private bool r_standard_suffix()
588  {
589  bool subroot = false;
590  int among_var;
591  int v_1;
592  int v_2;
593  int v_3;
594  int v_4;
595  int v_5;
596  int v_6;
597  int v_7;
598  int v_8;
599  int v_9;
600  int v_10;
601  // (, line 106
602  // do, line 107
603  v_1 = limit - cursor;
604  do
605  {
606  // (, line 107
607  // [, line 108
608  ket = cursor;
609  // substring, line 108
610  among_var = find_among_b(a_3, 5);
611  if (among_var == 0)
612  {
613  break;
614  }
615  // ], line 108
616  bra = cursor;
617  switch (among_var)
618  {
619  case 0:
620  subroot = true;
621  break;
622  case 1:
623  // (, line 110
624  // call R1, line 110
625  if (!r_R1())
626  {
627  subroot = true;
628  break;
629  }
630  // <-, line 110
631  slice_from("heid");
632  break;
633  case 2:
634  // (, line 113
635  // call en_ending, line 113
636  if (!r_en_ending())
637  {
638  subroot = true;
639  break;
640  }
641  break;
642  case 3:
643  // (, line 116
644  // call R1, line 116
645  if (!r_R1())
646  {
647  subroot = true;
648  break;
649  }
650  if (!(out_grouping_b(g_v_j, 97, 232)))
651  {
652  subroot = true;
653  break;
654  }
655  // delete, line 116
656  slice_del();
657  break;
658  }
659  if (subroot) { subroot = false; break; }
660  } while (false);
661  cursor = limit - v_1;
662  // do, line 120
663  v_2 = limit - cursor;
664  do
665  {
666  // call e_ending, line 120
667  if (!r_e_ending())
668  {
669  break;
670  }
671  } while (false);
672  cursor = limit - v_2;
673  // do, line 122
674  v_3 = limit - cursor;
675  do
676  {
677  // (, line 122
678  // [, line 122
679  ket = cursor;
680  // literal, line 122
681  if (!(eq_s_b(4, "heid")))
682  {
683  break;
684  }
685  // ], line 122
686  bra = cursor;
687  // call R2, line 122
688  if (!r_R2())
689  {
690  break;
691  }
692  // not, line 122
693  {
694  v_4 = limit - cursor;
695  do
696  {
697  // literal, line 122
698  if (!(eq_s_b(1, "c")))
699  {
700  break;
701  }
702  subroot = true;
703  if (subroot) break;
704  } while (false);
705  if (subroot) { subroot = false; break; }
706  cursor = limit - v_4;
707  }
708  // delete, line 122
709  slice_del();
710  // [, line 123
711  ket = cursor;
712  // literal, line 123
713  if (!(eq_s_b(2, "en")))
714  {
715  break;
716  }
717  // ], line 123
718  bra = cursor;
719  // call en_ending, line 123
720  if (!r_en_ending())
721  {
722  break;
723  }
724  } while (false);
725  cursor = limit - v_3;
726  // do, line 126
727  v_5 = limit - cursor;
728  do
729  {
730  // (, line 126
731  // [, line 127
732  ket = cursor;
733  // substring, line 127
734  among_var = find_among_b(a_4, 6);
735  if (among_var == 0)
736  {
737  break;
738  }
739  // ], line 127
740  bra = cursor;
741  switch (among_var)
742  {
743  case 0:
744  subroot = true;
745  break;
746  case 1:
747  // (, line 129
748  // call R2, line 129
749  if (!r_R2())
750  {
751  subroot = true;
752  goto breaklab4;
753  }
754  // delete, line 129
755  slice_del();
756  // or, line 130
757  do
758  {
759  v_6 = limit - cursor;
760  // lab6:
761  do
762  {
763  // (, line 130
764  // [, line 130
765  ket = cursor;
766  // literal, line 130
767  if (!(eq_s_b(2, "ig")))
768  {
769  break;
770  }
771  // ], line 130
772  bra = cursor;
773  // call R2, line 130
774  if (!r_R2())
775  {
776  break;
777  }
778  // not, line 130
779  {
780  v_7 = limit - cursor;
781  do
782  {
783  // literal, line 130
784  if (!(eq_s_b(1, "e")))
785  {
786  break;
787  }
788  subroot = true;
789  if (subroot) break;
790  } while (false);
791  if (subroot) { subroot = false; break; }
792  cursor = limit - v_7;
793  }
794  // delete, line 130
795  slice_del();
796  subroot = true;
797  if (subroot) break;
798  } while (false);
799  if (subroot) { subroot = false; break; }
800  cursor = limit - v_6;
801  // call undouble, line 130
802  if (!r_undouble())
803  {
804  subroot = true;
805  goto breaklab4;
806  }
807  } while (false);
808  break;
809  case 2:
810  // (, line 133
811  // call R2, line 133
812  if (!r_R2())
813  {
814  subroot = true;
815  goto breaklab4;
816  }
817  // not, line 133
818  {
819  v_8 = limit - cursor;
820  do
821  {
822  // literal, line 133
823  if (!(eq_s_b(1, "e")))
824  {
825  break;
826  }
827  subroot = true;
828  if (subroot) goto breaklab4;
829  } while (false);
830  if (subroot) { subroot = false; break; }
831  cursor = limit - v_8;
832  }
833  // delete, line 133
834  slice_del();
835  break;
836  case 3:
837  // (, line 136
838  // call R2, line 136
839  if (!r_R2())
840  {
841  subroot = true;
842  goto breaklab4;
843  }
844  // delete, line 136
845  slice_del();
846  // call e_ending, line 136
847  if (!r_e_ending())
848  {
849  subroot = true;
850  goto breaklab4;
851  }
852  break;
853  case 4:
854  // (, line 139
855  // call R2, line 139
856  if (!r_R2())
857  {
858  subroot = true;
859  goto breaklab4;
860  }
861  // delete, line 139
862  slice_del();
863  break;
864  case 5:
865  // (, line 142
866  // call R2, line 142
867  if (!r_R2())
868  {
869  subroot = true;
870  goto breaklab4;
871  }
872  // Boolean test e_found, line 142
873  if (!(B_e_found))
874  {
875  subroot = true;
876  goto breaklab4;
877  }
878  // delete, line 142
879  slice_del();
880  break;
881  }
882  breaklab4: if (subroot) { subroot = false; break; }
883  } while (false);
884  cursor = limit - v_5;
885  // do, line 146
886  v_9 = limit - cursor;
887  do
888  {
889  // (, line 146
890  if (!(out_grouping_b(g_v_I, 73, 232)))
891  {
892  break;
893  }
894  // test, line 148
895  v_10 = limit - cursor;
896  // (, line 148
897  // among, line 149
898  if (find_among_b(a_5, 4) == 0)
899  {
900  break;
901  }
902  if (!(out_grouping_b(g_v, 97, 232)))
903  {
904  break;
905  }
906  cursor = limit - v_10;
907  // [, line 152
908  ket = cursor;
909  // next, line 152
910  if (cursor <= limit_backward)
911  {
912  break;
913  }
914  cursor--;
915  // ], line 152
916  bra = cursor;
917  // delete, line 152
918  slice_del();
919  } while (false);
920  cursor = limit - v_9;
921  return true;
922  }
923 
924 
925  private bool CanStem()
926  {
927  int v_1;
928  int v_2;
929  int v_3;
930  int v_4;
931  // (, line 157
932  // do, line 159
933  v_1 = cursor;
934  do
935  {
936  // call prelude, line 159
937  if (!r_prelude())
938  {
939  break;
940  }
941  } while (false);
942  cursor = v_1;
943  // do, line 160
944  v_2 = cursor;
945  do
946  {
947  // call mark_regions, line 160
948  if (!r_mark_regions())
949  {
950  break;
951  }
952  } while (false);
953  cursor = v_2;
954  // backwards, line 161
955  limit_backward = cursor; cursor = limit;
956  // do, line 162
957  v_3 = limit - cursor;
958  do
959  {
960  // call standard_suffix, line 162
961  if (!r_standard_suffix())
962  {
963  break;
964  }
965  } while (false);
966  cursor = limit - v_3;
967  cursor = limit_backward; // do, line 163
968  v_4 = cursor;
969  do
970  {
971  // call postlude, line 163
972  if (!r_postlude())
973  {
974  break;
975  }
976  } while (false);
977  cursor = v_4;
978  return true;
979  }
980 
986  public string Stem(string s)
987  {
988  this.setCurrent(s.ToLowerInvariant());
989  this.CanStem();
990  return this.getCurrent();
991  }
992 
993 
994  }
995 }