From 708703b9547ab4c352024229ee113ff46c34df3e Mon Sep 17 00:00:00 2001 From: Andriy Chaika Date: Wed, 20 Jul 2011 21:12:17 +0300 Subject: [PATCH] =?UTF-8?q?[0.4.1]=20/RU11072011/=20=D0=9F=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B9=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B,=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BF=D0=B5=D1=81=D0=B0=D0=BD=20=D1=80=D1=83=D1=81=D1=81?= =?UTF-8?q?=D0=BA=D0=B8=D0=B9=20=D0=B8=D0=B4=D0=B5=D0=BD=D1=82=D0=B8=D1=84?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=D1=82=D0=BE=D1=80=20=D0=B8=D0=BC=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...{NCL.NameCase.ru.php => NCLNameCaseRu.php} | 167 ++++++++++++++++-- ...{NCL.NameCase.ua.php => NCLNameCaseUa.php} | 0 Tests/Library/NameSplitUAfather.php | 2 +- Tests/Library/NameSplitUAname.php | 2 +- Tests/Library/NameSplitUAsirname.php | 2 +- Tests/Library/NameSplitfather.php | 2 +- Tests/Library/NameSplitname.php | 2 +- Tests/Library/NameSplitsirname.php | 2 +- Tests/TestGenerator/NamesAll/importDB.php | 20 +++ .../Template/NCLNameCaseRuTest.main | 2 +- .../Template/NCLNameCaseUaTest.main | 2 +- 11 files changed, 177 insertions(+), 26 deletions(-) rename Library/{NCL.NameCase.ru.php => NCLNameCaseRu.php} (81%) rename Library/{NCL.NameCase.ua.php => NCLNameCaseUa.php} (100%) create mode 100644 Tests/TestGenerator/NamesAll/importDB.php diff --git a/Library/NCL.NameCase.ru.php b/Library/NCLNameCaseRu.php similarity index 81% rename from Library/NCL.NameCase.ru.php rename to Library/NCLNameCaseRu.php index ddf4546..3c48195 100644 --- a/Library/NCL.NameCase.ru.php +++ b/Library/NCLNameCaseRu.php @@ -22,12 +22,12 @@ require_once dirname(__FILE__) . '/NCL/NCLNameCaseCore.php'; */ class NCLNameCaseRu extends NCLNameCaseCore { + /** * Версия языкового файла * @var string */ - protected $languageBuild = '11071411'; - + protected $languageBuild = '11072011'; /** * Количество падежей в языке * @var int @@ -154,7 +154,7 @@ class NCLNameCaseRu extends NCLNameCaseCore { //Слова типа Воробей - if($this->Last(3) == 'бей') + if ($this->Last(3) == 'бей') { $this->wordForms($this->workingWord, array('ья', 'ью', 'ья', 'ьем', 'ье'), 2); $this->Rule(400); @@ -234,13 +234,13 @@ class NCLNameCaseRu extends NCLNameCaseCore return true; } //е перед ц выпадает - elseif ($this->Last(2)=='ец') + elseif ($this->Last(2) == 'ец') { $this->wordForms($this->workingWord, array('ца', 'цу', 'ца', 'цом', 'це'), 2); $this->Rule(604); return true; } - elseif ($this->in($this->Last(1),'цср')) + elseif ($this->in($this->Last(1), 'цср')) { $this->wordForms($this->workingWord, array('а', 'у', 'а', 'ом', 'е')); $this->Rule(602); @@ -314,7 +314,7 @@ class NCLNameCaseRu extends NCLNameCaseCore */ protected function womanRule1() { - if ($this->Last(1) == "а" and $this->Last(2, 1)!='и') + if ($this->Last(1) == "а" and $this->Last(2, 1) != 'и') { if (!$this->in($this->Last(2, 1), 'шхкг')) { @@ -616,6 +616,7 @@ class NCLNameCaseRu extends NCLNameCaseCore protected function detectNamePart(NCLNameCaseWord $word) { $namepart = $word->getWord(); + $length = NCLStr::strlen($namepart); $this->setWorkingWord($namepart); //Считаем вероятность @@ -628,12 +629,69 @@ class NCLNameCaseRu extends NCLNameCaseCore { $father+=3; } - + if ($this->in($this->Last(2), array('ик', 'ша'))) { $first+=0.5; } - + + /** + * буквы на которые никогда не закнчиваются имена + */ + if ($this->in($this->Last(1), 'еёжхцочшщъыэю')) + { + $second += 0.3; + } + + /** + * Не бывает имет с такими предпоследними буквами + */ + 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->in($this->Last(3), array('тин', 'тын'))) { @@ -641,27 +699,100 @@ class NCLNameCaseRu extends NCLNameCaseCore } //Исключения - if ($this->inNames($namepart, array('Лев', 'Яков', 'Мальвина', 'Антонина', 'Альбина', 'Агриппина', 'Каллиник', 'Маша', 'Ольга', 'Еремей', 'Фаина', 'Лазарь', 'Карина', 'Марина', 'Валентина', 'Исак', 'Исаак', 'Валентин', 'Константин', 'Мартин', 'Устин', 'Калина', 'Аделина', 'Алина', 'Ангелина', 'Галина', 'Каролина', 'Павлина', 'Полина', 'Элина', 'Мина', 'Нина', 'Ева', 'Ирина', 'Элькин', 'Мерлин'))) + if ($this->inNames($namepart, array('Лев', 'Яков', 'Маша', 'Ольга', 'Еремей', 'Исак', 'Исаак', 'Ева', 'Ирина', 'Элькин', 'Мерлин'))) { $first+=10; } - - if($this->in($this->Last(7),array('атерина', 'ристина'))) - { - $first+=10; - } - //похоже на фамилию - if ($this->in($this->Last(2), array('ов', 'ин', 'ев', 'ёв', 'ый', 'ын', 'ой', 'ко', 'ук', 'як', 'ца', 'их', 'ун', 'ок', 'ая', 'га', 'ёк', 'аш', 'ив', 'юк', 'ус', 'це', 'ак', 'бр', 'яр', 'де', 'ых', 'уз', 'ах', 'рг', 'ец', 'юр', 'ич', 'ро', 'ло', 'ть', 'ль', 'ли', 'ур'))) + + + + /** + * Фамилии которые заканчиваются на -ли кроме тех что типа натАли и.т.д. + */ + if ($this->Last(2) == 'ли' and $this->Last(3, 1) != 'а') { $second+=0.4; } - if ($this->in($this->Last(3), array('ова', 'ева', 'ёва', 'ына', 'тых', 'рик', 'вач', 'аха', 'шен', 'мей', 'арь', 'вка', 'шир', 'бан', 'тин', 'чий', 'ина', 'гай', 'кий', 'бей', 'чан', 'ган', 'ник', 'ким', 'бян', 'кан'))) + /** + * Фамилии на -як кроме тех что типа Касьян Куприян + Ян и.т.д. + */ + if ($this->Last(2) == 'ян' and $length > 2 and !$this->in($this->Last(3, 1), 'ьи')) { $second+=0.4; } - if ($this->in($this->Last(4), array('ьник', 'нчук', 'тник', 'кирь', 'ский', 'шена'))) + /** + * Фамилии на -ур кроме имен Артур Тимур + */ + 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->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; } diff --git a/Library/NCL.NameCase.ua.php b/Library/NCLNameCaseUa.php similarity index 100% rename from Library/NCL.NameCase.ua.php rename to Library/NCLNameCaseUa.php diff --git a/Tests/Library/NameSplitUAfather.php b/Tests/Library/NameSplitUAfather.php index 027a6a1..51c4b24 100644 --- a/Tests/Library/NameSplitUAfather.php +++ b/Tests/Library/NameSplitUAfather.php @@ -1,6 +1,6 @@ diff --git a/Tests/TestGenerator/Template/NCLNameCaseRuTest.main b/Tests/TestGenerator/Template/NCLNameCaseRuTest.main index a87dca3..3ecd11a 100644 --- a/Tests/TestGenerator/Template/NCLNameCaseRuTest.main +++ b/Tests/TestGenerator/Template/NCLNameCaseRuTest.main @@ -1,6 +1,6 @@