Как может этот метод для преобразования имени к надлежащему случаю быть улучшенным?

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

public string ConvertToProperNameCase(string input)
{
    char[] chars = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(input.ToLower()).ToCharArray();

    for (int i = 0; i + 1 < chars.Length; i++)
    {
        if ((chars[i].Equals('\'')) ||
            (chars[i].Equals('-')))
        {                    
            chars[i + 1] = Char.ToUpper(chars[i + 1]);
        }
    }
    return new string(chars);
}

Это работает в большинстве случаев, такие как:

  1. JOHN SMITH → John Smith
  2. СМИТ, JOHN T → Smith, John T.
  3. JOHN O'BRIAN → John O'Brian
  4. DOE-СМИТ ДЖОНА → John Смит самки

Существуют некоторые пограничные случаи, которые не работают:

  1. JASON MCDONALD → Jason Mcdonald (корректный: Jason McDonald)
  2. OSCAR DE LA HOYA → Oscar De La Hoya (Корректный: Oscar de la Hoya)
  3. MARIE DIFRANCO → Marie Difranco (корректный: Marie DiFranco)

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

17
задан Kelsey 11 September 2010 в 18:50
поделиться

8 ответов

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

Рассмотрите ваши крайние случаи

ДЖЕЙСОН МАКДОНАЛЬД -> Джейсон Макдональд (Правильно: Джейсон Макдональд)

Вы можете просто проверить наличие Mc в начале вашего имени, а затем применить исправление, верно? Но что, если вашего человека зовут Макизк (это я, конечно, придумал), и это не следует исправлять на Мак-Изк, а оставить как есть?

100% идеального решения этой проблемы не существует. Это проблема естественного языка, и ее действительно сложно решить, особенно для компьютера. Культуры слишком разные, чтобы их можно было правильно смоделировать. Даже если вы скажете, что североамериканские соглашения имеют приоритет, у вас будет высокий процент «ложных срабатываний». Наше общество состоит из огромного смешения культур, просто неадекватно сказать, что «Североамериканский имеет приоритет».

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

9
ответ дан 30 November 2019 в 14:00
поделиться

Вы можете создавать правила, которые приблизят вас, но вы не можете получить 100%. Например, вы можете создать список префиксов (Mc, Di и т. Д.)

  1. Если префикс заканчивается на гласную, а следующая буква - на гласную в нижнем регистре.
  2. Если префикс оканчивается на гласную, а следующая буква - на согласную, в верхнем регистре.
  3. Если префикс оканчивается согласным, следующая буква - заглавная.

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

1
ответ дан 30 November 2019 в 14:00
поделиться

Ваш вопрос касается того, можно ли улучшить вашу программу. Мой ответ: «В каком направлении есть улучшения?» У вас есть два разных крайних случая, которые исключают друг друга. Либо вы не поймаете людей с необычными правилами использования заглавных букв, либо не поймаете людей, которые не соблюдают необычные правила использования заглавных букв.

Я ходил в школу с кем-то по фамилии «Де ла Роса». Рассматривая ваш пример де ла Хойи, было бы справедливо предположить, что «де ла Роса» - это еще и чья-то фамилия. Так что если вы реализуете один метод обезглавливания «де ля», то вы будете скучать по моему другу, и мне будет грустно. И если вы не осуществите декапитализацию, вы упустите этих других людей. И не дай бог вам наткнуться на какого-нибудь Де ла Роса, которого не поймают ни одним из методов ...

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

0
ответ дан 30 November 2019 в 14:00
поделиться

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

0
ответ дан 30 November 2019 в 14:00
поделиться

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

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

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

5
ответ дан 30 November 2019 в 14:00
поделиться

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

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

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

3
ответ дан 30 November 2019 в 14:00
поделиться

Вы можете

  • Разделить на ваши разделители "", "и" - "
  • Заголовок каждой части
  • Обрабатывать все ваши крайние случаи для каждой фразы
0
ответ дан 30 November 2019 в 14:00
поделиться

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

Кроме этого...

Я не думаю, что вы действительно можете объяснить ДиФранко, если вы только не объясняете ДиФранко и никаких других Ди (есть ли они?). Кроме того, я думаю, что можно с уверенностью предположить, что любой Mc заслуживает заглавной следующей буквы. И я также думаю, что можно с уверенностью сказать, что de и la, когда пространство вокруг них может быть в нижнем регистре.

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

0
ответ дан 30 November 2019 в 14:00
поделиться
Другие вопросы по тегам:

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