この名前のリストをグループ化するための良い方法は何ですか。
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