/** * Ідентифікує слово визначаючи чи це ім’я, чи це прізвище, чи це побатькові * - <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'); } }
/** * Идетифицирует слово определяе имя это, или фамилия, или отчество * - <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'); } }
/** * Идетифицирует слово определяе имя это, или фамилия, или отчество * - <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'); } }
/** * Склоняет слово <var>$word</var> по нужным правилам в зависимости от пола и типа слова * @param NCLNameCaseWord $word слово, которое нужно просклонять */ private function WordCase(NCLNameCaseWord $word) { $gender = $word->gender() == NCL::$MAN ? 'man' : 'woman'; $namepart = ''; switch ($word->getNamePart()) { case 'F': $namepart = 'Father'; break; case 'N': $namepart = 'First'; break; case 'S': $namepart = 'Second'; break; } $method = $gender . $namepart . 'Name'; $this->setWorkingWord($word->getWord()); if ($this->{$method}()) { $word->setNameCases($this->lastResult); $word->setRule($this->lastRule); } else { $word->setNameCases(array_fill(0, $this->CaseCount, $word->getWord())); $word->setRule(-1); } }