/// <summary> /// Принимает решение о текущем поле человека /// </summary> private void SolveGender() { // Ищем, может где-то пол уже установлен for (int i = 0; i < _words.Length; i++) { if (_words.GetWord(i).isGenderSolved()) { SetGender(_words.GetWord(i).Gender); return; } } // Если нет, тогда определяем у каждого слова и потом суммируем GenderProbability probability = new GenderProbability(0, 0); for (int i = 0; i < _words.Length; i++) { Word word = _words.GetWord(i); PrepareGender(word); probability = probability + word.GenderProbability; } if (probability.Man > probability.Woman) { SetGender(Gender.Man); } else { SetGender(Gender.Woman); } }
/// <summary> /// Визначення статі, за правилами імені /// <param name="word">Слово</param> /// </summary> protected override void GenderByFirstName(Word word) { SetWorkingWord(word.Name); GenderProbability prob = new GenderProbability(); //Попробуем выжать максимум из имени //Если имя заканчивается на й, то скорее всего мужчина if (Last(1) == "й") { prob.Man += 0.9f; } if (InNames(workingWord, new String[] { "петро", "микола" })) { prob.Man += 30; } if (In(Last(2), new String[] { "он", "ов", "ав", "ам", "ол", "ан", "рд", "мп", "ко", "ло" })) { prob.Man += 0.5f; } if (In(Last(3), new String[] { "бов", "нка", "яра", "ила", "опа" })) { prob.Woman += 0.5f; } if (In(Last(1), consonant)) { prob.Man += 0.01f; } if (Last(1) == "ь") { prob.Man += 0.02f; } if (In(Last(2), new String[] { "дь" })) { prob.Woman += 0.1f; } if (In(Last(3), new String[] { "ель", "бов" })) { prob.Woman += 0.4f; } word.GenderProbability = prob; }
/// <summary> /// Визначення статі, за правилами прізвища /// <param name="word">Слово</param> /// </summary> protected override void GenderBySurName(Word word) { SetWorkingWord(word.Value); GenderProbability prob = new GenderProbability(); if (In(Last(2), new string[] { "ов", "ин", "ев", "єв", "ін", "їн", "ий", "їв", "ів", "ой", "ей" })) { prob.Man += 0.4f; } if (In(Last(3), new string[] { "ова", "ина", "ева", "єва", "іна", "мін" })) { prob.Woman += 0.4f; } if (In(Last(2), new string[] { "ая" })) { prob.Woman += 0.4f; } word.GenderProbability = prob; }
/// <summary> /// Определение пола по правилам фамилий /// @param NCLNameCaseWord word обьект класса слов, для которого нужно определить пол /// </summary> protected override void GenderBySecondName(Word word) { SetWorkingWord(word.Name); GenderProbability prob = new GenderProbability(); if (In(Last(2), new String [] { "ов", "ин", "ев", "ий", "ёв", "ый", "ын", "ой" })) { prob.Man += 0.4f; } if (In(Last(3), new String [] { "ова", "ина", "ева", "ёва", "ына", "мин" })) { prob.Woman += 0.4f; } if (In(Last(2), new String [] { "ая" })) { prob.Woman += 0.4f; } word.GenderProbability = prob; }
/// <summary> /// Определение пола по правилам имен /// </summary> /// <param name="word">обьект класса слов, для которого нужно определить пол</param> protected override void GenderByName(Word word) { SetWorkingWord(word.Value); GenderProbability prob = new GenderProbability(); // Попробуем выжать максимум из имени // Если имя заканчивается на "й", то скорее всего мужчина if (Last(1) == "й") { prob.Man += 0.9f; } if (In(Last(2), new[] { "он", "ов", "ав", "ам", "ол", "ан", "рд", "мп" })) { prob.Man += 0.3f; } if (In(Last(1), consonant)) { prob.Man += 0.01f; } if (Last(1) == "ь") { prob.Man += 0.02f; } if (In(Last(2), new[] { "вь", "фь", "ль" })) { prob.Woman += 0.1f; } if (In(Last(2), new[] { "ла" })) { prob.Woman += 0.04f; } if (In(Last(2), new[] { "то", "ма" })) { prob.Man += 0.01f; } if (In(Last(3), new[] { "лья", "вва", "ока", "ука", "ита" })) { prob.Man += 0.2f; } if (In(Last(3), new[] { "има" })) { prob.Woman += 0.15f; } if (In(Last(3), new[] { "лия", "ния", "сия", "дра", "лла", "кла", "опа" })) { prob.Woman += 0.5f; } if (In(Last(4), new[] { "льда", "фира", "нина", "лита", "алья" })) { prob.Woman += 0.5f; } word.GenderProbability = prob; }