2009-10-26 5 views
0

Бюро переписи США использует специальную кодировку под названием «soundex» для поиска информации о человеке. Soundex - это кодировка фамилий (фамилий), основанных на том, как звучит фамилия, а не как она написана. Фамилии, которые звучат одинаково, но различаются по-разному, например SMITH и SMYTH, имеют одинаковый код и подаются вместе. Система кодирования soundex была разработана так, что вы можете найти фамилию, даже если она, возможно, была записана под различными написаниями.Алгоритм Soundex в Python (запрос справки на домашнюю работу)

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

Основные SOUNDEX Coding Правила

Каждый Саундэкс кодирования фамилии состоит из буквы и трех цифр. Используемое письмо всегда является первой буквой фамилии. Номера присваиваются остальным буквам фамилии в соответствии с приведенным ниже руководством soundex. Нулевые значения добавляются в конце, если необходимо, чтобы всегда создавать четырехсимвольный код. Дополнительные буквы не учитываются.

Саундэкс Coding Руководство

Саундэкс назначает номер для различных согласных. Согласные, которые звучат одинаково назначены один и тот же номер:

Номер Согласные

1 В, F, P, V 2 С, G, J, K, Q, S, X, Z 3 D, Т 4 L 5 M, N 6 R

Саундэкс игнорирует буквы A, E, I, O, U, H, W и Y.

Есть 3 дополнительных SOUNDEX правила кодирования, которые следуют. Хороший дизайн программы будет реализовывать их как одну или несколько отдельных функций.

Правила 1. Имена с двойным Letters

Если фамилия имеет какие-либо двойные буквы, они должны рассматриваться в качестве одной буквы. Например:

Gutierrez закодирован G362 (G, 3 для T, 6 для первого R, второй R игнорируется, 2 для Z). Правило 2. Имена с письмами Бок о бок, которые имеют одинаковый код Soundex

Если фамилия имеет разные буквы бок о бок, которые имеют одинаковое число в руководстве по кодированию звука, они должны рассматриваться как одна буква. Примеры:

Pfister кодируется как P236 (P, F игнорируется, поскольку он считается таким же, как P, 2 для S, 3 для T, 6 для R).

Jackson кодируется как J250 (J, 2 для C, K игнорируется так же, как C, S игнорируется так же, как C, 5 для добавления N, 0).

Правило 3. Согласные Сепараторы

3.a. Если гласный (A, E, I, O, U) разделяет два согласных, которые имеют один и тот же код soundex, закодирован согласный справа от гласного. Пример:

Tymczak кодируется как T-522 (T, 5 для M, 2 для C, Z игнорируется (см. Выше правило «Бок о бок»), 2 для K). Поскольку гласный «A» разделяет Z и K, кодируется K. 3.b.Если «H» или «W» разделяют два согласных, которые имеют одинаковый код soundex, согласный справа не закодирован. Пример:

* Ashcraft кодируется A261 (A, 2 для S, C игнорируется с тех пор, как S с H между ними, 6 для R, 1 для F). Он не закодирован A226.

До сих пор это мой код:

surname = raw_input("Please enter surname:") 
outstring = "" 

outstring = outstring + surname[0] 
for i in range (1, len(surname)): 
     nextletter = surname[i] 
     if nextletter in ['B','F','P','V']: 
      outstring = outstring + '1' 

     elif nextletter in ['C','G','J','K','Q','S','X','Z']: 
      outstring = outstring + '2' 

     elif nextletter in ['D','T']: 
      outstring = outstring + '3' 

     elif nextletter in ['L']: 
      outstring = outstring + '4' 

     elif nextletter in ['M','N']: 
      outstring = outstring + '5' 

     elif nextletter in ['R']: 
      outstring = outstring + '6' 

print outstring 

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

+0

я помог разъяснению названия ;-) –

+3

Im не читают весь домашнее задание. Перестаньте это с тем, что входы и что вы хотите в качестве вывода. – JonH

+6

Он задал всю сцену и попросил о том, как двигаться дальше. У него нет НИКАКИХ ВОПРОСОВ, требующих ответа. Если он отправил запрос, указав входы и выходы, это должно быть закрыто. Это очень хороший пример того, как задать вопрос о домашнем задании !!! –

ответ

1

Я предлагаю вам попробовать следующее.

  • магазин CurrentCoded и LastCoded переменная для работы с, прежде чем добавлены к вашему выходу
  • ломаются системы в полезные функции, такие как
    1. булевой IsVowel (Char)
    2. Int закодированное (Char)
    3. Логическое IsRule1 (Чар Чар)

Как только вы сломаете его красиво, ему должно стать легче управлять.

0

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

>>> def soundex_prepare(s): 
     """Prepare string for Soundex encoding. 

     Remove non-alpha characters (and the not-of-interest W/H/Y), 
     convert to upper case, and remove all runs of repeated letters.""" 
     p = re.compile("[^a-gi-vxz]", re.IGNORECASE) 
     s = re.sub(p, "", s).upper() 
     for c in set(s): 
      s = re.sub(c + "{2,}", c, s) 
     return s 

>>> def soundex_encode(s): 
     """Encode a name string using the Soundex algorithm.""" 
     result = s[0].upper() 
     s = soundex_prepare(s[1:]) 
     letters = 'ABCDEFGIJKLMNOPQRSTUVXZ' 
     codes = '.123.12.22455.12623.122' 
     d = dict(zip(letters, codes)) 
     prev_code="" 
     for c in s: 
      code = d[c] 
      if code != "." and code != prev_code: 
       result += code 
     if len(result) >= 4: break 
      prev_code = code 
     return (result + "0000")[:4]