[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/libraries/vendor/wamania/php-stemmer/src/Stemmer/ -> Catalan.php (source)

   1  <?php
   2  
   3  namespace Wamania\Snowball\Stemmer;
   4  
   5  use voku\helper\UTF8;
   6  
   7  /**
   8   *
   9   * @link   http://snowball.tartarus.org/algorithms/catalan/stemmer.html
  10   * @author Orestes Sanchez Benavente <[email protected]>
  11   *
  12   *
  13   * Some fine tuning was necessary in this implementation of the original catalan stemmer algorithm in Snowball:
  14   *
  15   *    1. Some suffix sets have overlapping items, so here all items are sorted by decreasing size, to
  16   *       prevent that a shorter suffix will skip a larger one.
  17   *
  18   *    2. Some alternatives (`or` operator in Snowball) in the original algorithm have
  19   *       been rearranged to make sure they are applied in the right order.
  20   *
  21   *  Based on the reference Snowball implementation by Israel Olalla of iSOCO
  22   */
  23  class Catalan extends Stem
  24  {
  25  
  26      /**
  27       * All catalan vowels
  28       */
  29      protected static $vowels = ['a', 'e', 'i', 'o', 'u', 'á', 'é', 'í', 'ó', 'ú', 'à', 'è', 'ï', 'ò', 'ü'];
  30  
  31      protected static $standard_suffix_1a = [
  32          'allengües', 'ativitats', 'bilitats', 'ionistes', 'ialistes', 'ialismes', 'ativitat', 'atòries', 'isament',
  33          'bilitat', 'ivitats', 'ionisme', 'ionista', 'ialista', 'ialisme', 'íssimes', 'formes', 'ivisme', 'aments',
  34          'nça', 'ificar', 'idores', 'ancies', 'atòria', 'ivitat', 'encies', 'ències', 'atives', 'íssima', 'íssims',
  35          'ictes', 'eries', 'itats', 'itzar', 'ament', 'ments', 'sfera', 'ícies', 'àries', 'cions', 'ístic', 'issos',
  36          'íssem', 'íssiu', 'issem', 'isseu', 'ísseu', 'dores', 'adura', 'ívola', 'ables', 'adors', 'idors', 'adora',
  37          'doras', 'dures', 'ancia', 'toris', 'encia', 'ència', 'ïtats', 'atius', 'ativa', 'ibles', 'asses', 'assos',
  38          'íssim', 'ìssem', 'ìsseu', 'ìssin', 'ismes', 'istes', 'inies', 'íinia', 'ínies', 'trius', 'atge', 'icte',
  39          'ells', 'ella', 'essa', 'eres', 'ines', 'able', 'itat', 'ives', 'ment', 'amen', 'iste', 'aire', 'eria',
  40          'eses', 'esos', 'ícia', 'icis', 'ícis', 'ària', 'alla', 'nces', 'enca', 'issa', 'dora', 'dors', 'bles',
  41          'ívol', 'egar', 'ejar', 'itar', 'ació', 'ants', 'tori', 'ions', 'isam', 'ores', 'aris', 'ïtat', 'atiu',
  42          'ible', 'assa', 'ents', 'imes', 'isme', 'ista', 'inia', 'ites', 'triu', 'oses', 'osos', 'ient', 'otes',
  43          'ell', 'esc', 'ets', 'eta', 'ers', 'ina', 'iva', 'ius', 'fer', 'als', 'era', 'ana', 'esa', 'ici', 'íci',
  44          'ció', 'dor', 'all', 'enc', 'osa', 'ble', 'dís', 'dur', 'ant', 'ats', 'ota', 'ors', 'ora', 'ari', 'uts',
  45          'uds', 'ent', 'ims', 'ima', 'ita', 'ar', 'és', 'ès', 'et', 'ls', 'ió', 'ot', 'al', 'or', 'il', 'ís', 'ós',
  46          'ud', 'ots', 'ó'
  47      ];
  48  
  49      protected static $attached_pronoun = [
  50          'selas', 'selos', '\'hi', '\'ho', '\'ls', '-les', '-nos', '\'ns', 'sela', 'selo', '\'s', '\'l', '-ls', '-la',
  51          '-li', 'vos', 'nos', '-us', '\'n', '-ns', '\'m', '-me', '-te', '\'t', 'los', 'las', 'les', 'ens', 'se', 'us',
  52          '-n', '-m', 'li', 'lo', 'me', 'le', 'la', 'ho', 'hi'
  53      ];
  54  
  55      protected static $verb_suffixes = [
  56          'aríamos', 'eríamos', 'iríamos', 'eresseu', 'iéramos', 'iésemos', 'adores', 'aríais', 'aremos', 'eríais',
  57          'eremos', 'iríais', 'iremos', 'ierais', 'ieseis', 'asteis', 'isteis', 'ábamos', 'áramos', 'ásemos', 'isquen',
  58          'esquin', 'esquis', 'esques', 'esquen', 'ïsquen', 'ïsques', 'adora', 'adors', 'arían', 'arías', 'arian',
  59          'arien', 'aries', 'aréis', 'erían', 'erías', 'eréis', 'erass', 'irían', 'irías', 'iréis', 'asseu', 'esseu',
  60          'àsseu', 'àssem', 'àssim', 'àssiu', 'essen', 'esses', 'assen', 'asses', 'assim', 'assiu', 'éssen', 'ésseu',
  61          'éssim', 'éssiu', 'éssem', 'aríem', 'aríeu', 'eixer', 'eixes', 'ieran', 'iesen', 'ieron', 'iendo', 'essin',
  62          'essis', 'assin', 'assis', 'essim', 'èssim', 'èssiu', 'ieras', 'ieses', 'abais', 'arais', 'aseis', 'íamos',
  63          'irien', 'iries', 'irìem', 'irìeu', 'iguem', 'igueu', 'esqui', 'eixin', 'eixis', 'eixen', 'iríem', 'iríeu',
  64          'atges', 'issen', 'isses', 'issin', 'issis', 'issiu', 'issim', 'ïssin', 'íssiu', 'íssim', 'ïssis', 'ïguem',
  65          'ïgueu', 'ïssen', 'ïsses', 'itzeu', 'itzis', 'ador', 'ents', 'udes', 'eren', 'arán', 'arás', 'aria', 'aràs',
  66          'aría', 'arés', 'erán', 'erás', 'ería', 'erau', 'irán', 'irás', 'iría', 'írem', 'íreu', 'aves', 'avem', 'ávem',
  67          'àvem', 'àveu', 'áveu', 'aven', 'ares', 'àrem', 'àreu', 'àren', 'areu', 'aren', 'tzar', 'ides', 'ïdes', 'ades',
  68          'iera', 'iese', 'aste', 'iste', 'aban', 'aran', 'asen', 'aron', 'abas', 'adas', 'idas', 'aras', 'ases', 'íais',
  69          'ados', 'idos', 'amos', 'imos', 'ques', 'iran', 'irem', 'iren', 'ires', 'ireu', 'iria', 'iràs', 'eixi', 'eixo',
  70          'isin', 'isis', 'esca', 'isca', 'ïsca', 'ïren', 'ïres', 'ïxen', 'ïxes', 'ixen', 'ixes', 'inin', 'inis', 'ineu',
  71          'itza', 'itzi', 'itzo', 'itzà', 'arem', 'ent', 'arà', 'ará', 'ara', 'aré', 'erá', 'eré', 'irá', 'iré', 'íeu',
  72          'ies', 'íem', 'ìeu', 'ien', 'uda', 'ava', 'ats', 'ant', 'ïen', 'ams', 'ïes', 'dre', 'eix', 'ïda', 'aba', 'ada',
  73          'ida', 'its', 'ids', 'ase', 'ían', 'ado', 'ido', 'ieu', 'ess', 'ass', 'ías', 'áis', 'ira', 'irà', 'irè', 'sis',
  74          'sin', 'int', 'isc', 'ïsc', 'ïra', 'ïxo', 'ixo', 'ixa', 'ini', 'itz', 'iïn', 're', 'ie', 'er', 'ia', 'at', 'ut',
  75          'au', 'ïm', 'ïu', 'és', 'en', 'es', 'em', 'am', 'ïa', 'it', 'ït', 'ía', 'ad', 'ed', 'id', 'an', 'ió', 'ar',
  76          'ir', 'as', 'ii', 'io', 'ià', 'ís', 'ïx', 'ix', 'in', 'às', 'iï', 'iïs', 'í'
  77      ];
  78  
  79      protected static $residual_suffixes = [
  80          'itz', 'it', 'os', 'eu', 'iu', 'is', 'ir', 'ïn', 'ïs', 'a', 'o', 'á', 'à', 'í', 'ó', 'e', 'é', 'i', 's', 'ì',
  81          'ï'
  82      ];
  83  
  84      /**
  85       * {@inheritdoc}
  86       */
  87      public function stem($word)
  88      {
  89          // we do ALL in UTF-8
  90          if (!UTF8::is_utf8($word)) {
  91              throw new \Exception('Word must be in UTF-8');
  92          }
  93  
  94          $this->word = UTF8::strtolower($word);
  95  
  96          // Catalan stemmer does not use Rv
  97          $this->r1();
  98          $this->r2();
  99  
 100          // Step 0: Attached pronoun
 101          $this->step0();
 102  
 103          $word = $this->word;
 104          // Step 1a: Standard suffix
 105          $this->step1a();
 106  
 107          // Step 1b: Verb suffix
 108          // Do step 1b if no ending was removed by step 1a.
 109          if ($this->word == $word) {
 110              $this->step1b();
 111          }
 112  
 113          $this->step2();
 114          $this->finish();
 115  
 116          return $this->word;
 117      }
 118  
 119      /**
 120       * Step 0: Attached pronoun
 121       *
 122       * Search for the longest among the following suffixes
 123       * and delete it in R1.
 124       */
 125  
 126      private function step0()
 127      {
 128          if (($position = $this->search(static::$attached_pronoun)) !== false) {
 129              if ($this->inR1($position)) {
 130                  $this->word = UTF8::substr($this->word, 0, $position);
 131                  return true;
 132              }
 133          }
 134          return false;
 135      }
 136  
 137      /**
 138       * Step 1a: Standard suffix
 139       */
 140      private function step1a()
 141      {
 142          // Run step 1a.2 before 1a.1, since they overlap on `cions` (1a.1) and `acions` (1a.2)
 143          //
 144          // Step 1a.2.
 145          // acions ada ades
 146          //      delete if in R2
 147          if (($position = $this->search(['acions', 'ada', 'ades'])) !== false) {
 148              if ($this->inR2($position)) {
 149                  $this->word = UTF8::substr($this->word, 0, $position);
 150              }
 151              return true;
 152          }
 153  
 154          // Step 1a.1.
 155          // ar atge formes icte ictes ell ells ella és ès esc essa et ets eta eres eries ers ina ines able ls ió itat
 156          // itats itzar iva ives ivisme ius fer ment amen ament aments ments ot sfera al als era ana iste aire eria esa
 157          // eses esos or ícia ícies icis ici íci ícis ària àries alla ció cions n{c}a nces ó dor all il ístic enc enca
 158          // ís issa issos íssem íssiu issem isseu ísseu ós osa dora dores dors adura ble bles ívol ívola dís egar ejar
 159          // ificar itar ables adors idores idors adora ació doras dur dures alleng{u"}es ant ants ancia ancies atòria
 160          // atòries tori toris ats ions ota isam ors ora ores isament bilitat bilitats ivitat ivitats ari aris ionisme
 161          // ionista ionistes ialista ialistes ialisme ialismes ud uts uds encia encies ència ències ïtat ïtats atiu
 162          // atius atives ativa ativitat ativitats ible ibles assa asses assos ent ents íssim íssima íssims íssimes
 163          // ìssem ìsseu ìssin ims ima imes isme ista ismes istes inia inies íinia ínies ita ites triu trius oses osos
 164          // ient otes ots
 165          // 
 166          //      delete if in R1
 167          if (($position = $this->search(self::$standard_suffix_1a)) !== false) {
 168              if ($this->inR1($position)) {
 169                  $this->word = UTF8::substr($this->word, 0, $position);
 170              }
 171              return true;
 172          }
 173  
 174          // Step 1a.3.
 175          // logía logíes logia logies logi logis lógica lógics lógiques
 176          //      replace with log if in R2
 177          if (($position = $this->search(
 178                  ['logía', 'logíes', 'logia', 'logies', 'logis', 'lógica', 'lógics', 'lógiques', 'logi']
 179              )) !== false) {
 180              if ($this->inR2($position)) {
 181                  $this->word = preg_replace(
 182                      '#(logía|logíes|logia|logies|logis|lógica|lógics|lógiques|logi)$#u', 'log', $this->word
 183                  );
 184              }
 185              return true;
 186          }
 187  
 188          // Step 1a.4.
 189          // ic ica ics iques
 190          //      replace with ic if in R2
 191          if (($position = $this->search(['ics', 'ica', 'iques', 'ic'])) !== false) {
 192              if ($this->inR2($position)) {
 193                  $this->word = preg_replace('#(ics|ica|iques|ic)$#u', 'ic', $this->word);
 194              }
 195              return true;
 196          }
 197  
 198          // Step 1a.5.
 199          // quíssims quíssimes quíssima quíssim
 200          //      replace with c if in R1
 201          if (($position = $this->search(['quíssima', 'quíssims', 'quíssimes', 'quíssim'])) !== false) {
 202              if ($this->inR1($position)) {
 203                  $this->word = preg_replace('#(quíssima|quíssims|quíssimes|quíssim)$#u', 'c', $this->word);
 204              }
 205              return true;
 206          }
 207  
 208          return false;
 209      }
 210  
 211      /**
 212       * Step 1b: Verb suffixes
 213       *      Search for the longest among the following suffixes in r1 and r2, and
 214       *      perform the action indicated.
 215       */
 216      private function step1b()
 217      {
 218          // Step 1b.1
 219          //
 220          // aríamos eríamos iríamos eresseu iéramos iésemos adores aríais aremos eríais
 221          // eremos iríais iremos ierais ieseis asteis isteis ábamos áramos ásemos isquen
 222          // esquin esquis esques esquen ïsquen ïsques adora adors arían arías arian
 223          // arien aries aréis erían erías eréis erass irían irías iréis asseu esseu
 224          // àsseu àssem àssim àssiu essen esses assen asses assim assiu éssen ésseu
 225          // éssim éssiu éssem aríem aríeu eixer eixes ieran iesen ieron iendo essin
 226          // essis assin assis essim èssim èssiu ieras ieses abais arais aseis íamos
 227          // irien iries irìem irìeu iguem igueu esqui eixin eixis eixen iríem iríeu
 228          // atges issen isses issin issis issiu issim ïssin íssiu íssim ïssis ïguem
 229          // ïgueu ïssen ïsses itzeu itzis ador ents udes eren arán arás aria aràs
 230          // aría arés erán erás ería erau irán irás iría írem íreu aves avem ávem
 231          // àvem àveu áveu aven ares àrem àreu àren areu aren tzar ides ïdes ades
 232          // iera iese aste iste aban aran asen aron abas adas idas aras ases íais
 233          // ados idos amos imos ques iran irem iren ires ireu iria iràs eixi eixo
 234          // isin isis esca isca ïsca ïren ïres ïxen ïxes ixen ixes inin inis ineu
 235          // itza itzi itzo itzà arem ent arà ará ara aré erá eré irá iré íeu
 236          // ies íem ìeu ien uda ava ats ant ïen ams ïes dre eix ïda aba ada
 237          // ida its ids ase ían ado ido ieu ess ass ías áis ira irà irè sis
 238          // sin int isc ïsc ïra ïxo ixo ixa ini itz iïn re ie er ia at ut
 239          // au ïm ïu és en es em am ïa it ït ía ad ed id an ió ar
 240          // ir as ii io ià ís ïx ix in às iï iïs í
 241          //      delete if in R1
 242          if (($position = $this->search(static::$verb_suffixes)) !== false) {
 243              if ($this->inR1($position)) {
 244                  $this->word = UTF8::substr($this->word, 0, $position);
 245              }
 246              return true;
 247          }
 248  
 249          // Step 1b.2
 250          // ando
 251          //      delete if in R2
 252          if (($position = $this->search(['ando'])) !== false) {
 253              if ($this->inR2($position)) {
 254                  $this->word = UTF8::substr($this->word, 0, $position);
 255              }
 256              return true;
 257          }
 258          return false;
 259      }
 260  
 261      /**
 262       * Step 2: residual suffix
 263       * Search for the longest among the following suffixes in R1, and perform
 264       * the action indicated.
 265       */
 266      private function step2()
 267      {
 268          // Step 2.1
 269          // residual suffix
 270          //      delete if in R1
 271          if (($position = $this->search(static::$residual_suffixes)) !== false) {
 272              if ($this->inR1($position)) {
 273                  $this->word = UTF8::substr($this->word, 0, $position);
 274              }
 275              return true;
 276          }
 277  
 278          // Step 2.2
 279          // iqu
 280          //      replace with ic if in R1
 281          if (($position = $this->search(['iqu'])) !== false) {
 282              if ($this->inR1($position)) {
 283                  $this->word = preg_replace('#(iqu)$#u', 'ic', $this->word);
 284              }
 285              return true;
 286          }
 287  
 288          return false;
 289      }
 290  
 291      /**
 292       * And finally:
 293       * Remove accents and l aggeminades
 294       */
 295      private function finish()
 296      {
 297          $this->word = UTF8::str_replace(
 298              ['á', 'é', 'í', 'ó', 'ú', 'à', 'è', 'ì', 'ò', 'ï', 'ü', '·'],
 299              ['a', 'e', 'i', 'o', 'u', 'a', 'e', 'i', 'o', 'i', 'u', '.'],
 300              $this->word
 301          );
 302      }
 303  
 304  }


Generated: Wed Sep 7 05:41:13 2022 Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer