Просмотр файла engine/functions/stemmer.php

Размер файла: 1.87Kb
  1. <?
  2. class Lingua_Stem_Ru
  3. {
  4. var $VOWEL = '/аеиоуыэюя/uim';
  5. var $PERFECTIVEGROUND = '/((ив|ивши|ившись|ыв|ывши|ывшись)|((?<=[ая])(в|вши|вшись)))$/uim';
  6. var $REFLEXIVE = '/(с[яь])$/';
  7. var $ADJECTIVE = '/(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|еых|ую|юю|ая|яя|ою|ею)$/uim';
  8. var $PARTICIPLE = '/((ивш|ывш|ующ)|((?<=[ая])(ем|нн|вш|ющ|щ)))$/uim';
  9. var $VERB = '/((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ены|ить|ыть|ишь|ую|ю)|((?<=[ая])(ла|на|ете|йте|ли|й|л|ем|н|ло|но|ет|ют|ны|ть|ешь|нно)))$/uim';
  10. var $NOUN = '/(а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|ией|ей|ой|ий|й|и|ы|ь|ию|ью|ю|ия|ья|я)$/uim';
  11. var $RVRE = '/^(.*?[аеиоуыэюя])(.*)$/uim';
  12. var $DERIVATIONAL = '/[^аеиоуыэюя][аеиоуыэюя]+[^аеиоуыэюя]+[аеиоуыэюя].*(?<=о)сть?$/uim';
  13.  
  14. function s(&$s, $re, $to)
  15. {
  16. $orig = $s;
  17. $s = preg_replace($re, $to, $s);
  18. return $orig !== $s;
  19. }
  20.  
  21. function m($s, $re)
  22. {
  23. return preg_match($re, $s);
  24. }
  25.  
  26. function stem_word($word)
  27. {
  28.  
  29. $stem = $word;
  30. do {
  31. if (!preg_match($this->RVRE, $word, $p)) break;
  32. $start = $p[1];
  33. $RV = $p[2];
  34. if (!$RV) break;
  35.  
  36. # Step 1
  37. if (!$this->s($RV, $this->PERFECTIVEGROUND, '')) {
  38. $this->s($RV, $this->REFLEXIVE, '');
  39.  
  40. if ($this->s($RV, $this->ADJECTIVE, '')) {
  41. $this->s($RV, $this->PARTICIPLE, '');
  42. } else {
  43. if (!$this->s($RV, $this->VERB, ''))
  44. $this->s($RV, $this->NOUN, '');
  45. }
  46. }
  47.  
  48. # Step 2
  49. $this->s($RV, '/и$/uim', '');
  50.  
  51. # Step 3
  52. if ($this->m($RV, $this->DERIVATIONAL))
  53. $this->s($RV, '/ость?$/uim', '');
  54.  
  55. # Step 4
  56. if (!$this->s($RV, '/ь$/uim', '')) {
  57. $this->s($RV, '/ейше?/uim', '');
  58. $this->s($RV, '/нн$/uim', 'н');
  59. }
  60.  
  61. $stem = $start.$RV;
  62. } while(false);
  63.  
  64. return $stem;
  65.  
  66. }
  67.  
  68.  
  69. }