Blame view

mobile/source/inc/class.morf.php 3.16 KB
a1684257   Administrator   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
  <?php
  	
  class Lingua_Stem_Ru 
  {
      var $VERSION = "0.02";
      var $Stem_Caching = 0;
      var $Stem_Cache = array();
      var $VOWEL = '/аеиоуыэюя/';
      var $PERFECTIVEGROUND = '/((ив|ивши|ившись|ыв|ывши|ывшись)|((?<=[ая])(в|вши|вшись)))$/';
      var $REFLEXIVE = '/(с[яь])$/';
      var $ADJECTIVE = '/(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|еых|ую|юю|ая|яя|ою|ею)$/';
      var $PARTICIPLE = '/((ивш|ывш|ующ)|((?<=[ая])(ем|нн|вш|ющ|щ)))$/';
      var $VERB = '/((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ены|ить|ыть|ишь|ую|ю)|((?<=[ая])(ла|на|ете|йте|ли|й|л|ем|н|ло|но|ет|ют|ны|ть|ешь|нно)))$/';
      var $NOUN = '/(а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|ией|ей|ой|ий|й|и|ы|ь|ию|ью|ю|ия|ья|я)$/';
      var $RVRE = '/^(.*?[аеиоуыэюя])(.*)$/';
      var $DERIVATIONAL = '/[^аеиоуыэюя][аеиоуыэюя]+[^аеиоуыэюя]+[аеиоуыэюя].*(?<=о)сть?$/';
  
      function s(&$s, $re, $to)
      {
          $orig = $s;
          $s = preg_replace($re, $to, $s);
          return $orig !== $s;
      }
  
      function m($s, $re)
      {
          return preg_match($re, $s);
      }
  
      function stem_word($word) 
      {
          $word = strtolower($word);
           $word = strtr($word, array('ё'=>'е'));
          # Check against cache of stemmed words
          if ($this->Stem_Caching && isset($this->Stem_Cache[$word])) {
              return $this->Stem_Cache[$word];
          }
          $stem = $word;
          do {
            if (!preg_match($this->RVRE, $word, $p)) break;
            $start = $p[1];
            $RV = $p[2];
            if (!$RV) break;
  
            # Step 1
            if (!$this->s($RV, $this->PERFECTIVEGROUND, '')) {
                $this->s($RV, $this->REFLEXIVE, '');
  
                if ($this->s($RV, $this->ADJECTIVE, '')) {
                    $this->s($RV, $this->PARTICIPLE, '');
                } else {
                    if (!$this->s($RV, $this->VERB, ''))
                        $this->s($RV, $this->NOUN, '');
                }
            }
  
            # Step 2
            $this->s($RV, '/и$/', '');
  
            # Step 3
            if ($this->m($RV, $this->DERIVATIONAL))
                $this->s($RV, '/ость?$/', '');
  
            # Step 4
            if (!$this->s($RV, '/ь$/', '')) {
                $this->s($RV, '/ейше?/', '');
                $this->s($RV, '/нн$/', 'н'); 
            }
  
            $stem = $start.$RV;
          } while(false);
          if ($this->Stem_Caching) $this->Stem_Cache[$word] = $stem;
          return $stem;
      }
  
      function stem_caching($parm_ref) 
      {
          $caching_level = @$parm_ref['-level'];
          if ($caching_level) {
              if (!$this->m($caching_level, '/^[012]$/')) {
                  die(__CLASS__ . "::stem_caching() - Legal values are '0','1' or '2'. '$caching_level' is not a legal value");
              }
              $this->Stem_Caching = $caching_level;
          }
          return $this->Stem_Caching;
      }
  
      function clear_stem_cache() 
      {
          $this->Stem_Cache = array();
      }
  }
  ?>