2009-10-26 7 views
0

미국 인구 조사국은 "soundex"라는 특수 인코딩을 사용하여 사람에 대한 정보를 찾습니다. soundex는 성 (姓)을 철자 방식이 아닌 소리 방식으로 인코딩합니다. SMITH와 SMYTH와 같이 똑같지 만 철자가 다른 성은 동일한 코드를 가지고 함께 정리됩니다. soundex 코딩 시스템은 다양한 철자로 기록되었을지라도 성을 찾을 수 있도록 개발되었습니다.Python의 Soundex 알고리즘

이 실습에서는 성을 입력 할 때 soundex 코드를 생성하는 프로그램을 디자인, 코딩 및 문서화합니다. 사용자는 성을 입력하라는 메시지를 표시하고 프로그램은 해당 코드를 출력해야합니다.

기본 Soundex와 코딩 규칙

성 (姓)의 모든 SOUNDEX 인코딩은 문자와 세 개의 숫자로 구성되어 있습니다. 사용 된 문자는 항상 성의 첫 번째 문자입니다. 번호는 아래 표시된 사우운 스 가이드에 따라 성의 나머지 글자에 지정됩니다. 항상 네 자의 코드를 생성하기 위해 필요한 경우 끝에는 0이 추가됩니다. 추가 문자는 무시됩니다.

Soundex와 코딩 가이드

Soundex와 다양한 자음의 수를 지정합니다.

번호 자음

1 B, F, P, V 2 C, G, J, K, Q, S, X, Z 3 D, T (4) L : 모두 소리 자음들은 동일한 번호가 할당된다 5 M은 N R 6

Soundex와는 문자 A, E, I, O, U, H, W 및 Y.

무시

따른다 3 추가 Soundex와 코딩 규칙이있다. 훌륭한 프로그램 설계는 이들 각각을 하나 이상의 개별 기능으로 구현합니다. 더블 편지

성이있는 이중 문자가있는 경우와

규칙 1. 이름은, 그들은 하나 개의 문자로서 취급 할 필요가 있습니다. 예 :

구티에레즈는 G362 (G는 T는 3, 첫 번째 R은 6 개, 두 번째 R은 무시되고 Z는 2 개)로 코딩됩니다. 규칙 2. 동일한 Soundex 코드 번호가 나란히있는 이름이있는 문자

성이 soundex 코딩 가이드에서 같은 번호의 문자가 나란히있는 경우에는 한 글자. 예 :

피스터는 P236 (P와 같으므로 무시됩니다. S는 2, T는 3, R은 6입니다.)로 코딩됩니다.

잭슨은 J250으로 코드화되어 있습니다 (J는 C, K는 C와 같음, S는 C와 같음, N은 5, 0은 추가됨).

규칙 3 자음 분리기

3.a. 모음 (A, E, I, O, U)이 같은 soundex 코드를 갖는 두 개의 자음을 분리하면 모음의 오른쪽에있는 자음이 코드화됩니다. 예 :

Tymczak은 T-522 (T는 M은 2, C는 2, Z는 무시 (위의 "나란히 - 나란히"규칙 참조), 2는 K)로 코딩됩니다. 모음 "A"는 Z와 K를 분리하므로 K가 부호화됩니다. 3.b."H"또는 "W"가 동일한 soundex 코드가있는 두 개의 자음을 분리하면 오른쪽 자음은 코딩되지 않습니다. 예 :

* Ashcraft는 A261 (A는 2, S는 2, C는 H가있는 S와 같으므로 무시 됨, R은 6, F는 1)로 코딩됩니다. 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

전체 숙제를 읽지 않았습니다. 입력 내용과 출력 내용을 다시 게시하십시오. – JonH

+6

그는 전체 장면을 설정하고 이동하는 방법에 대한 도움을 요청했습니다. 그는 NO POINT에서 답을 물었습니다. 그가 입력 및 출력을 요구하는 재 게시를 한 경우이 작업은 종료되어야합니다. 그것은 숙제 질문을하는 방법에 대한 좋은 예입니다 !!! –

답변

1

다음을 시도해 보시기 바랍니다.

  • 저장하시오 CurrentCoded 및 LastCoded 변수는
    1. 부울 IsVowel (샤아)
    2. Int 인 코딩 (숯불로 이전
    3. 브레이크 유용한 기능으로 시스템 아래로 출력에 추가로 작업하기)
    4. 부울 IsRule1 (CHAR 차르)

멋지게 나누면 관리가 더 쉬워 져야합니다.

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]