mirror of
https://github.com/retailcrm/NameCaseLib.git
synced 2024-12-05 03:16:06 +03:00
[0.4.1] /RU11072715/ распознавание имени, фамилии
This commit is contained in:
parent
67d0c29a6d
commit
5a9da04c24
@ -27,7 +27,7 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
* Версия языкового файла
|
* Версия языкового файла
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
protected $languageBuild = '11072021';
|
protected $languageBuild = '11072715';
|
||||||
/**
|
/**
|
||||||
* Количество падежей в языке
|
* Количество падежей в языке
|
||||||
* @var int
|
* @var int
|
||||||
@ -53,6 +53,46 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
private $ih = array('их', 'ых', 'ко');
|
private $ih = array('их', 'ых', 'ко');
|
||||||
|
/**
|
||||||
|
* Список окончаний характерных для фамилий
|
||||||
|
* По шаблону {letter}* где * любой символ кроме тех, что в {exclude}
|
||||||
|
* @var array of {letter}=>{exclude}
|
||||||
|
*/
|
||||||
|
private $splitSecondExclude = array(
|
||||||
|
'а' => 'взйкмнпрстфя',
|
||||||
|
'б' => 'а',
|
||||||
|
'в' => 'аь',
|
||||||
|
'г' => 'а',
|
||||||
|
'д' => 'ар',
|
||||||
|
'е' => 'бвгдйлмнря',
|
||||||
|
'ё' => 'бвгдйлмнря',
|
||||||
|
'ж' => '',
|
||||||
|
'з' => 'а',
|
||||||
|
'и' => 'гдйклмнопрсфя',
|
||||||
|
'й' => 'ля',
|
||||||
|
'к' => 'аст',
|
||||||
|
'л' => 'аилоья',
|
||||||
|
'м' => 'аип',
|
||||||
|
'н' => 'ат',
|
||||||
|
'о' => 'вдлнпртя',
|
||||||
|
'п' => 'п',
|
||||||
|
'р' => 'адикпть',
|
||||||
|
'с' => 'атуя',
|
||||||
|
'т' => 'аор',
|
||||||
|
'у' => 'дмр',
|
||||||
|
'ф' => 'аь',
|
||||||
|
'х' => 'а',
|
||||||
|
'ц' => 'а',
|
||||||
|
'ч' => '',
|
||||||
|
'ш' => 'а',
|
||||||
|
'щ' => '',
|
||||||
|
'ъ' => '',
|
||||||
|
'ы' => 'дн',
|
||||||
|
'ь' => 'я',
|
||||||
|
'э' => '',
|
||||||
|
'ю' => '',
|
||||||
|
'я' => 'нс'
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Мужские имена, оканчивающиеся на любой ь и -й,
|
* Мужские имена, оканчивающиеся на любой ь и -й,
|
||||||
@ -153,7 +193,7 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
if ($this->in($this->Last(1), 'ьй'))
|
if ($this->in($this->Last(1), 'ьй'))
|
||||||
{
|
{
|
||||||
|
|
||||||
//Слова типа Воробей
|
//Слова типа Воробей
|
||||||
if ($this->Last(3) == 'бей')
|
if ($this->Last(3) == 'бей')
|
||||||
{
|
{
|
||||||
$this->wordForms($this->workingWord, array('ья', 'ью', 'ья', 'ьем', 'ье'), 2);
|
$this->wordForms($this->workingWord, array('ья', 'ью', 'ья', 'ьем', 'ье'), 2);
|
||||||
@ -166,14 +206,14 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
$this->Rule(401);
|
$this->Rule(401);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//Толстой -» ТолстЫм
|
//Толстой -» ТолстЫм
|
||||||
elseif ($this->Last(2, 1) == 'ы' or $this->Last(3, 1) == 'т')
|
elseif ($this->Last(2, 1) == 'ы' or $this->Last(3, 1) == 'т')
|
||||||
{
|
{
|
||||||
$this->wordForms($this->workingWord, array('ого', 'ому', 'ого', 'ым', 'ом'), 2);
|
$this->wordForms($this->workingWord, array('ого', 'ому', 'ого', 'ым', 'ом'), 2);
|
||||||
$this->Rule(402);
|
$this->Rule(402);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//Лесничий
|
//Лесничий
|
||||||
elseif ($this->Last(3) == 'чий')
|
elseif ($this->Last(3) == 'чий')
|
||||||
{
|
{
|
||||||
$this->wordForms($this->workingWord, array('ьего', 'ьему', 'ьего', 'ьим', 'ьем'), 2);
|
$this->wordForms($this->workingWord, array('ьего', 'ьему', 'ьего', 'ьим', 'ьем'), 2);
|
||||||
@ -198,7 +238,7 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
{
|
{
|
||||||
if ($this->Last(1) == 'к')
|
if ($this->Last(1) == 'к')
|
||||||
{
|
{
|
||||||
//Если перед слово на ок, то нужно убрать о
|
//Если перед слово на ок, то нужно убрать о
|
||||||
if ($this->Last(2, 1) == 'о')
|
if ($this->Last(2, 1) == 'о')
|
||||||
{
|
{
|
||||||
$this->wordForms($this->workingWord, array('ка', 'ку', 'ка', 'ком', 'ке'), 2);
|
$this->wordForms($this->workingWord, array('ка', 'ку', 'ка', 'ком', 'ке'), 2);
|
||||||
@ -233,14 +273,14 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
$this->Rule(601);
|
$this->Rule(601);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//е перед ц выпадает
|
//е перед ц выпадает
|
||||||
elseif ($this->Last(2) == 'ец')
|
elseif ($this->Last(2) == 'ец')
|
||||||
{
|
{
|
||||||
$this->wordForms($this->workingWord, array('ца', 'цу', 'ца', 'цом', 'це'), 2);
|
$this->wordForms($this->workingWord, array('ца', 'цу', 'ца', 'цом', 'це'), 2);
|
||||||
$this->Rule(604);
|
$this->Rule(604);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
elseif ($this->in($this->Last(1), 'цсрш'))
|
elseif ($this->in($this->Last(1), 'цсршм'))
|
||||||
{
|
{
|
||||||
$this->wordForms($this->workingWord, array('а', 'у', 'а', 'ом', 'е'));
|
$this->wordForms($this->workingWord, array('а', 'у', 'а', 'ом', 'е'));
|
||||||
$this->Rule(602);
|
$this->Rule(602);
|
||||||
@ -263,7 +303,7 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
{
|
{
|
||||||
if ($this->Last(1) == "а")
|
if ($this->Last(1) == "а")
|
||||||
{
|
{
|
||||||
//Если основа на ш, то нужно и, ей
|
//Если основа на ш, то нужно и, ей
|
||||||
if ($this->Last(2, 1) == 'ш')
|
if ($this->Last(2, 1) == 'ш')
|
||||||
{
|
{
|
||||||
$this->wordForms($this->workingWord, array('и', 'е', 'у', 'ей', 'е'), 1);
|
$this->wordForms($this->workingWord, array('и', 'е', 'у', 'ей', 'е'), 1);
|
||||||
@ -324,7 +364,7 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//ей посля шиплячего
|
//ей посля шиплячего
|
||||||
if ($this->Last(2, 1) == 'ш')
|
if ($this->Last(2, 1) == 'ш')
|
||||||
{
|
{
|
||||||
$this->wordForms($this->workingWord, array('и', 'е', 'у', 'ей', 'е'), 1);
|
$this->wordForms($this->workingWord, array('и', 'е', 'у', 'ей', 'е'), 1);
|
||||||
@ -463,7 +503,7 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
*/
|
*/
|
||||||
protected function manFatherName()
|
protected function manFatherName()
|
||||||
{
|
{
|
||||||
//Проверяем действительно ли отчество
|
//Проверяем действительно ли отчество
|
||||||
if ($this->inNames($this->workingWord, 'Ильич'))
|
if ($this->inNames($this->workingWord, 'Ильич'))
|
||||||
{
|
{
|
||||||
$this->wordForms($this->workingWord, array('а', 'у', 'а', 'ом', 'е'));
|
$this->wordForms($this->workingWord, array('а', 'у', 'а', 'ом', 'е'));
|
||||||
@ -483,7 +523,7 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
*/
|
*/
|
||||||
protected function womanFatherName()
|
protected function womanFatherName()
|
||||||
{
|
{
|
||||||
//Проверяем действительно ли отчество
|
//Проверяем действительно ли отчество
|
||||||
if ($this->Last(2) == 'на')
|
if ($this->Last(2) == 'на')
|
||||||
{
|
{
|
||||||
$this->wordForms($this->workingWord, array('ы', 'е', 'у', 'ой', 'е'), 1);
|
$this->wordForms($this->workingWord, array('ы', 'е', 'у', 'ой', 'е'), 1);
|
||||||
@ -502,8 +542,8 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
|
|
||||||
$man = 0; //Мужчина
|
$man = 0; //Мужчина
|
||||||
$woman = 0; //Женщина
|
$woman = 0; //Женщина
|
||||||
//Попробуем выжать максимум из имени
|
//Попробуем выжать максимум из имени
|
||||||
//Если имя заканчивается на й, то скорее всего мужчина
|
//Если имя заканчивается на й, то скорее всего мужчина
|
||||||
if ($this->Last(1) == 'й')
|
if ($this->Last(1) == 'й')
|
||||||
{
|
{
|
||||||
$man+=0.9;
|
$man+=0.9;
|
||||||
@ -619,12 +659,12 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
$length = NCLStr::strlen($namepart);
|
$length = NCLStr::strlen($namepart);
|
||||||
$this->setWorkingWord($namepart);
|
$this->setWorkingWord($namepart);
|
||||||
|
|
||||||
//Считаем вероятность
|
//Считаем вероятность
|
||||||
$first = 0;
|
$first = 0;
|
||||||
$second = 0;
|
$second = 0;
|
||||||
$father = 0;
|
$father = 0;
|
||||||
|
|
||||||
//если смахивает на отчество
|
//если смахивает на отчество
|
||||||
if ($this->in($this->Last(3), array('вна', 'чна', 'вич', 'ьич')))
|
if ($this->in($this->Last(3), array('вна', 'чна', 'вич', 'ьич')))
|
||||||
{
|
{
|
||||||
$father+=3;
|
$father+=3;
|
||||||
@ -634,7 +674,7 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
{
|
{
|
||||||
$first+=0.5;
|
$first+=0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* буквы на которые никогда не закнчиваются имена
|
* буквы на которые никогда не закнчиваются имена
|
||||||
*/
|
*/
|
||||||
@ -642,7 +682,18 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
{
|
{
|
||||||
$second += 0.3;
|
$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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Не бывает имет с такими предпоследними буквами
|
* Не бывает имет с такими предпоследними буквами
|
||||||
*/
|
*/
|
||||||
@ -692,13 +743,15 @@ class NCLNameCaseRu extends NCLNameCaseCore
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Похоже на имя
|
/**
|
||||||
if ($this->in($this->Last(3), array('тин', 'тын')))
|
* Слова, которые заканчиваются на тин
|
||||||
|
*/
|
||||||
|
if($this->Last(3) == 'тин' and $this->Last(4, 1) == 'нст')
|
||||||
{
|
{
|
||||||
$first+=0.5;
|
$first += 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Исключения
|
//Исключения
|
||||||
if ($this->inNames($namepart, array('Лев', 'Яков', 'Маша', 'Ольга', 'Еремей', 'Исак', 'Исаак', 'Ева', 'Ирина', 'Элькин', 'Мерлин')))
|
if ($this->inNames($namepart, array('Лев', 'Яков', 'Маша', 'Ольга', 'Еремей', 'Исак', 'Исаак', 'Ева', 'Ирина', 'Элькин', 'Мерлин')))
|
||||||
{
|
{
|
||||||
$first+=10;
|
$first+=10;
|
||||||
|
Loading…
Reference in New Issue
Block a user