Как вычленить из текста ФИО на python, при том что конкретных шаблонов нет?
Как можно достать ФИО из текста(текста могут быть абсолютно разными и не иметь ничего общего), учитывая что ФИО всегда в формате 'Фамилия Имя Отчество', но в нем могут быть ошибки либо неправильный регистр, например: 'Кравец арртем вячеславович', 'морозова ЕЛЕНа викторовна' и тп, а также встречаются ФИО с двойными фамилиями('Багашвили-Багаев Артем Викторович'), и есть редкие фамилии ('Ырлгай', 'Аксаков' и тп.)?
Пытался использовать библиотеки natasha и yangy, но наташа не находит все варианты, а yangy либо не находит, любо я не смог нормально настроить.
Ответы (2 шт):
Можно попробовать через регулярные выражения, опираясь на окончания отчеств.
import re
txt = """dfdlfdkf Багашвили-Багаев Артем Викторович dlkfm.qfefw
Багашвили-Багаев Артем Викторович dlkfm.qfefw
1512в5 Кравец арртем вячеславович ужолт
hjdfdjsh dh bdh морозова ЕЛЕНа викторовна lj qldkjf qjkhfd qlkjfdh lq
d;kljnf;d раз-два-три Иван Никитич"""
for s in txt.split('\n'):
result = re.search(r'(?:^|\s)([а-яА-ЯёЁ]+(?:-[а-яА-ЯёЁ]+)?\s[а-яА-ЯёЁ]+\s[а-яА-ЯёЁ]+(?:ович|евич|ич|овна|евна|ична|иничнa))', s)
if result:
print(result.group(1).title())
Багашвили-Багаев Артем Викторович
Багашвили-Багаев Артем Викторович
Кравец Арртем Вячеславович
Морозова Елена Викторовна
Можно использовать библиотеку PyMystem3. Полный обзор я вам не сделаю, но минимальный пример для решения Вашей проблемы предоставляю:
from pymystem3 import Mystem
text = 'один два три четыре пять петРов ИвАн АндрееВИЧ шесть семь восемь 9.'
m = Mystem()
analyze = m.analyze(text)
first_name = None
second_name = None
middle_name = None
for word in analyze:
try:
analysis = word['analysis'][0]
except KeyError:
continue
if 'имя' in analysis['gr']:
first_name = word['text'].capitalize()
elif 'фам' in analysis['gr']:
second_name = word['text'].capitalize()
elif 'отч' in analysis['gr']:
middle_name = word['text'].capitalize()
print(f'{second_name} {first_name} {middle_name}')
Результат:
Петров Иван Андреевич