@pulivilizator

Как вычленить из текста ФИО на python, при том что конкретных шаблонов нет?

Как можно достать ФИО из текста(текста могут быть абсолютно разными и не иметь ничего общего), учитывая что ФИО всегда в формате 'Фамилия Имя Отчество', но в нем могут быть ошибки либо неправильный регистр, например: 'Кравец арртем вячеславович', 'морозова ЕЛЕНа викторовна' и тп, а также встречаются ФИО с двойными фамилиями('Багашвили-Багаев Артем Викторович'), и есть редкие фамилии ('Ырлгай', 'Аксаков' и тп.)?

Пытался использовать библиотеки natasha и yangy, но наташа не находит все варианты, а yangy либо не находит, любо я не смог нормально настроить.
  • Вопрос задан
  • 706 просмотров
Решения вопроса 1
kawabanga
@kawabanga
Я бы апи дернул, к примеру у дадаты - 15коп за запрос стандартизации.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
В общем случае эта задача не решается на 100% по определению.
Вы говорите, что вокруг фамилий у вас произвольный текст, а это значит, что среди этого текста попадаются слова, которые чем-то похожи на ФИО, но не ФИО, или имя отчество, без фамилии, или что-то вроде "светкин василёк Игоревич". Можно это считать таким экзотическим ФИО, или отчество тут просто отдельно стоит и искать его не надо?
В любом случае схема решения примерно такая. Если у вас есть знаки препинания, то можно разбить по ним фрагменты текста, ФИО не разделяется знаками препинания (кроме дефиса), но дефис отличается от тире пробелами по бокам.
Далее у вас есть цепочки слов. Если в цепочке N слов, то в ней, можно сказать, N-2 кандидата на ФИО.
Каждая трока-кандидат на ФИО может быть проклассифицирована по ряду признаков, свидетельствующих в пользу того, является ли эта тройка ФИО. Осталось только определить набор признаков и веса этих признаков. Каждый признак определяет два показателя: 1) насколько этот признак добавляет шансов тройке быть ФИО; 2) на сколько несовпадение по этому признаку отнимает шансов быть ФИО. Показатели определяются от нуля до 1 и перемножаются. Подбор признаков и их показателей будет настройкой вашего классификатора.
Тут дальше можно двигаться разными путями.
Часть детектов вы сможете надёжно определять по окончанию отчества.
Часть признаков у вас будут словарными словами, которые, по вашему, не могут быть именем и\или фамилией.
На этом этапе уже будет довольно хорошая детекция. Вопрос что вам важнее, отсутствие false positive, или отсутствие false negative.
Так же по-разному может повезти с входными данными. Если у вас много "ловушек" в виде разбросанных по тексту бесхозных отчеств, если у вас много очень странных имён... в общем тут вам никто не выдаст идеальное решение. При отсутствии четкого ТЗ результатом будет расплывчатое ХЗ.
В целом обычно на настройку таких классификаторов под текст на первое время сажают людей. У нас сейчас есть ChatGPT и ему, думаю, вполне можно скидывать наборы имён, чтобы он вычеркивал те, которые вряд ли именами являются. Если вы приняли, что какое-то слово не может являться именем, или фамилией, то такое решение хорошо бы кэшировать, а затем для консистентности придерживаться аналогичного в других случаях.

Странная у вас задача, сударь. Выглядит как учебная. В этом случае рассуждений вроде приведенных мной здесь хватило бы для успешного ответа на собеседовании.
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Можно попробовать автоматизировать сбор фамилий и отчеств. У них вроде регулярные окончания.
А между ними - соотв. будет имя.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы