Skip to content

공기어 네트워크

문서 단어 행렬

임포트

import numpy as np
import pandas as pd

데이터 열기

df = pd.read_excel('yelp.xlsx')

문서 단어 행렬 만들기

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(stop_words='english', min_df=0.01, binary=True)

  • min_df=0.01: 최소 1% 이상의 문서에서 출현한 단어만 포함
  • binary=True: 문서에 나타난 단어는 빈도 무관하게 1이 됨
dtm = cv.fit_transform(df.review)

인접행렬

인접 행렬(adjacency matrix): 네트워크에서 인접한 점(단어)들의 관계를 행렬로 나타낸 것 문서 단어 행렬을 곱하면 함께 나타난 단어는 1이 되고, 그렇지 않은 단어는 0이 됨.

cooccur = dtm.T @ dtm
adj = cooccur.A
  • .T: 전치행렬(행과 열을 바꿈)
  • @: 행렬 곱

각 단어별 문서빈도

n = np.diag(adj)
전체 문서
total, _ = dtm.shape
향상도
lift = total * adj / np.outer(n, n)

향상도가 2 이상인 경우는 1, 아니면 0으로 바꿈

m = np.where(lift >= 2, 1, 0)
대각원소(=행렬에서 대각선 방향의 원소)는 단어의 문서 빈도를 나타내므로 0으로 설정
np.fill_diagonal(m, 0)

NetworkX로 변환

Python에서 네트워크 분석을 위한 라이브러리

import networkx as nx
인접행렬을 네트워크로 바꾸기
net = nx.from_numpy_array(m)

노드 이름을 단어로 바꾸기

words = cv.get_feature_names_out()
net = nx.relabel_nodes(net, dict(enumerate(words)))
steak와 연결된 단어 보기
list(nx.neighbors(net, 'steak'))

중심성

네트워크에서 노드의 중요도를 나타내는 지표

연결 중심성(degree centrality): 연결된 단어 수 / (전체 단어 수 - 1)

dc = nx.degree_centrality(net)
매개 중심성(between centrality): 단어-단어 간의 최단 경로에 포함된 비율
bc = nx.betweenness_centrality(net)
근접 중심성(closeness centrality): 다른 단어와 거리가 평균적으로 짧은 단어
cc = nx.closeness_centrality(net)
고유벡터 중심성(eigenvector centrality): 중요한 단어와 연결된 단어가 중요한 단어
ec = nx.eigenvector_centrality(net)
중심성을 데이터 프레임으로 변환
ecf = pd.DataFrame(ec.items(), columns=['word', 'centrality'])
중심성 순으로 정렬
ecf.sort_values('centrality')

시각화

Python 네트워크 시각화를 위한 라이브러리

설치:

pip install pyvis
임포트:
from pyvis.network import Network
networkx 네트워크를 pyvis 네트워크로 변환
vis = Network(height='800px', width='1000px')
vis.from_nx(net)
설정 버튼 추가
vis.show_buttons(filter_=True)
보이기
vis.save_graph('nx.html')