/**
  * Ідентифікує слово визначаючи чи це ім’я, чи це прізвище, чи це побатькові
  * - <b>N</b> - ім’я
  * - <b>S</b> - прізвище
  * - <b>F</b> - по-батькові
  * @param NCLNameCaseWord $word об’єкт класу зі словом, яке необхідно ідентифікувати
  */
 protected function detectNamePart(NCLNameCaseWord $word)
 {
     $namepart = $word->getWord();
     $this->setWorkingWord($namepart);
     //Считаем вероятность
     $first = 0;
     $second = 0;
     $father = 0;
     //если смахивает на отчество
     if ($this->in($this->Last(3), array('вна', 'чна', 'ліч')) or $this->in($this->Last(4), array('ьмич', 'ович'))) {
         $father += 3;
     }
     //Похоже на имя
     if ($this->in($this->Last(3), array('тин')) or $this->in($this->Last(4), array('ьмич', 'юбов', 'івна', 'явка', 'орив', 'кіян'))) {
         $first += 0.5;
     }
     //Исключения
     if ($this->inNames($namepart, array('Лев', 'Гаїна', 'Афіна', 'Антоніна', 'Ангеліна', 'Альвіна', 'Альбіна', 'Аліна', 'Павло', 'Олесь', 'Микола', 'Мая', 'Англеліна', 'Елькін'))) {
         $first += 10;
     }
     //похоже на фамилию
     if ($this->in($this->Last(2), array('ов', 'ін', 'ев', 'єв', 'ий', 'ин', 'ой', 'ко', 'ук', 'як', 'ца', 'их', 'ик', 'ун', 'ок', 'ша', 'ая', 'га', 'єк', 'аш', 'ив', 'юк', 'ус', 'це', 'ак', 'бр', 'яр', 'іл', 'ів', 'ич', 'сь', 'ей', 'нс', 'яс', 'ер', 'ай', 'ян', 'ах', 'ць', 'ющ', 'іс', 'ач', 'уб', 'ох', 'юх', 'ут', 'ча', 'ул', 'вк', 'зь', 'уц', 'їн', 'де', 'уз'))) {
         $second += 0.4;
     }
     if ($this->in($this->Last(3), array('ова', 'ева', 'єва', 'тих', 'рик', 'вач', 'аха', 'шен', 'мей', 'арь', 'вка', 'шир', 'бан', 'чий', 'іна', 'їна', 'ька', 'ань', 'ива', 'аль', 'ура', 'ран', 'ало', 'ола', 'кур', 'оба', 'оль', 'нта', 'зій', 'ґан', 'іло', 'шта', 'юпа', 'рна', 'бла', 'еїн', 'има', 'мар', 'кар', 'оха', 'чур', 'ниш', 'ета', 'тна', 'зур', 'нір', 'йма', 'орж', 'рба', 'іла', 'лас', 'дід', 'роз', 'аба', 'лест', 'мара', 'обка', 'рока', 'сика', 'одна', 'нчар', 'вата', 'ндар', 'грій'))) {
         $second += 0.4;
     }
     if ($this->in($this->Last(4), array('ьник', 'нчук', 'тник', 'кирь', 'ский', 'шена', 'шина', 'вина', 'нина', 'гана', 'гана', 'хній', 'зюба', 'орош', 'орон', 'сило', 'руба'))) {
         $second += 0.4;
     }
     if ($this->Last(1) == 'і') {
         $second += 0.2;
     }
     $max = max(array($first, $second, $father));
     if ($first == $max) {
         $word->setNamePart('N');
     } elseif ($second == $max) {
         $word->setNamePart('S');
     } else {
         $word->setNamePart('F');
     }
 }
