Простой способ разобрать имя человека на составные части? - PullRequest
30 голосов
/ 19 сентября 2008

Многие программы управления контактами делают это - вы вводите имя (, например, , "Джон В. Смит"), и оно автоматически разбивает его на:

Имя: Джон
Отчество: З.
Фамилия: Смит

Точно так же выясняются такие вещи, как «Миссис Джейн В. Смит» и «Доктор Джон Доу-младший». также правильно (при условии, что вы допускаете поля типа «префикс» и «суффикс» в именах).

Я предполагаю, что это довольно распространенные вещи, которые люди хотели бы делать ... поэтому вопрос ... как бы вы это сделали? Есть ли простой алгоритм для этого? Может быть, регулярное выражение?

Я за решением .NET, но я не придирчив.

Обновление: Я ценю, что не существует простого решения для этого, которое охватывало бы ВСЕ крайние случаи и культуры ... но, скажем, ради аргумента, что вам нужно имя по частям (заполнение форм - как, скажем, в налоговых или других государственных формах - это один случай, когда вы обязаны ввести имя в фиксированные поля, нравится вам это или нет), но вы не обязательно заставляете пользователя вводить свое имя в дискретные поля (меньше ввода = легче для начинающих пользователей).

Вы бы хотели, чтобы программа «угадала» (насколько это возможно), что будет первым, средним, последним и т. Д. Если вы можете, посмотрите, как Microsoft Outlook делает это для контактов - она ​​позволяет вам ввести имя, но если вам нужно уточнить, есть дополнительное маленькое окно, которое вы можете открыть. Я бы сделал то же самое - предоставил бы пользователю окно на тот случай, если он захочет ввести имя в виде отдельных частей, - но при этом можно будет ввести имя в одном поле и сделать «наилучшее предположение», охватывающее большинство общие имена.

Ответы [ 22 ]

1 голос
/ 21 сентября 2008

Если вам просто нужно сделать это, добавьте догадки к пользовательскому интерфейсу в качестве необязательного выбора. Таким образом, вы можете сообщить пользователю, как вы анализировали имя, и позволить ему выбрать другой анализ из списка, который вы предоставляете.

1 голос
/ 19 сентября 2008

Вы можете делать очевидные вещи: искать младший, второй, третий и т. Д. В качестве суффиксов, а мистер, миссис, доктор и т. Д. - в качестве префиксов и удалять их, тогда первое слово - это имя, фамилия слово - это фамилия, все что между ними - отчество. Кроме этого, для этого нет надежного решения.

Прекрасным примером являются Дэвид Ли Рот (фамилия: Рот) и Эдди Ван Хален (фамилия: Ван Хален). Если имя Энн Мари Смит - «Энн Мари», нет никакого способа отличить ее от второго имени Энн Мари.

1 голос
/ 16 ноября 2011

Я уже делаю это на стороне сервера при загрузке страницы. Написал CFC Coldfusion, который передает ему два параметра - фактические данные пользователя (имя, отчество, фамилия) и тип данных (имя, отчество, фамилия). Затем проверяются дефисы, апострофы, пробелы и форматы соответственно. ех. Макдональд, МакМюррей, О'Нил, Родэм-Клинтон, Эрик фон Голландский, Дж. У. Буш, Джек Бертон-младший, доктор Пол Окин, Крис ди Сантос. В случае, когда пользователи имеют только одно имя, требуется только первое поле имени, отчество и фамилия необязательны.

Вся информация хранится в нижнем регистре - за исключением префикса, суффикса и пользовательского. Это форматирование выполняется при отображении страницы, а не во время сохранения в БД. Хотя при вводе данных пользователем существует фильтрация проверки. Извините, не могу опубликовать код. Начал использовать Regex, но стал слишком запутанным и ненадежным для всех сценариев. Используются стандартные логические блоки (if / else, switch / case), более удобные для чтения и отладки. СДЕЛАЙТЕ КАЖДЫЙ ВХОД / РАЗДЕЛИТЬ ПОЛЕ БД! Да, это займет некоторое кодирование, но после того, как вы закончите, оно должно составлять 99% комбинаций. Пока только на основе английских имен, без интернационализации, это еще один шарик воска.

