現実の問題:
私は多くの企業の取締役に関するデータを持っていますが、「XYZ の取締役であるジョン・スミス」と「ABC の取締役であるジョン・スミス」が同一人物である場合もあれば、そうでない場合もあります。また、「John J. Smith, director of XYZ」と「John Smith, director of ABC」は同一人物である場合もあれば、同一でない場合もあります。多くの場合、追加情報の調査 (たとえば、「XYZ のディレクター、ジョン・スミス」と「ABC のディレクター、ジョン・スミス」に関する伝記データの比較) により、2 つの観測が同一人物であるかどうかを解決できます。
問題の概念的なバージョン:
その精神で、一致するペアを特定するデータを収集しています。たとえば、次の一致するペアがあるとします: {(a, b), (b, c), (c, d), (d, e), (f, g)}
. 「同一人物」という関係の推移性を利用して、 の「連結成分」を生成したい{{a, b, c, d, e}, {f, g}}
。それは{a, b, c, d, e}
一人であり、{f, g}
別の人です。(質問の以前のバージョンでは、明らかに別のものである「クリーク」に言及していました。これは、(私の目的では)「間違った」結果を与えていた理由を説明します) find_cliques
。networkx
次の Python コードがその役割を果たします。しかし、私は疑問に思います: より良い (計算コストの少ない) アプローチ (例えば、標準または利用可能なライブラリを使用する) はありますか?
関連すると思われる例があちこちにありますが (例: Cliques in python )、これらは不完全であるため、それらが参照しているライブラリや、それらを使用するためのデータのセットアップ方法がわかりません。
サンプル Python 2 コード:
def get_cliques(pairs):
from sets import Set
set_list = [Set(pairs[0])]
for pair in pairs[1:]:
matched=False
for set in set_list:
if pair[0] in set or pair[1] in set:
set.update(pair)
matched=True
break
if not matched:
set_list.append(Set(pair))
return set_list
pairs = [('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e'), ('f', 'g')]
print(get_cliques(pairs))
これにより、目的の出力が生成されます: [Set(['a', 'c', 'b', 'e', 'd']), Set(['g', 'f'])]
.
サンプル Python 3 コード:
これにより生成されます[set(['a', 'c', 'b', 'e', 'd']), set(['g', 'f'])]
):
def get_cliques(pairs):
set_list = [set(pairs[0])]
for pair in pairs[1:]:
matched=False
for a_set in set_list:
if pair[0] in a_set or pair[1] in a_set:
a_set.update(pair)
matched=True
break
if not matched:
set_list.append(set(pair))
return set_list
pairs = [('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e'), ('f', 'g')]
print(get_cliques(pairs))