0

米国国勢調査局は、「soundex」と呼ばれる特別なエンコードを使用して、個人に関する情報を見つけます。soundex は、姓の綴りではなく、発音に基づいた姓 (姓) のエンコーディングです。SMITH と SMYTH のように、同じように聞こえるが綴りが異なる姓は、同じコードを持ち、一緒にファイルされます。soundex コーディング システムは、姓がさまざまな綴りで記録されている場合でも姓を見つけることができるように開発されました。

このラボでは、姓を入力すると soundex コードを生成するプログラムを設計、コーディング、および文書化します。ユーザーは姓の入力を求められ、プログラムは対応するコードを出力する必要があります。

基本的な Soundex コーディング規則

姓のすべての soundex エンコーディングは、文字と 3 つの数字で構成されます。使用される文字は常に姓の最初の文字です。以下に示すsoundexガイドに従って、姓の残りの文字に番号が割り当てられます。常に 4 文字のコードを生成するために、必要に応じて末尾にゼロが追加されます。追加の文字は無視されます。

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 つ以上の個別の関数として実装します。

ルール 1. 2 文字の名前

姓に二重文字が含まれている場合は、それらを 1 文字として扱う必要があります。例えば:

Gutierrez は G362 にコード化されています (G、T は 3、最初の R は 6、2 番目の R は無視、Z は 2)。ルール 2. 同じ Soundex コード番号を持つ文字が並んでいる名前

姓に異なる文字が並んでいて、soundex コーディング ガイドで同じ数字になっている場合、それらは 1 つの文字として扱われるべきです。例:

Pfister は P236 としてコード化されます (P、F は P と同じと見なされるため無視されます。S は 2、T は 3、R は 6)。

Jackson は J250 としてコード化されます (J、C は 2、K は C と同じように無視され、S は C と同じように無視され、N は 5、0 が追加されます)。

ルール 3. 子音区切り

3.a. 母音 (A、E、I、O、U) が同じ soundex コードを持つ 2 つの子音を区切る場合、母音の右側の子音がコード化されます。例:

Tymczak は T-522 としてコード化されています (T、M の場合は 5、C の場合は 2、Z は無視されます (上記の「Side-by-Side」ルールを参照)、K の場合は 2)。母音「A」はZとKを分離するため、Kがコード化されます。3.b. 「H」または「W」が同じ soundex コードを持つ 2 つの子音を区切る場合、右側の子音はコード化されません。例:

*Ashcraft は A261 とコード化されています (A、S は 2、C は S と同じで無視され、その間に H があり、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

要求されたことを十分に実行しますが、3 つのルールをどのようにコーディングすればよいかわかりません。それが私が助けを必要としているところです。だから、どんな助けも大歓迎です。

4

3 に答える 3

1

次のことを試してみることをお勧めします。

  • 出力に追加する前に使用するCurrentCoded変数とLastCoded変数を保存します
  • システムを次のような便利な機能に分解します。
    1. ブールIsVowel(Char)
    2. Int Coded(Char)
    3. ブールIsRule1(Char、Char)

うまく分解すれば、管理しやすくなるはずです。

于 2009-10-26T17:58:15.900 に答える
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]
于 2009-10-26T20:16:47.023 に答える