Project/뉴스기사로 인한 주가 등락 예측

The Relationship between news and stocks 17

JooJaeHwan 2022. 8. 5. 23:05
728x90
반응형

의미 연결망 분석 ( Semantic Network Analysis, SNA ) 이란?

- 사회 연결망 분석 ( Social Network Analysis ) 는 분석 대상 및 분석 대상들간의 관계를 연결망 구조로 표현하고 이를 계량적으로 제시하는 분석 기법

- 사회 연결망 분석은 사람, 장소, 물품 등의 객체 간의 관계를 분석하는데 효과적이며 주로 친구 관계, 전력 공급 등을 분석하는데 사용

- 사회 연결망 분석 기법을 텍스트 내 단어의 관계에 적용한 것이 바로 의미 연결망 분석

- 의미 연결망 분석에서는 일정한 범위 내에서 어휘가 동시에 등장하면 서로 연결된 것으로 간주, 이 연결 관계들을 분석

▶ N-gram

import nltk
nltk.download('punkt')
from nltk import word_tokenize, bigrams

sentence = 'I love data engineer and deep learning'
tokens = word_tokenize(sentence)

bgram = bigrams(tokens)
bgram_list = [x for x in bgram]
from nltk.util import ngrams

tgram = ngrams(tokens, 3)
qgram = ngrams(tokens, 4)

tgram_list = [x for x in tgram]
qgram_list = [x for x in qgram]

어휘 동시 출현 빈도의 계수화

- 동시 출현 ( Co-occurrence ) 란 두개 이상의 어휘가 일정한 범위나 거리내에서 함께 출현하는 것을 의미

- 단어간의 동시 출현 관계를 분석하면 문서나 문장으로부터 두 단어가 유사한 의미를 가졌는지 등의 추상화된 정보를 얻을 수 있음.

- 동시 출현 빈도는 Window라는 지정 범위 내에서 동시 등장한 어휘를 확률 등으로 계수화 가능

- nltk에서 제공하는 ConditionalFreqDist 함수를 이용하면 문맥별 단어 빈도를 쉽게 측정 가능

from nltk import ConditionalFreqDist

sentences = ['I love data science and deep learning', 'I love science', 'I know this code']
tokens = [word_tokenize(x) for x in sentences]
bgrams = [bigrams(x) for x in tokens]

token = []
for i in bgrams:
  token += ([x for x in i])
cfd = ConditionalFreqDist(token)
cfd.conditions()

# ['I', 'love', 'data', 'science', 'and', 'deep', 'know', 'this']
import numpy as np

freq_matrix = []

for i in cfd.keys():
  temp = []
  for j in cfd.keys():
    temp.append(cfd[i][j])
  freq_matrix.append(temp)
freq_matrix = np.array(freq_matrix)
import pandas as pd

df = pd.DataFrame(freq_matrix, index=cfd.keys(), columns=cfd.keys())
df.style.background_gradient(cmap='coolwarm')

import networkx as nx

G = nx.from_pandas_adjacency(df)

nx.draw(G, with_labels=True)

- 어휘 동시 출현 빈도를 이용하면 어휘 동시 출현 확률까지 측정가능

- 어휘 동시 출현 확률 계산에는 nltk의 ConditionalProbDist를 이용

from nltk.probability import ConditionalProbDist, MLEProbDist

cpd = ConditionalProbDist(cfd, MLEProbDist)
cpd.conditions()

prob_matrix = []

for i in cpd.keys():
  prob_matrix.append([cpd[i].prob(j) for j in cpd.keys()])

prob_matrix = np.array(prob_matrix)
df = pd.DataFrame(prob_matrix, index=cpd.keys(), columns=cpd.keys())
df.style.background_gradient(cmap='coolwarm')

prob_G = nx.from_pandas_adjacency(df)

nx.draw(prob_G, with_labels=True)

중심성 ( Centraility ) 지수

- 연결망 분석에서 가장 많이 주목하는 속성은 바로 중심성 지수

- 중심성은 전체 연결망에서 중심에 위치하는 정도를 표현하는 지표로, 이를 분석하면 연결 정도, 중요도 등을 알 수 있음.

- 중심성 지수는 나타내는 특징에 따라 연결 중심성, 매개 중심성, 근접 중심성, 위세 중심성으로 구분

▶ 연결 중심성 ( Degree Centraility )

- 연결 중심성은 가장 기본적이고 직관적으로 중심성을 측정하는 지표