示例#2
0
文件: ncl.php 项目: Burick/altercpa
 /**
  * Идетифицирует слово определяе имя это, или фамилия, или отчество 
  * - <b>N</b> - имя
  * - <b>S</b> - фамилия
  * - <b>F</b> - отчество
  * @param NCLNameCaseWord $word обьект класса слов, который необходимо идентифицировать
  */
 protected function detectNamePart(NCLNameCaseWord $word)
 {
     $namepart = $word->getWord();
     $this->setWorkingWord($namepart);
     //Считаем вероятность
     $first = 0;
     $second = 0;
     $father = 0;
     //если смахивает на отчество
     if ($this->in($this->Last(3), array('вна', 'чна', 'вич', 'ьич'))) {
         $father += 3;
     }
     //Похоже на имя
     if ($this->in($this->Last(3), array('тин', 'тын'))) {
         $first += 0.5;
     }
     //Исключения
     if ($this->inNames($namepart, array('Лев', 'Яков', 'Мальвина', 'Антонина', 'Альбина', 'Агриппина', 'Каллиник', 'Маша', 'Ольга', 'Еремей', 'Фаина', 'Лазарь', 'Екатерина', 'Карина', 'Марина', 'Валентина', 'Кристина', 'Исак', 'Исаак', 'Валентин', 'Константин', 'Мартин', 'Устин', 'Калина', 'Аделина', 'Алина', 'Ангелина', 'Галина', 'Каролина', 'Павлина', 'Полина', 'Элина', 'Мина', 'Нина', 'Ева', 'Ирина', 'Элькин'))) {
         $first += 10;
     }
     //похоже на фамилию
     if ($this->in($this->Last(2), array('ов', 'ин', 'ев', 'ёв', 'ый', 'ын', 'ой', 'ко', 'ук', 'як', 'ца', 'их', 'ик', 'ун', 'ок', 'ша', 'ая', 'га', 'ёк', 'аш', 'ив', 'юк', 'ус', 'це', 'ак', 'бр', 'яр', 'де', 'ых', 'уз'))) {
         $second += 0.4;
     }
     if ($this->in($this->Last(3), array('ова', 'ева', 'ёва', 'ына', 'тых', 'рик', 'вач', 'аха', 'шен', 'мей', 'арь', 'вка', 'шир', 'бан', 'тин', 'чий', 'ина', 'гай'))) {
         $second += 0.4;
     }
     if ($this->in($this->Last(4), array('ьник', 'нчук', 'тник', 'кирь', 'ский', 'шена'))) {
         $second += 0.4;
     }
     $max = max(array($first, $second, $father));
     if ($first == $max) {
         $word->setNamePart('N');
     } elseif ($second == $max) {
         $word->setNamePart('S');
     } else {
         $word->setNamePart('F');
     }
 }
