Алгоритм Soundex в Python (запрос справки по домашнему заданию) - PullRequest
0 голосов
/ 26 октября 2009

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

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

Основные правила кодирования Soundex

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

Руководство по кодированию Soundex

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

Число согласных

1 B, F, P, V 2 C, G, J, K, Q, S, X, Z 3 D, T 4 L 5 M, N 6 R

Soundex игнорирует буквы A, E, I, O, U, H, W и Y.

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

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

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

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

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

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

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

Правило 3. Разделители согласных

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

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

* Ашкрафт кодируется 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

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

Ответы [ 3 ]

1 голос
/ 26 октября 2009

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

  • Сохраните переменные CurrentCoded и LastCoded для работы до добавления к вашему выводу
  • Разбейте систему на полезные функции, такие как
    1. Boolean IsVowel (Char)
    2. Int Coded (Char)
    3. Boolean IsRule1 (Char, Char)

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

0 голосов
/ 16 ноября 2018
surname = input("Enter surname of the author: ") #asks user to input the author's surname

while surname != "": #initiates a while loop thats loops on as long as the input is not equal to an empty line

    str_ini = surname[0] #denotes the initial letter of the surname string
    mod_str1 = surname[1:] #denotes modified string excluding the first letter of the surname

    import re #importing re module to access the sub function
    mod_str2 = re.sub(r'[aeiouyhwAEIOUYHW]', '', mod_str1) #eliminating any instances of the given letters


    mod_str21 = re.sub(r'[bfpvBFPV]', '1', mod_str2)
    mod_str22 = re.sub(r'[cgjkqsxzCGJKQSXZ]', '2', mod_str21)
    mod_str23 = re.sub(r'[dtDT]', '3', mod_str22)
    mod_str24 = re.sub(r'[lL]', '4', mod_str23)
    mod_str25 = re.sub(r'[mnMN]', '5', mod_str24)
    mod_str26 = re.sub(r'[rR]', '6', mod_str25)
                #substituting given letters with specific numbers as required by the soundex algorithm

    mod_str3 = str_ini.upper()+mod_str26 #appending the surname initial with the remaining modified trunk

    import itertools #importing itertools module to access the groupby function
    mod_str4 = ''.join(char for char, rep in itertools.groupby(mod_str3))
                #grouping each character of the string into individual characters
                #removing sequences of identical numbers with a single number
                #joining the individually grouped characters into a string

    mod_str5 = (mod_str4[:4]) #setting character limit of the modified string upto the fourth place

    if len (mod_str5) == 1:
        print (mod_str5 + "000\n")
    elif len (mod_str5) == 2:
        print (mod_str5 + "00\n")
    elif len (mod_str5) == 3:
        print (mod_str5 + "0\n")
    else:
        print (mod_str5 + "\n")
                #using if, elif and else arguments for padding with trailing zeros

    print ("Press enter to exit") #specification for the interactor, to press enter (i.e., equivalent to a new line for breaking the while loop) when he wants to exit the program
    surname = input("Enter surname of the author: ") #asking next input from the user if he wants to carry on

exit(0) #exiting the program at the break of the while loop
0 голосов
/ 26 октября 2009

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

>>> 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...