Простой способ проанализировать имя человека в его составные части?

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

Имя: John
Второе имя: W.
Фамилия: Smith

Аналогично, это выясняет вещи как "г-жа Jane W. Smith" и "доктор John Doe Jr." правильно также (предполагающий обеспечение полей как "префикс" и "суффикс" на имена).

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

Я после решения.NET, но я не придирчив.

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

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

30
задан Raedwald 1 October 2019 в 09:58
поделиться

0 ответов

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

основной подход А должен искать honorifics в начале строки (например, "Hon. John Doe") и числа или некоторые другие строки в конце (например, "IV John Doe", "John Doe Jr."), но действительно все, что можно сделать, применяют ряд эвристики и надежды на лучшее.

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

10
ответ дан Raedwald 27 November 2019 в 23:14
поделиться

Существует номер 100% способ сделать это.

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

, Но некоторые люди будет иметь имя как "John Wayne Olson", где "John Wayne" является именем, и у кого-то еще будет имя как "John Wayne Olson", где "Wayne" является их вторым именем. Нет ничего существующего на то имя, которое скажет Вам который способ интерпретировать его.

Это - просто способ, которым это. Это - аналоговый мир.

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

Принимают последнее участие-> Фамилия
, Если существует несколько оставленных частей, принимают последнее участие-> Второе имя
, Что оставляют-> Имя

, Но не предполагайте, что это будет на 100% точно, ни будет любое другое hardcoded решение. У Вас должна будет быть способность позволить пользователю отредактировать этот him/her-self.

0
ответ дан angry person 27 November 2019 в 23:14
поделиться

Я соглашаюсь с не сделать это . DenBoer Rick Van имени закончил бы со вторым именем Van, но это - часть фамилии.

-1
ответ дан osp70 27 November 2019 в 23:14
поделиться

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

Что-то вроде этого могло использоваться в повышении.

0
ответ дан Shawn Miller 27 November 2019 в 23:14
поделиться

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

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

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

0
ответ дан Frosty 27 November 2019 в 23:14
поделиться

Вы не хотите делать это, если Вы только не собираетесь быть контактом с людьми от одной культуры.

, Например:

фамилией Guido van Rossum является van Rossum.

именем Hayao МИЯДЗАКИ является Hayao.

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

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

0
ответ дан 1729 27 November 2019 в 23:14
поделиться

Несомненно, существует простое решение - разделяет строку пробелами, считают количество маркеров, если существует 2, интерпретируйте их, чтобы быть Именем и фамилией, если существует 3, интерпретируйте его, чтобы быть ПЕРВЫМИ, СРЕДНИМИ, и В ПОСЛЕДНИЙ РАЗ.

проблемой, которая является простым решением, не будет 100%-е правильное решение - кто-то мог всегда вводить имя со значительно большим количеством маркеров или мог включать заголовки, фамилии с пространством в нем (действительно ли это возможно?), и т.д. Можно предложить решение, которое работает на большинство имен большую часть времени, но не абсолютное решение.

я следовал бы рекомендации Алозы разделить поля ввода.

0
ответ дан matt b 27 November 2019 в 23:14
поделиться

Я сказал бы Полосу приветы из списка тогда разделенный пространством, поместив list.first () как имя, list.last (), поскольку фамилия тогда присоединяется к остатку пространством и имеет это как второе имя. И, ПРЕЖДЕ ВСЕГО, отобразите свои результаты и позвольте пользователю изменить их!

0
ответ дан George Mauer 27 November 2019 в 23:14
поделиться

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

1
ответ дан Omer van Kloeten 27 November 2019 в 23:14
поделиться

Понимание этого является плохой идеей, я записал, что этот regex в жемчуге - вот что работавший лучшее для меня. Я уже отфильтровал названия компаний.
Вывод в формате vcard: (hon_prefix, given_name, additional_name, family_name, почтенный суффикс)

/^ \s*
    (?:((?:Dr.)|(?:Mr.)|(?:Mr?s.)|(?:Miss)|(?:2nd\sLt.)|(?:Sen\.?))\s+)? # prefix
    ((?:\w+)|(?:\w\.)) # first name
(?: \s+ ((?:\w\.?)|(?:\w\w+)) )?  # middle initial
(?: \s+ ((?:[OD]['’]\s?)?[-\w]+))    # last name
(?: ,? \s+ ( (?:[JS]r\.?) | (?:Esq\.?) | (?: (?:M)|(?:Ph)|(?:Ed) \.?\s*D\.?) | 
         (?: R\.?N\.?) | (?: I+) )  )? # suffix
\s* $/x

примечания:

  • не обрабатывает IV, V, VI
  • Трудно кодированные списки префиксов, суффиксов. развитый из набора данных имен ~2K
  • не обрабатывает несколько суффиксов (например, MD, доктор философии)
  • Разработанный для американских имен - не будет работать правильно над романизировавшими японскими именами или другими системами именования
3
ответ дан Thelema 27 November 2019 в 23:14
поделиться

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

легко сказать, "не делают этого" при рассмотрении проблемы теоретически, но иногда обстоятельства диктуют иначе. Имение полей для всех частей имени (заголовок, во-первых, середина, в последний раз, суффикс, только для именования некоторых) может поднять много экранной недвижимости - и объединенный с проблемой адреса (тема в течение другого дня) может действительно загромоздить то, что должен быть чистым, простым UI.

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

3
ответ дан Keithius 27 November 2019 в 23:14
поделиться

Я должен был сделать это. На самом деле, что-то намного тяжелее, чем это, потому что иногда "именем" был бы "Smith, John" или "Smith John" вместо "John Smith", или не именем человека вообще, но вместо этого названием компании. И это должно было сделать это автоматически без возможности для пользователя исправить его.

то, Что я закончил тем, что делал, придумывало конечный список шаблонов, как которые имя могло быть в:
Наконец, Первая Средняя Начальная буква
Первый Последний
Первая Средняя Начальная буква В последний раз
Наконец, Первая середина
Первая середина В последний раз
Первый Последний

Добавляют Вашего г-на, Jr, там также. Скажем, Вы заканчиваете приблизительно с дюжиной шаблонов.

Мое приложение имело словарь общего имени, общие фамилии (можно найти их в сети), общие заголовки, общие суффиксы (младший, сэр, md) и использование, которое было бы в состоянии высказать очень хорошие предположения о шаблонах. Я не настолько умен, моя логика не была то, что воображение, и все же тем не менее, не случалось так, что трудно для создания некоторой логики, которая угадала больше чем 99% времени.

4
ответ дан Corey Trager 27 November 2019 в 23:14
поделиться

Вы, вероятно, ничего не должны делать воображение действительно. Что-то вроде этого должно работать.

    Name = Name.Trim();

    arrNames = Name.Split(' ');

    if (arrNames.Length > 0) {
        GivenName = arrNames[0];
    }
    if (arrNames.Length > 1) {
        FamilyName = arrNames[arrNames.Length - 1];
    }
    if (arrNames.Length > 2) {
        MiddleName = string.Join(" ", arrNames, 1, arrNames.Length - 2);
    }

можно также хотеть проверить на заголовки сначала.

5
ответ дан StarCub 27 November 2019 в 23:14
поделиться

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

Мое предложение - , не делают этого парсинга .

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

32
ответ дан shadit 27 November 2019 в 23:14
поделиться

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

А идеальным примером является David Lee Roth (фамилия: Roth) и Eddie Van Halen (фамилия: Van Halen). Если именем Ann Marie Smith является "Ann Marie", нет никакого способа отличить это от Ann, имеющей второе имя Marie.

1
ответ дан Graeme Perrow 27 November 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: