1

この名前のリストをグループ化するための良い方法は何ですか。

Doctor Watson.
Dr. John Watson.
Dr. J Watson.
Watson.
J Watson.
Sherlock.
Mr. Holmes.
S Holmes.
Holmes.
Sherlock Holmes.

一意の完全な名前のグループ化されたリストに:

Dr. John Watson.
Mr. Sherlock Holmes.

また興味深い:

Mr Watson
Watson
Mrs Watson
Watson
John Watson

アルゴリズムは、最初のワトソンがミスター(可能性が高い)であるかミセスであるかを推論する必要はなく、それらを一意にグループ化するだけなので、ここでの唯一の問題は、ジョンワトソンが明らかにワトソン夫人ではなくミスターに属していることです。性別ごとの名の辞書がなければ、これを推測することはできません。

これまで、リストを繰り返し処理して、各アイテムを残りのアイテムとチェックすることを考えてきました。各試合で、グループ化して最初からやり直し、グループ化が行われない最初のパスで停止します。

ここにいくつかの大まかな(そしてまだテストされていない)Pythonがあります。名前のリストでそれを呼び出すでしょう。

def groupedNames(ns):
    if len(ns) > 1:
        # First item is query, rest are target names to try matching
        q = ns[0]
        # For storing unmatched names, passed on later
        unmatched = []
        for i in range(1,len(ns)):
            t = ts[i]
            if areMatchingNames(q,t):
                # groupNames() groups two names into one, retaining all info
                return groupedNames( [groupNames(q,t)] + unmatched + ns[i+1:] )
            else:
                unmatched.append(t)
    # When matching is finished
    return ns
4

2 に答える 2

2

あなたの名前が常に形式[honorific][first name or initial]LastNameである場合は、姓を抽出してソートすることから始めることができます。一部の名前の形式が の場合LastName[,[honorific][first name or initial]]、それらを解析して最初の形式に変換できます。または、すべてを別の形式に変換することもできます。

いずれにせよ、名前を正規の形式にしてから、姓で並べ替えます。あなたの問題は大幅に軽減されます。次に、姓グループ内で名と敬称でソートし、それらを順番に調べて、フラグメントから完全な名前を抽出できます。

ご指摘のとおり、解決しなければならないあいまいな点がいくつかあります。たとえば、次のような場合があります。

John Watson
Jane Watson
Dr. J. Watson

2 人のうちどちらが医師であるかを判断するには、情報が不十分です。そして、ご指摘のとおり、名前の性別に関する情報がないと、Mr. J. WatsonまたはMrs. J. Watson.

于 2012-04-14T19:47:11.787 に答える
0

ここでハッシュを使用することをお勧めします。a = 0 および z = 25 の 26 進数として名前を解釈するようにハッシュ関数を定義します。次に、個々の単語をハッシュするだけです。そう

h(シャーロック・ホームズ) = h(シャーロック) + h(ホームズ) = h(ホームズ) + h(シャーロック)。

これを使用すると、次のような名前を簡単に識別できます。

ジョン・ワトソンとワトソン・ジョン

ジョン・ワトソン博士とジョン・ワトソン氏のようなあいまいさについては、Mr と Dr のハッシュ値が同じになるように定義できます。

J. ワトソンとジョン ワトソンのような競合を解決するには、最初の文字と姓だけをハッシュするだけです。同様の競合のアイデアを拡張できます。

于 2012-04-14T20:04:49.233 に答える