def build_masc_and_fem_surnames(self, report_filename="surnames.masc_and_fem.txt" ): query = """ select person_name from declarations_person """ surnames_fem_frq = defaultdict(int) surnames_masc_frq = defaultdict(int) surnames = defaultdict(int) with connection.cursor() as cursor: cursor.execute(query) for person_name, in cursor: fio = TRussianFio(person_name) if not fio.is_resolved: continue if fio.first_name in self.names_masc: surnames_masc_frq[fio.family_name] += 1 if fio.first_name in self.names_fem: surnames_fem_frq[fio.family_name] += 1 surnames[fio.family_name] += 1 self.surnames_masc.clear() self.surnames_fem.clear() with open(report_filename, "w") as outp: for surname in surnames: all_surname_freq = surnames_fem_frq[ surname] + surnames_masc_frq[surname] + 0.00000001 fem_ratio = int(100.0 * surnames_fem_frq[surname] / float(all_surname_freq)) gender = None if surname.endswith("о") or surname.endswith("ук") or surname.endswith("юк") or surname.endswith("o") \ or surname.endswith("и"): gender = None elif (all_surname_freq > 3 and fem_ratio > 90) or surname.endswith( 'ская') or surname.endswith('цкий'): gender = TGender.feminine elif (all_surname_freq > 3 and fem_ratio < 10) or surname.endswith( 'ский') or surname.endswith('цкая'): gender = TGender.masculine elif surname.endswith( 'а') and surnames_masc_frq[surname[:-1]] > 3: #surname=иванова, search for иванов gender = TGender.feminine elif not surname.endswith('а') and surnames_fem_frq[surname + 'а'] > 3: # surname=иванов, search for иванова gender = TGender.masculine elif len(surname) > 4 and (surname.endswith('ова') or surname.endswith('ева') \ or surname.endswith('ёва') or surname.endswith('ина') or surname.endswith('ына')): gender = TGender.feminine elif len(surname) > 4 and (surname.endswith('ов') or surname.endswith('ев') or surname.endswith('ёв') \ or surname.endswith('ин') or surname.endswith('ын')) and fem_ratio < 1: gender = TGender.masculine if gender == TGender.masculine and (surname[-1] == "а" or surname[-1] == "я"): gender = None outp.write("{}\t{}\t{}\t{}\t{}\n".format( surname, surnames_masc_frq[surname], surnames_fem_frq[surname], surnames[surname], fem_ratio, TGender.gender_to_str(gender))) if gender is not None: if gender == TGender.masculine: self.surnames_masc.add(surname) else: self.surnames_fem.add(surname)
def compare_Russian_fio(search_query, person_name): if search_query.find(' ') == -1 and search_query.find('.') == -1: return True fio1 = TRussianFio(search_query, from_search_request=True) fio2 = TRussianFio(person_name) return fio1.is_resolved and fio2.is_resolved and fio1.is_compatible_to(fio2)
def build_person_name_elastic_search_query(self, should_items): person_name = self.field_params.get("person_name") if person_name is not None and person_name != '': should_items.append({"match": {"person_name": person_name}}) fio = TRussianFio(person_name, from_search_request=True) should_items.append({"match": {"person_name": fio.family_name}})
def test_search_section_by_person_name(self): def _P(fio): return TRussianFio(fio) def _F(family_name, first_name, patronymic): return TRussianFio("").build_from_parts(family_name, first_name, patronymic) self.assertEqual(_P("Мамедов Чингиз Георгиевич"), _F("Мамедов", "Чингиз", "Георгиевич")) self.assertEqual(_P("Мамедов Чингиз Георгиевич,"), _F("Мамедов", "Чингиз", "Георгиевич")) self.assertEqual(_P("Мамедов Чингиз Георгиевич*"), _F("Мамедов", "Чингиз", "Георгиевич")) self.assertEqual(_P("Мамедов Ч.Г."), _F("Мамедов", "Ч", "Г")) self.assertEqual(_P("Мамедов ЧГ"), _F("Мамедов", "Ч", "Г")) self.assertEqual(_P("МамедовЧГ."), _F("Мамедов", "Ч", "Г")) self.assertEqual(_P("Ч.Г. Мамедов"), _F("Мамедов", "Ч", "Г")) self.assertEqual(_P("Мамедов Ч.Г.-О."), _F("Мамедов", "Ч", "Г.-О")) self.assertEqual( _P("Халиуллина Гульнур Ахметнагимовна Ахметнагимовна"), _F("Халиуллина", "Гульнур", "Ахметнагимовна")) self.assertEqual(_P("Мамедов .Ч. Г."), _F("Мамедов", "Ч", "Г")) self.assertEqual(_P("Мамедов Ч..Г."), _F("Мамедов", "Ч", "Г")) self.assertEqual(_P("Пашин А.Е"), _F("Пашин", "А", "Е")) self.assertEqual(_P("Гулиев Гурбангули Арастун Оглы"), _F("Гулиев", "Гурбангули", "Арастун Оглы")) self.assertEqual(_P("Гасанова Рена Амрали Кызы"), _F("Гасанова", "Рена", "Амрали Кызы")) self.assertEqual(_P("Заман Шамима Хасмат-Уз"), _F("Заман", "Шамима", "Хасмат-Уз")) self.assertEqual(_P("А.В.Бойко"), _F("Бойко", "А", "В")) self.assertEqual(_P('Дорошенкова М В.'), _F("Дорошенкова", "М", "В")) self.assertEqual(_P('Ахмедова З. М.-Т.'), _F("Ахмедова", "З", "М.-Т")) self.assertEqual(_P('Пыжик Игорь Григорьев Ич.'), _F("Пыжик", "Игорь", "Григорьевич")) self.assertEqual(_P('Изъюрова Вик- Тория Александровна'), _F("Изъюрова", "Виктория", "Александровна")) self.assertEqual(_P('Романова Людмила Афанасьевна.'), _F("Романова", "Людмила", "Афанасьевна")) self.assertEqual(_P('Строганова Наталья Александров На'), _F("Строганова", "Наталья", "Александровна")) self.assertEqual(_P('А.А. Кайгородова'), _F("Кайгородова", "А", "А")) self.assertEqual(_P('Туба Давор Симович'), _F("Туба", "Давор", "Симович")) self.assertEqual(_P('Шпак Игрь Алесандрович'), _F("Шпак", "Игрь", "Алесандрович")) self.assertEqual(_P('Слатвинский Д,А.'), _F("Слатвинский", "Д", "А")) self.assertEqual(_P('ШАККУМ Мартин Люцианович'), _F("Шаккум", "Мартин", "Люцианович")) # I do know how to solve it #self.assertEqual(_P('ЛеКиашвили Д.З.'), _F("Лекиашвили", "Д", "З")) self.assertEqual(_P('Зейналов Б.Н.о.'), _F("Зейналов", "Б", "Н.о")) self.assertEqual(_P('Никулаева Мария ивановна'), _F("Никулаева", "Мария", "Ивановна")) self.assertEqual(_P('Гунбатов Д.Ш.О'), _F("Гунбатов", "Д", "Ш.о")) self.assertEqual(_P('Мамедов.Х.Н.'), _F("Мамедов", "Х", "Н")) self.assertEqual(_P('Морозова С,А'), _F("Морозова", "С", "А")) self.assertEqual(_P('Грудинин И. В..'), _F("Грудинин", "И", "В")) self.assertEqual( _P('Рыбаков Анатолий Витальевич, Глава Муниципального Образования' ), _F("Рыбаков", "Анатолий", "Витальевич")) #correct ocr errors ѐ -> ё self.assertEqual(_P('Кулѐва Ольга Владимировна'), _F("Кулёва", "Ольга", "Владимировна")) # use Russian morphology dictionary self.assertEqual(_P('Великоречан Ина Е.Е'), _F("Великоречанина", "Е", "Е")) self.assertEqual(_P('Махиборо Да Н.М.'), _F("Махиборода", "Н", "М")) self.assertEqual(_P('Халыев А.С .'), _F("Халыев", "А", "С")) self.assertEqual(_P('Погуляйченко Оле Г Васильевич'), _F("Погуляйченко", "Олег", "Васильевич")) self.assertEqual(_P('Воецкая Ирина'), _F("Воецкая", "Ирина", "")) self.assertEqual(_P('Друзина Инна'), _F("Друзина", "Инна", "")) self.assertEqual(_P('Гладилина Светлана В.'), _F("Гладилина", "Светлана", "В")) self.assertEqual(_P('Разогрееванина Николаевна'), _F("Разогреева", "Нина", "Николаевна")) self.assertEqual(TRussianFio("Иванов", from_search_request=True), _F("Иванов", "", "")) self.assertEqual(_P("квартира").is_resolved, False) self.assertEqual(_P("Ф.И.О.").is_resolved, False) self.assertEqual(_P("Иванов").is_resolved, False) self.assertEqual(_P("Иванов ..").is_resolved, False) self.assertEqual(_P("Мамедов ААА").is_resolved, False) self.assertEqual(_P("Мамедов Ч.").is_resolved, False) self.assertEqual(_P("Жена Суконцева А.В.").is_resolved, False) self.assertEqual(_P("Журавлев А.В. Супруга").is_resolved, False) self.assertEqual(_P('Долевая 2/3 Доля').is_resolved, False) self.assertEqual( _P('Цинцадзе Гис Ионович (Супруг)').is_resolved, False) self.assertEqual( _P('Сотрудник Кондратьев Вадим Сергеевич').is_resolved, False) self.assertEqual(_P('Сделка Совершалась').is_resolved, False) self.assertEqual(_P('Сделка Не Совершалась').is_resolved, False) self.assertEqual( _P('Руденко Р.Р. Учитель С Доплатой За Руководство Оу'). is_resolved, False) self.assertEqual( _P('Дети Тиханова Надежда Евгеньевна').is_resolved, False) self.assertEqual(_P('Земельный Участок Дачный').is_resolved, False) self.assertEqual(_P('Дачный Земельный Участок').is_resolved, False) self.assertEqual(_P('Садовый Земельный Участок').is_resolved, False) self.assertEqual(_P('Летний Домик Индивидуальная').is_resolved, False) self.assertEqual(_P('Земли Населенных Пунктов').is_resolved, False) self.assertEqual(_P('Машина Рено Логан').is_resolved, False) self.assertEqual(_P('Жилой дом пай').is_resolved, False) self.assertEqual(_P('Овощная Ячейка Дом').is_resolved, False) self.assertEqual(_P('Изолированная Часть Жилого').is_resolved, False) self.assertEqual(_P('Военная Пенсия').is_resolved, False) self.assertEqual(_P('Дмитрий Анатольевич').is_resolved, False) self.assertEqual(_P('Горячева Михайловна').is_resolved, False) self.assertTrue( _P("Иванов Иван Иванович").is_compatible_to(_P("Иванов И. И."))) self.assertTrue( _P("Иванов Иван Иванович").is_compatible_to( _P(" Иванов Иван Иванович "))) self.assertTrue( _P("Иванов Иван Иванович").is_compatible_to(_F("Иванов", "И", ""))) self.assertTrue( _P("Иванов Иван Иванович").is_compatible_to(_F("Иванов", "", "")))
def _P(fio): return TRussianFio(fio)
def _P(fio): return TRussianFio(fio).get_normalized_person_name()
def _P(s): words = re.split("[»«\"',./:;_{}\[\]()\s]+", s) return " ".join(TRussianFio.delete_fios(words))
def _F(family_name, first_name, patronymic): return TRussianFio("").build_from_parts(family_name, first_name, patronymic)
def _P(fio): return TRussianFio(fio, from_search_request=True)
def set_person_name(self, person_name): self.person_name = person_name self.fio = TRussianFio(person_name)
def __init__(self, document_id, year, person_name, income_sum): self.document_id = str(document_id) self.year = str(year) self.person_name = self.person_name = TRussianFio(person_name).get_normalized_person_name() self.income_sum = str(convert_to_int_with_nones(income_sum))
def check_family_name(n1, n2): fio1 = TRussianFio(n1) fio2 = TRussianFio(n2) if not fio1.is_resolved or not fio2.is_resolved: return n1[0:3].lower() == n2[0:3].lower() return fio1.family_name == fio2.family_name