[0.1.1] Автоматическое определение пола

This commit is contained in:
Andriy Chaika 2011-05-03 23:27:58 +03:00
parent 151ae78e4e
commit c582dc176c
3 changed files with 134 additions and 5 deletions

View File

@ -7,7 +7,7 @@
*
* @license Dual licensed under the MIT or GPL Version 2 licenses.
* @author Андрей Чайка http://seagull.net.ua/ bymer3@gmail.com
* @version 0.1.0 30.04.2011
* @version 0.1.1 03.05.2011
*
*/
@ -782,8 +782,6 @@ class NCLNameCaseRu
/*
* Автоматическое определение пола
* (в разработке)
*
* @return void
*/
@ -791,10 +789,130 @@ class NCLNameCaseRu
{
if (!$this->gender)
{
$this->gender = NCLNameCaseRu::$MAN;
//Определение пола по отчеству
if (isset($this->fatherName) and $this->fatherName)
{
$LastTwo = mb_substr($this->fatherName, -2, 2, 'utf-8');
if ($LastTwo=='ич')
{
$this->gender=NCLNameCaseRu::$MAN; // мужчина
return true;
}
if ($LastTwo=='на')
{
$this->gender=NCLNameCaseRu::$WOMAN; // женщина
return true;
}
}
$man=0; //Мужчина
$woman=0; //Женщина
$FLastSymbol=mb_substr($this->firstName, -1, 1, 'utf-8');
$FLastTwo=mb_substr($this->firstName, -2, 2, 'utf-8');
$FLastThree=mb_substr($this->firstName, -3, 3, 'utf-8');
$FLastFour=mb_substr($this->firstName, -4, 4, 'utf-8');
$SLastSymbol=mb_substr($this->secondName, -1, 1, 'utf-8');
$SLastTwo=mb_substr($this->secondName, -2, 2, 'utf-8');
$SLastThree=mb_substr($this->secondName, -3, 3, 'utf-8');
//Если нет отчества, то определяем по имени и фамилии, будем считать вероятность
if (isset($this->firstName) and $this->firstName)
{
//Попробуем выжать максимум из имени
//Если имя заканчивается на й, то скорее всего мужчина
if($FLastSymbol=='й')
{
$man+=0.9;
}
if(in_array($FLastTwo, array('он', 'ов', 'ав', 'ам','ол', 'ан', 'рд', 'мп')))
{
$man+=0.3;
}
if($this->in($FLastSymbol,$this->consonant))
{
$man+=0.01;
}
if($FLastSymbol=='ь')
{
$man+=0.02;
}
if(in_array($FLastTwo, array('вь', 'фь', 'ль')))
{
$woman+=0.1;
}
if(in_array($FLastTwo, array('ла')))
{
$woman+=0.04;
}
if(in_array($FLastTwo, array('то', 'ма')))
{
$man+=0.01;
}
if(in_array($FLastThree, array('лья','вва','ока','ука', 'ита')))
{
$man+=0.2;
}
if(in_array($FLastThree, array('има')))
{
$woman+=0.15;
}
if(in_array($FLastThree, array('лия', 'ния', 'сия','дра','лла','кла')))
{
$woman+=0.5;
}
if(in_array($FLastFour, array('льда', 'фира', 'нина','лита')))
{
$woman+=0.5;
}
}
if (isset($this->secondName) and $this->secondName)
{
if(in_array($SLastTwo, array('ов','ин', 'ев', 'ий', 'ёв','ый', 'ын','ой')))
{
$man+=0.4;
}
if(in_array($SLastThree, array('ова', 'ина', 'ева', 'ёва', 'ына','ая')))
{
$woman+=0.4;
}
if(in_array($SLastTwo, array('ая')))
{
$woman+=0.4;
}
}
//Теперь смотрим, кто больше набрал
if($man>$woman)
{
$this->gender = NCLNameCaseRu::$MAN;
}
else
{
$this->gender = NCLNameCaseRu::$WOMAN;
}
}
}
/*
* Автоматическое определение пола
* Возвращает пол по ФИО
* @return integer
*/
public function genderAutoDetect()
{
$this->gender=null;
$this->genderDetect();
return $this->gender;
}
/*
* Склонение имени
*

View File

@ -49,5 +49,8 @@ echo 'Отчет, ' .
-----------
Dual licensed under the MIT or GPL Version 2 licenses.
## 0.1.1 (2011-05-03)
- Написана функция определения пола NCLNameCaseRu::GenderAutoDetect() — отлично справляется с парами Имя Фамилия, по моим тестам дает 100% прохождение тестов (2000 пар имен и фамилий). Если указано отчество, пол определает без проблем.Для просто имен вероятность правильного определения больше 98,5%. Для просто фамилий — больше 96%.
## 0.1.0 (2011-05-01)
- Первая версия библиотеки

View File

@ -38,6 +38,7 @@ class NCLNameCaseRuTest extends PHPUnit_Framework_TestCase
public function test2()
{
$this->object->setSecondName('Касюк');
$this->object->setGender(1);
$this->assertEquals('Касюка', $this->object->getSecondNameCase(1));
}
@ -57,12 +58,14 @@ class NCLNameCaseRuTest extends PHPUnit_Framework_TestCase
public function test5()
{
$this->object->setSirname('Касюк');
$this->object->setGender(1);
$this->assertEquals('Касюка', $this->object->getSecondNameCase(1));
}
public function test6()
{
$this->object->setLastName('Касюк');
$this->object->setGender(1);
$this->assertEquals('Касюка', $this->object->getSecondNameCase(1));
}
@ -109,4 +112,9 @@ class NCLNameCaseRuTest extends PHPUnit_Framework_TestCase
{
$this->assertEquals('на Чайке Андрее Николаевиче красивая рубашка', $this->object->qFullName("Чайка", 'Андрей', 'Николаевич', 1, 5, "на S N F красивая рубашка"));
}
public function test14()
{
$this->assertEquals('комментария', $this->object->qFirstName('комментарий',NCLNameCaseRu::$RODITLN , NCLNameCaseRu::$MAN));
}
}