Beispiel #1
0
        /// <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;
            }
        }
Beispiel #2
0
        /// <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;
        }