示例#3
0
 /**
  * Идетифицирует слово определяе имя это, или фамилия, или отчество 
  * - <b>N</b> - имя
  * - <b>S</b> - фамилия
  * - <b>F</b> - отчество
  * @param NCLNameCaseWord $word обьект класса слов, который необходимо идентифицировать
  */
 protected function detectNamePart(NCLNameCaseWord $word)
 {
     $namepart = $word->getWord();
     $length = NCLStr::strlen($namepart);
     $this->setWorkingWord($namepart);
     //Считаем вероятность
     $first = 0;
     $second = 0;
     $father = 0;
     //если смахивает на отчество
     if ($this->in($this->Last(3), array('вна', 'чна', 'вич', 'ьич'))) {
         $father += 3;
     }
     if ($this->in($this->Last(2), array('ша'))) {
         $first += 0.5;
     }
     /**
      * буквы на которые никогда не закнчиваются имена
      */
     if ($this->in($this->Last(1), 'еёжхцочшщъыэю')) {
         $second += 0.3;
     }
     /**
      * Используем массив характерных окончаний
      */
     if (isset($this->splitSecondExclude[$this->Last(2, 1)])) {
         if (!$this->in($this->Last(1), $this->splitSecondExclude[$this->Last(2, 1)])) {
             $second += 0.4;
         }
     }
     /**
      * Сохкращенные ласкательные имена типя Аня Галя и.т.д.
      */
     if ($this->Last(1) == 'я' and $this->in($this->Last(3, 1), $this->vowels)) {
         $first += 0.5;
     }
     /**
      * Не бывает имет с такими предпоследними буквами
      */
     if ($this->in($this->Last(2, 1), 'жчщъэю')) {
         $second += 0.3;
     }
     /**
      * Слова на мягкий знак. Существует очень мало имен на мягкий знак. Все остальное фамилии
      */
     if ($this->Last(1) == 'ь') {
         /**
          * Имена типа нинЕЛь адЕЛь асЕЛь
          */
         if ($this->Last(3, 2) == 'ел') {
             $first += 0.7;
         } elseif ($this->inNames($namepart, array('Лазарь', 'Игорь', 'Любовь'))) {
             $first += 10;
         } else {
             $second += 0.3;
         }
     } elseif ($this->in($this->Last(1), $this->consonant . 'ь') and $this->in($this->Last(2, 1), $this->consonant . 'ь')) {
         /**
          * Практически все кроме тех которые оканчиваются на следующие буквы
          */
         if (!$this->in($this->Last(2), array('др', 'кт', 'лл', 'пп', 'рд', 'рк', 'рп', 'рт', 'тр'))) {
             $second += 0.25;
         }
     }
     /**
      * Слова, которые заканчиваются на тин
      */
     if ($this->Last(3) == 'тин' and $this->in($this->Last(4, 1), 'нст')) {
         $first += 0.5;
     }
     //Исключения
     if ($this->inNames($namepart, array('Лев', 'Яков', 'Вова', 'Маша', 'Ольга', 'Еремей', 'Исак', 'Исаак', 'Ева', 'Ирина', 'Элькин', 'Мерлин'))) {
         $first += 10;
     }
     /**
      * Фамилии которые заканчиваются на -ли кроме тех что типа натАли и.т.д.
      */
     if ($this->Last(2) == 'ли' and $this->Last(3, 1) != 'а') {
         $second += 0.4;
     }
     /**
      * Фамилии на -як кроме тех что типа Касьян Куприян + Ян и.т.д.
      */
     if ($this->Last(2) == 'ян' and $length > 2 and !$this->in($this->Last(3, 1), 'ьи')) {
         $second += 0.4;
     }
     /**
      * Фамилии на -ур кроме имен Артур Тимур
      */
     if ($this->Last(2) == 'ур') {
         if (!$this->inNames($namepart, array('Артур', 'Тимур'))) {
             $second += 0.4;
         }
     }
     /**
      * Разбор ласкательных имен на -ик
      */
     if ($this->Last(2) == 'ик') {
         /**
          * Ласкательные буквы перед ик
          */
         if ($this->in($this->Last(3, 1), 'лшхд')) {
             $first += 0.3;
         } else {
             $second += 0.4;
         }
     }
     /**
      * Разбор имен и фамилий, который заканчиваются на ина
      */
     if ($this->Last(3) == 'ина') {
         /**
          * Все похожие на Катерина и Кристина
          */
         if ($this->in($this->Last(7), array('атерина', 'ристина'))) {
             $first += 10;
         } elseif ($this->inNames($namepart, array('Мальвина', 'Антонина', 'Альбина', 'Агриппина', 'Фаина', 'Карина', 'Марина', 'Валентина', 'Калина', 'Аделина', 'Алина', 'Ангелина', 'Галина', 'Каролина', 'Павлина', 'Полина', 'Элина', 'Мина', 'Нина'))) {
             $first += 10;
         } else {
             $second += 0.4;
         }
     }
     /**
      * Имена типа Николай
      */
     if ($this->Last(4) == 'олай') {
         $first += 0.6;
     }
     /**
      * Фамильные окончания
      */
     if ($this->in($this->Last(2), array('ов', 'ин', 'ев', 'ёв', 'ый', 'ын', 'ой', 'ук', 'як', 'ца', 'ун', 'ок', 'ая', 'ёк', 'ив', 'ус', 'ак', 'яр', 'уз', 'ах', 'ай'))) {
         $second += 0.4;
     }
     if ($this->in($this->Last(3), array('ова', 'ева', 'ёва', 'ына', 'шен', 'мей', 'вка', 'шир', 'бан', 'чий', 'кий', 'бей', 'чан', 'ган', 'ким', 'кан', 'мар', 'лис'))) {
         $second += 0.4;
     }
     if ($this->in($this->Last(4), array('шена'))) {
         $second += 0.4;
     }
     $max = max(array($first, $second, $father));
     if ($first == $max) {
         $word->setNamePart('N');
     } elseif ($second == $max) {
         $word->setNamePart('S');
     } else {
         $word->setNamePart('F');
     }
 }
示例#4
0
 /**
  * Если указан номер падежа <var>$number</var>, тогда возвращается строка с таким номером падежа,
  * если нет, тогда возвращается массив со всеми падежами текущего слова.
  * @param NCLNameCaseWord $word слово для котрого нужно вернуть падеж
  * @param int $number номер падежа, который нужно вернуть
  * @return mixed массив или строка с нужным падежом 
  */
 private function getWordCase(NCLNameCaseWord $word, $number = null)
 {
     $cases = $word->getNameCases();
     if (is_null($number) or $number < 0 or $number > $this->CaseCount - 1) {
         return $cases;
     } else {
         return $cases[$number];
     }
 }