문장 단위의 명사구 네트워크를 그리는 간략한 예제를 소개합니다.
아이디어는 같은 문장의 명사구들은 서로 관계가 있다라는 것에서 시작합니다.
문장의 명사구를 (network theory의) 노드(node|vertex)로 보고,
각 노드의 쌍을 edge로 사전을 미리 제작하였습니다.
반복되는 edge들에는 빈도 가중치(weight)를 적용해서,
빈도의 순위를 통해 대상을 추리는 작업을 할 수 있도록 했습니다.
참고
* networkx 라이브러리 - http://networkx.readthedocs.org/en/latest/overview.html
사용 라이브러리들
In [1]:
import pandas as pd
import networkx as nx
import mpld3
미리 제작한 Edge 가중치 사전
In [2]:
# Pandas의 DataFrame
df.sort('weight',ascending=False).head(3)
Out[2]:
네트워크 그래프 오브젝트에 데이터 적재하기
In [3]:
# 그래프 종류 선언
G=nx.Graph()
# 미리 제작한 Edge 가중치 사전을 네트워크 그래프 오브젝트로 적재
for nodes,weight in df.sort('weight',ascending=False).head(50).get_values():
node1,node2 = nodes.split(',')
G.add_edge(node1,node2,weight=weight)
네트워크 그래프 그리기
In [4]:
mpld3.enable_notebook()
fig,ax = subplots(1,2,figsize=(10,4))
def drawing(ax):
ax.set_title('뉴스 이슈 - June 2015',fontsize=14)
layout = nx.spring_layout(G,k=.4)
nx.draw_networkx_nodes(G,pos=layout,node_size=1500,node_color='green',alpha=.1,ax=ax)
nx.draw_networkx_edges(G,pos=layout,width=2,edge_color='purple',alpha=.2,ax=ax)
nx.draw_networkx_labels(G,pos=layout,font_size=8,font_color='black',ax=ax)
ax.text(fontsize=20,family='Comic Sans MS',rotation=0,
horizontalalignment='center',verticalalignment='center',
x=0,y=0,s='data-rider.blogspot.kr',alpha=0.3,color='purple')
drawing(ax[0])
drawing(ax[1])
#mpld3.save_html(fig,'june2015.html')
우측(right)에 확대 화면을 담아 봤습니다.
HTML로 저장 후, 넒은 화면에서 인터랙티브(interactive)한 기능을 이용한다면, 꽤 흡족한 사용자 경험을 느낄 수 있을 것으로 기대해봅니다.
0 개의 댓글:
댓글 쓰기