2015년 8월 7일 금요일

networkx 라이브러리를 이용한 뉴스 요약 예제

네트워크 그래프를 그리는데 유용한 networkx 라이브러리(library)와 함께,
문장 단위의 명사구 네트워크를 그리는 간략한 예제를 소개합니다.

아이디어는 같은 문장의 명사구들은 서로 관계가 있다라는 것에서 시작합니다.
문장의 명사구를 (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]:
edge weight
6708 전망대,한수진 7
5520 삼성물산,엘리엇 6
9302 朴대통령,국회법 6

네트워크 그래프 오브젝트에 데이터 적재하기

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')

최근에 블로깅한 mpld3 라이브러리의 장점를 설명하고자 2개의 동일 플롯을 그리고,
우측(right)에 확대 화면을 담아 봤습니다.
HTML로 저장 후, 넒은 화면에서 인터랙티브(interactive)한 기능을 이용한다면, 꽤 흡족한 사용자 경험을 느낄 수 있을 것으로 기대해봅니다.


0 개의 댓글:

댓글 쓰기