2022. 8. 5. 23:05ㆍProject/뉴스기사로 인한 주가 등락 예측
의미 연결망 분석 ( 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}
'''
참고
'Project > 뉴스기사로 인한 주가 등락 예측' 카테고리의 다른 글
The Relationship between news and stocks 19 (0) | 2022.08.08 |
---|---|
The Relationship between news and stocks 18 (0) | 2022.08.05 |
The Relationship between news and stocks 16 (0) | 2022.08.03 |
The Relationship between news and stocks 15 (0) | 2022.08.03 |
The Relationship between news and stocks 14 (0) | 2022.08.02 |