/// <summary> /// Просумировать две вероятности /// </summary> /// <param name="number">Первая вероятность</param> /// <param name="add">Вторая вероятность</param> /// <returns>Сумма вероятностей</returns> static public GenderProbability operator+(GenderProbability number, GenderProbability add) { GenderProbability result = new GenderProbability(0, 0); result.Man = number.Man + add.Man; result.Woman = number.Woman + add.Woman; return result; }
/// <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> /// Визначення статі, за правилами імені /// <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 NCLNameCaseWord word обьект класса слов, для которого нужно определить пол /// </summary> protected override void GenderByFirstName(Word word) { SetWorkingWord(word.Name); GenderProbability prob = new GenderProbability(); //Попробуем выжать максимум из имени //Если имя заканчивается на й, то скорее всего мужчина if (Last(1) == "й") { prob.Man+=0.9f; } if (In(Last(2), new String [] {"он", "ов", "ав", "ам", "ол", "ан", "рд", "мп"})) { 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 String [] {"вь", "фь", "ль"})) { prob.Woman+=0.1f; } if (In(Last(2), new String [] {"ла"})) { prob.Woman+=0.04f; } if (In(Last(2), new String [] {"то", "ма"})) { prob.Man+=0.01f; } if (In(Last(3), new String [] {"лья", "вва", "ока", "ука", "ита"})) { prob.Man+=0.2f; } if (In(Last(3), new String [] {"има"})) { prob.Woman+=0.15f; } if (In(Last(3), new String [] {"лия", "ния", "сия", "дра", "лла", "кла", "опа"})) { prob.Woman+=0.5f; } if (In(Last(4), new String [] {"льда", "фира", "нина", "лита", "алья"})) { prob.Woman+=0.5f; } word.GenderProbability = prob; }
/// <summary> /// Принимает решение о текущем поле человека /// </summary> private void SolveGender() { //Ищем, может гдето пол уже установлен int length = words.Length; for (int i = 0; i < length; i++) { if (words.GetWord(i).isGenderSolved()) { SetGender(words.GetWord(i).Gender); return; } } //Если нет тогда определяем у каждого слова и потом сумируем GenderProbability probability = new GenderProbability(0, 0); for (int i = 0; i < 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); } }