近年、ナレッジグラフ(知識グラフ)は情報整理やAI活用の分野で注目されています。PythonのNetworkXライブラリを使えば、誰でも簡単に知識DBを構築・可視化できます。本記事では、NetworkXを使ったナレッジグラフの作り方を初心者向けに解説します。
ナレッジグラフは、ノード(実体)とエッジ(関係)で構成されるネットワーク型のデータ構造です。ノードには「人」「企業」「商品」などの実体、エッジには「所属」「発売元」などの関係が割り当てられます。
NetworkXはグラフ理論に基づくネットワーク分析ができるPythonライブラリです。無向グラフ・有向グラフの作成や、ノード・エッジの追加・削除、属性設定などが簡単にできます。
import networkx as nx
# 無向グラフの作成
G = nx.Graph()
# ノードの追加
G.add_nodes_from(["A", "B", "C"])
# エッジの追加
G.add_edges_from([("A", "B"), ("B", "C")])
テキストやデータベースからノードとエッジの元になる情報を収集します。
ノードには実体、エッジには関係を割り当てます。例えば「A社」と「Bさん」が「雇用」関係にある場合、「A社」と「Bさん」をノード、「雇用」をエッジのラベルにします。
import pandas as pd
# 例: エンティティと関係のデータフレーム
kg_df = pd.DataFrame({
'source': ['A社', 'Bさん'],
'target': ['Bさん', 'C商品'],
'edge': ['雇用', '発売']
})
# NetworkXでグラフ化
G = nx.from_pandas_edgelist(kg_df, 'source', 'target', edge_attr='edge')
ノードやエッジに属性(重みやタイプなど)を追加できます。
# ノードに属性を追加
nx.set_node_attributes(G, {'A社': {'type': '企業'}, 'Bさん': {'type': '人物'}, 'C商品': {'type': '商品'}})
# エッジに属性を追加
for u, v, d in G.edges(data=True):
d['label'] = kg_df[(kg_df['source'] == u) & (kg_df['target'] == v)]['edge'].values[0]
matplotlibを併用してグラフを可視化できます。
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, node_color='skyblue', node_size=1500, font_size=10)
edge_labels = nx.get_edge_attributes(G, 'label')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.show()
import matplotlib.pyplot as plt
import pandas as pd
import networkx as nx
# 日本語フォントを指定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['MS Gothic', 'Meiryo', 'Yu Gothic', 'Noto Sans CJK JP']
# 無向グラフの作成
G = nx.Graph()
# ノードの追加
G.add_nodes_from(["A", "B", "C"])
# エッジの追加
G.add_edges_from([("A", "B"), ("B", "C")])
# 例: エンティティと関係のデータフレーム
kg_df = pd.DataFrame({
'source': ['A社', 'Bさん'],
'target': ['Bさん', 'C商品'],
'edge': ['雇用', '発売']
})
# NetworkXでグラフ化
G = nx.from_pandas_edgelist(kg_df, 'source', 'target', edge_attr='edge')
# ノードに属性を追加
nx.set_node_attributes(G, {'A社': {'type': '企業'}, 'Bさん': {'type': '人物'}, 'C商品': {'type': '商品'}})
# エッジに属性を追加
for u, v, d in G.edges(data=True):
d['label'] = kg_df[(kg_df['source'] == u) & (kg_df['target'] == v)]['edge'].values[0]
plt.figure(figsize=(8, 6))
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, node_color='skyblue', node_size=1500, font_size=10)
edge_labels = nx.get_edge_attributes(G, 'label')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.show()
NetworkXを使えば、Pythonで手軽に知識DB(ナレッジグラフ)を構築・可視化できます。データ収集から可視化まで一連の流れを抑えておけば、AIやデータ分析の幅が広がります。