Вот некоторые вещи, которые следует учитывать:

  • Hypens (например, Родхам-Клинтон, может быть в первом, среднем или последнем)
  • Апострофы (например, О'Нил, может быть первым, средним или последним)
  • Пробелы
  • Мак и Мак (например, Макдональд, МакМюррей, могут быть в первом, среднем или
    последний)
  • Имена: несколько имен (например, Джо Боб Бриггс)
  • Фамилии: de, di, et, der, den, van, von, af должны быть строчными (бывший Эрик фон Дандер, Мария ди Карло)
  • Префикс: д-р, проф. И т. Д.
  • Суффикс: младший, старший, эсквайр, II, III и т. Д.

Когда пользователь вводит информацию, схема поля в БД выглядит так:

  • Префикс / Заголовок (Доктор и т. Д. С использованием раскрывающегося списка)
  • Префикс / Название Пользовательский (пользователь может ввести пользовательский, например, Капитан, используя текст поле)
  • Имя
  • Средний
  • Фамилия
  • Суффикс (младший, III, проф., Рет. И т. Д. С использованием раскрывающегося списка)
  • Суффикс Пользовательский (пользователь может ввести пользовательский, например, CPA)

Вот то регулярное выражение, которое я использую, чтобы сделать первую букву каждого имени заглавной. Сначала я запускаю это, а затем следую формату процедур в соответствии с правилами (это в формате Coldfusion, но вы поняли):

<cfset var nameString = REReplace(LCase(nameString), "(^[[:alpha:]]|[[:blank:]][[:alpha:]])", "\U\1\E", "ALL")>

Вы также можете сделать это на стороне клиента, используя JavaScript и CSS - может быть, даже проще - но я предпочитаю делать на стороне сервера, так как мне нужны переменные, заданные до загрузки страницы на стороне клиента.

1 голос
/ 02 сентября 2011

Существует сторонний инструмент для такого рода вещей, называемый NetGender, который работает на удивление хорошо. Я использовал его для разбора огромного количества действительно неправильно сформированных имен в непредсказуемых форматах. Посмотрите примеры на их странице, вы также можете скачать и попробовать.

http://www.softwarecompany.com/dotnet/netgender.htm

Я придумал эту статистику, основанную на выборке из 4,2 миллиона имен. Имя Части означает количество отдельных частей, разделенных пробелами. Очень высокий процент был правильным для большинства имен в базе данных. Корректность снижалась по мере увеличения частей, но было очень мало имен с> 3 частями и меньше с> 4. Это было достаточно хорошо для нашего случая. Там, где рухнуло программное обеспечение, распознавались малоизвестные многочастные фамилии, даже если они разделялись запятой. Если бы он смог расшифровать это, то общее количество ошибок было бы менее 1% для всех данных.

Name Parts | Correct | Percent of Names in DB
 2             100%       48%
 3              98%       42%
 4              70%        9%
 5              45%        0.25%
0 голосов
/ 29 января 2011

Я сделал что-то подобное. Основная проблема, с которой я столкнулся, заключалась в том, что люди вводили такие вещи, как «Ричард Р. Смит-младший». Я разместил свой код на http://www.blackbeltcoder.com/Articles/strings/splitting-a-name-into-first-and-last-names. Он написан на C #, но может быть легко преобразован в VB.

0 голосов
/ 27 декабря 2008

Нет 100% способа сделать это.

Вы можете разделить пробелы и попытаться понять имя как хотите, но когда оно доходит до вас, вы иногда ошибаетесь. Если этого достаточно, перейдите к любому из ответов здесь, которые дают вам способы разделения.

Но у некоторых людей будет такое имя, как «Джон Уэйн Олсон», где «Джон Уэйн» - это имя, а у кого-то еще будет такое имя, как «Джон Уэйн Олсон», где «Уэйн» - их второе имя. В этом имени нет ничего, что указывало бы, как его интерпретировать.

Так оно и есть. Это аналог мира.

Мои правила довольно просты.

Возьми последнюю часть -> Фамилия
Если осталось несколько частей, возьмите последнюю часть -> Отчество
Что осталось -> Имя

Но не думайте, что это будет на 100% точно, как и любое другое жестко закодированное решение. Вам нужно будет иметь возможность позволить пользователю редактировать это сам.

0 голосов
/ 02 декабря 2008

Согласен, простого решения для этого не существует. Но я нашел ужасный подход в статье Microsoft KB для VB 5.0, которая является реальной реализацией большей части обсуждений, о которых здесь говорили: http://support.microsoft.com/kb/168799

Нечто подобное можно использовать в крайнем случае.

0 голосов
/ 19 сентября 2008

Я бы сказал, что вычеркните приветствий из списка , затем разделите их пробелами, поместите list.first () в качестве имени, list.last () в качестве фамилии, затем объедините остаток с пробелом это как второе имя. И ВЫШЕ ВСЕХ отображают ваши результаты и позволяют пользователю изменять их!

0 голосов
/ 19 сентября 2008

Я согласен с не делать этого . Имя Рик Ван ДенБоер получило бы второе имя Вана, но это часть фамилии.

0 голосов
/ 19 сентября 2008

Это поручение дураков. Слишком много исключений, чтобы можно было сделать это детерминистически. Если бы вы делали это для предварительной обработки списка для дальнейшего просмотра, я бы сказал, что меньше, конечно, будет больше.

  1. Убрать приветствия, заголовки и суффиксы поколений (большое регулярное выражение или несколько маленьких)
  2. если только одно имя, это «последний».
  3. Если только два имени разделяют их первым, последним.
  4. Если три жетона и середина изначально, разделите их первым, средним, последним
  5. Сортировка остальных вручную.

Любая дальнейшая обработка почти гарантированно создаст больше работы, так как вам придется заново комбинировать то, что разделяет ваша обработка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...