/// <summary> /// Определяет, чем является слово: именем, фамилией или отчеством /// </summary> /// <param name="word">слово, которое необходимо определить</param> protected override void DetectFioPart(Word word) { SetWorkingWord(word.Value); // Считаем вероятность float first = 0; float surname = 0; float patr = 0; // Если смахивает на отчество if (word.Position > 1 && In(Last(3), new string[] { "вна", "чна", "вич", "ьич" })) { patr += 3; } if (In(Last(2), new string[] { "ша" })) { first += 0.5f; } // Буквы, на которые никогда не заканчиваются имена if (In(Last(1), "еёжхцочшщъыэю")) { surname += 0.3f; } // Используем массив характерных окончаний if (In(Last(2, 1), vowels + consonant)) { if (!In(Last(1), splitSecondExclude[Last(2, 1)])) { surname += 0.4f; } } // Сокращённые ласкательные имена типа Аня, Галя и т.д. if (Last(1) == "я" && In(Last(3, 1), vowels)) { first += 0.5f; } // Не бывает имен с такими предпоследними буквами if (In(Last(2, 1), "жчщъэю")) { surname += 0.3f; } // Слова на мягкий знак. Существует очень мало имен на мягкий знак. Всё остальное фамилии if (Last(1) == "ь") { // Имена типа Нинель, Адель, Асель if (Last(3, 2) == "ел") { first += 0.7f; } // Просто исключения else if (InNames(word.Value, new string[] { "лазарь", "игорь", "любовь" })) { first += 10; } // Если не то и не другое, тогда фамилия else { surname += 0.3f; } } // Если две последних букв согласные, то скорее всего это фамилия else if (In(Last(1), consonant + "ь") && In(Last(2, 1), consonant + "ь")) { // Практически все кроме тех, которые оканчиваются на следующие буквы if (!In(Last(2), new string[] { "др", "кт", "лл", "пп", "рд", "рк", "рп", "рт", "тр" })) { surname += 0.25f; } } // Слова, которые оканчиваются на "тин" if (Last(3) == "тин" && In(Last(4, 1), "нст")) { first += 0.5f; } // Исключения if (InNames(word.Value, new string[] { "лев", "яков", "маша", "ольга", "еремей", "исак", "исаак", "ева", "ирина", "элькин", "мерлин" })) { first += 10; } // Фамилии, оканчивающиеся на "ли" (кроме имён "Натали" и т.д.) if (Last(2) == "ли" && Last(3, 1) != "а") { surname += 0.4f; } // Фамилии, оканчивающиеся на "ян" (кроме Касьян, Куприян, Ян и т.д.) if (Last(2) == "ян" && word.Value.Length > 2 && !In(Last(3, 1), "ьи")) { surname += 0.4f; } // Фамилии, оканчивающиеся на "ур" (кроме имен Артур, Тимур) if (Last(2) == "ур") { if (!InNames(word.Value, new string[] { "артур", "тимур" })) { surname += 0.4f; } } // Разбор ласкательных имен на "ик" if (Last(2) == "ик") { // Ласкательные буквы перед "ик" if (In(Last(3, 1), "лшхд")) { first += 0.3f; } else { surname += 0.4f; } } // Разбор имен и фамилий, оканчивающихся на "ина" if (Last(3) == "ина") { // Все похожие на Катерина и Кристина if (In(Last(7), new string[] { "атерина", "ристина" })) { first += 10; } // Исключения else if (InNames(word.Value, new string[] { "мальвина", "антонина", "альбина", "агриппина", "фаина", "карина", "марина", "валентина", "калина", "аделина", "алина", "ангелина", "галина", "каролина", "павлина", "полина", "элина", "мина", "нина" })) { first += 10; } // Иначе фамилия else { surname += 0.4f; } } // Имена типа Николай if (Last(4) == "олай") { first += 0.6f; } // Фамильные окончания if (In(Last(2), new string[] { "ов", "ин", "ев", "ёв", "ый", "ын", "ой", "ук", "як", "ца", "ун", "ок", "ая", "га", "ёк", "ив", "ус", "ак", "яр", "уз", "ах", "ай" })) { surname += 0.4f; } if (In(Last(3), new string[] { "ова", "ева", "ёва", "ына", "шен", "мей", "вка", "шир", "бан", "чий", "кий", "бей", "чан", "ган", "ким", "кан", "мар" })) { surname += 0.4f; } if (In(Last(4), new string[] { "шена" })) { surname += 0.4f; } float max = Math.Max(Math.Max(first, surname), patr); if (first == max) { word.FioPart = FioPart.Name; } else if (surname == max) { word.FioPart = FioPart.SurName; } else { word.FioPart = FioPart.PatrName; } }
/// <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 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; }