- 텍스트에서 다른 단어와의 동시 출현 빈도가 많은 특정 단어는 연결 중심성이 높다고 볼 수 있음.

- 연결 정도로만 측정하면 연결망의 크기에 따라 달라져 비교가 어렵기 때문에 여러 방법으로 표준화

- 주로 ( 특정 노드 i와 직접적으로 연결된 노드 수 / 노드 i와 직갖접적으로 연결된 노드 수 ) 로 계산

- 여기서 직접적으로 연결된 노드는 서로 엣지 관계인 노드를 뜻하며, 간접적으로 연결된 노드는 서로 엣지 관계는 아니나 다른 노드와 엣지에 의해 도달할 수 있는 노드를 말함

nx.degree_centrality(G)

'''
{'I': 0.2857142857142857,
 'and': 0.2857142857142857,
 'data': 0.2857142857142857,
 'deep': 0.14285714285714285,
 'know': 0.2857142857142857,
 'love': 0.42857142857142855,
 'science': 0.42857142857142855,
 'this': 0.14285714285714285}
 '''

▶ 위세 중심성 ( Eigenvector Centraility )

- 위세 중심성은 연결된 상대 단어의 중요성에 가중치를 둠

- 중요한 단어와 많이 연결됐다면 위세 중심성은 높아지게 됨

- 위세 중심성은 고유 벡터로써 인접해 있는 노드의 위세 점수와 관련되어 있어 직접 계산하기느 쉽지 않음

nx.eigenvector_centrality(G, weight = 'weight')

'''
{'I': 0.5055042648573065,
 'and': 0.15933837227495717,
 'data': 0.35703593885196566,
 'deep': 0.055886131430398216,
 'know': 0.20216573350291445,
 'love': 0.6195557831651917,
 'science': 0.39841035839294925,
 'this': 0.07090581134630142}
'''

▶ 근접 중심성 ( Closeness Centraility )

- 근접 중심성은 한 단어가 다른 단어에 얼마나 가깝게 있는지를 측정하는 지표

- 직접적으로 연결된 노드만 측정하는 연결 중심성과는 다르게, 근접 중심성은 직간접적으로 연결된 모든 노드들 사이의 거리를 측정

nx.closeness_centrality(G, distance='weight')

'''
{'I': 0.35,
 'and': 0.3333333333333333,
 'data': 0.3684210526315789,
 'deep': 0.25925925925925924,
 'know': 0.2916666666666667,
 'love': 0.4375,
 'science': 0.4117647058823529,
 'this': 0.23333333333333334}
 '''

▶ 매개 중심성 ( Betweeness Centraility )

- 매개 중심성은 한 단어가 단어들과의 연결망을 구축하는데 얼마나 도움을 주는지 측정하는 지표

- 매개 중심성이 높은 단어는 빈도 수가 작더라도 단어 간 의미부여 역할이 크기 때문에, 해당 단어를 제거하면 의사소통이 어려워짐

- 매개 중심성은 모든 노드 간 최단 경로에서 특정 노드가 등장하는 횟수로 측정하며, 표준화를 위해 최댓값인
( N - 1 ) X ( N - 2 ) / 2 로 나눔

nx.betweenness_centrality(G)

'''
{'I': 0.47619047619047616,
 'and': 0.2857142857142857,
 'data': 0.0,
 'deep': 0.0,
 'know': 0.2857142857142857,
 'love': 0.5714285714285714,
 'science': 0.47619047619047616,
 'this': 0.0}
 '''

▶ 페이지랭크 ( PageRank )

- 월드 와이드 웹과 같은 하이퍼링크 구조를 가지는 문서에 상대적 중요도에 따라 가중치를 부여하는 방법

- 이 알고리즘은 서로간에 인용과 참조로 연결된 임의의 묶음에 적용 가능

- 페이지 랭크는 더 중요한 페이지는 더 많은 다른 사이트로부터 링크를 받는다는 관찰에 기초

nx.pagerank(G)

'''
{'I': 0.1536831077679558,
 'and': 0.12417333539164832,
 'data': 0.10481873412175656,
 'deep': 0.07152392879557615,
 'know': 0.1224741813421488,
 'love': 0.19501225218917406,
 'science': 0.15751225722745082,
 'this': 0.07080220316428934}
 '''

참고

- 이수안컴퓨터연구소

 

728x90
반응형