◆ 이번에는 키워드 동시 출현 빈도값을 기반으로 Keyword network 및 네트워크 군집화를 하여 그래프 그리기를 해보려고 한다.

그 전에, python의 networkx 패키지를 이용하여 어찌저찌 그래프를 그려보았지만, 몇가지의 문제가 있어 이걸 다른 분석 결과에 가져다 쓰기는 조금 부족해보였다.

아래는 networkx등의 패키지를 이용해서 python으로 그려본 그래프이다.

그룹화하는 알고리즘을 어디선가 찾아서 군집화도 시도를 해보았다.

일단, 노드들이 겹쳐지는 문제가 있고, 노드 위치등을 옮기고 하는게 쉽지 않았다.

그래서 UCINET 툴을 이용해서 그리는게 매우 효율적이었다.

※아래 블로그를 참고하면 사용법을 쉽게 따라할 수 있다.

[Network Graph 그리기]

빅데이터 분석 솔루션 텍스톰(Textom)

 

텍스톰(TEXTOM)

웹 기반의 빅데이터 분석 솔루션! WEB, SNS, 보유데이터 분석이 가능합니다.

www.textom.co.kr

 

[CONCOR 분석 - 군집화]

빅데이터 분석 솔루션 텍스톰(Textom)

 

텍스톰(TEXTOM)

웹 기반의 빅데이터 분석 솔루션! WEB, SNS, 보유데이터 분석이 가능합니다.

www.textom.co.kr

 

위 툴을 사용하면, 마우스로 쉽게 노드들을 옮길 수 있고, 노드크기 조절(Weight에 비례하게도 가능)

특정 노드 없애기, 군집화, 각 군집별 색상, 필터링 등등 손쉽게 사용가능한 기능들이 많다.

툴에 데이터를 로드할 때, concurrency_sheet.xlsx 와 concurrency_list.csv 에 생성해서 저장한 값들을 복사해서 UCINET 툴에 복사해서 붙여넣기를 하면 된다. (위 링크 참조)

UCINET 설치파일 다운

Analytic Technologies - Download (google.com)

 

Analytic Technologies - Download

TO DOWNLOAD, PRESS THE RED DOWNLOAD BUTTON BELOW. BUT YOU MIGHT WANT TO READ THE WHOLE PAGE FIRST

sites.google.com

 

 

아마 32비트 64비트용 프로그램이 동시에 설치될 것인데, 32비트용 프로그램을 실행해야 문제가 없을듯하다.

첨엔, 64비트로 했다가 알 수 없는 오류로 진행이 안되는 경우가 많았다. 이유를 모르고 계속 오류가 발생해서 한참을 삽질했는데, 우연히 32비트로 실행해야 된다는 말을 검색중에 찾았다.

◆ 이번에는 TF값을 이용하여 Word Cloud를 그려보려고 한다.

WordCloud 패키지에서 지원을 해주기 때문에 쉽게 가능하다.

 

import pandas as pd
from wordcloud import WordCloud
def main():
    df = pd.read_excel('./count_tf.xlsx', header=None)

    count = {}  # dictionary 만들기
    for index, row in df.iterrows():
        w, c = row[0], row[1]
        count[w] = c

    #한글로 그리기 위해서는 별도로 폰트가 필요할 것이다.
    fontpath = './NanumBarunGothic.ttf'
    wordcloud = WordCloud(
        font_path = fontpath,
        max_font_size = 350,
        width = 1280, #이미지 너비 지정
        height = 960, #이미지 높이 지정
        prefer_horizontal = 1,
        background_color = 'white', #이미지 배경색 지정
        max_words = 80) #몇개의 단어를 표시할 것인지

    word_cloud_file_name = "./word_cloud.png"
    wordcloud.to_file(word_cloud_file_name)
    print("> word cloud image exported to ", word_cloud_file_name)

 

 

 

대략 아래와 같은 형태로 이미지를 얻을 수 있다.

동시 출현 빈도값을 이용하여 Degree Centrality(연결중심성) 및 Eigenvector Centrality(위세중심성) 을 계산해보려고 한다.

networkx 패키지에서 지원을 하고 있어서 쉽게 사용 가능하다.

중심성 지수

[출처] [네트워크 분석] 네트워크 중심성(Centrality) 지수 - 연결(Degree), 매개(Betweeness), 위세(Eigenvector), 근접(Closeness) : 네이버 블로그 (naver.com)

 

[네트워크 분석] 네트워크 중심성(Centrality) 지수 - 연결(Degree), 매개(Betweeness), 위세(Eigenvector), 근

안녕하세요. 중심성(Centrality) 지수에 대해서 정리해보려고 합니다. 1. 중심성(Centrality) 지수 중심...

blog.naver.com

연결 중심성(Degree Centrality, Cd)

연결 중심성은 중심성 지수에서 가장 간단하면서 기본적인 지표입니다. 이 지표는 한 노드(Node)에 직접적으로 연결된 모든 엣지(Edge)의 개수로 지수를 평가합니다.

[네트워크 분석] 네트워크 중심성(Centrality) 지수 - 연결(Degree), 매개(Betweeness), 위세(Eigenvector), 근접(Closeness) : 네이버 블로그 (naver.com)
위세 중심성(Eigenvector Centraility, Ce)

연결 중심성(Degree Centraility)는 특정 노드가 다른 노드와 연결된 정도를 나타낸 지수라면, 위세 중심성(Eigenvector Centrailiy)는 특정 노드와 연결된 다른 노드들의 중심성을 가중치에 반영하는 지표입니다. 즉, 위세 중심성이 높은 노드는 연결된 다른 노드가 네트워크에서 중요한 노드들이랑 많이 연결되었다는 의미를 얻을 수 있습니다.

[네트워크 분석] 네트워크 중심성(Centrality) 지수 - 연결(Degree), 매개(Betweeness), 위세(Eigenvector), 근접(Closeness) : 네이버 블로그 (naver.com)

 

 

import pandas as pd
import networkx as nx
import numpy as np

def main():
    dataset = pd.read_csv('./concurrency_list.csv')
    
    #중심성 척도 계산
    G_centrality = nx.Graph()
    
    #특정 빈도수(lowLimitForCentrality) 이상 단어쌍에 대해서 edge 표현 (데이터에 따라 유동적으로)
    for ind in range((len(np.where(dataset['freq'] >= lowLimitForCentrality)[0]))):
        G_centrality.add_edge(dataset['word1'][ind], dataset['word2'][ind], weight=int(dataset['freq'][ind]))
    
    dgr = nx.degree_centrality(G_centrality)        # 연결 중심성
    egv = nx.eigenvector_centrality(G_centrality)   # 위세 중심성    
    
    cdf = pd.DataFrame(data=dgr, index=['weight'])
    cdf = (cdf.T)
    cdf = cdf.sort_values('weight', ascending=False)
    cdf.to_excel(folder + 'degree_centrality.xlsx')
    print('> exported degree_centrality')
    
    cdf = pd.DataFrame(data=egv, index=['weight'])
    cdf = (cdf.T)
    cdf = cdf.sort_values('weight', ascending=False)
    cdf.to_excel(folder + 'eigenvector_centrality.xlsx')
    print('> exported eigenvector_centrality')

 

그리고, 이전 게시물에서 만들었던 concurrency_list.csv 파일은 아래 형태의 인풋 데이터이다.

* 두 단어 쌍이 동시 존재한 문서 갯수를 세어서, 높은 순서로 정렬한 결과이다.

freq값은 전체 문서 갯수에 따라 그 크기다 다 다를것인데, 너무 작은 숫자까지 input로 쓰는것은 큰 의미가 없고 오히려 연산 시간만 많이 소요될 수 있으므로, 적당히 자르는게 필요하겠다. concurrency_list를 만들 때 특정 freq 이상만 csv에 넣는다던지, 아니면, 위의 중심성 계산을 위해 노드 추가할 때 특정 freq이상만 노드로 추가를 할 수 있겠다. 후자로 할 때 그 필터링할 최소 freq 값을 lowLimitForCentrality 에 정의를 하면 된다.

 

빅데이터 키워드 분석 : 동시 출현 빈도 계산 :: 코딩하는 참새 (tistory.com)

 

 

그래서, 위 스크립트를 수행하면 대략 아래와 같은 결과값이 나온다.

 

Degree(왼쪽) Eigenvector(오른쪽) Centrality

그 외, 매개중심성, 근접중심성, 페이지 랭크도 아래처럼 계산할 수 있다.

    btw = nx.betweenness_centrality(G_centrality)   # 매개 중심성
    cls = nx.closeness_centrality(G_centrality)     # 근접 중심성
    pgr = nx.pagerank(G_centrality)                 # 페이지 랭크

키워드 간의 관계를 파악하기 위해서, 모든 키워드(토큰)들에 대해서, 다른 키워드들과 동시 출현 빈도를 계산할 필요가 있다.

Centrality (연결 중심성, 위세 중심성) 값들을 계산하거나, Network 분석을 위해서 계산을 해 둘 필요가 있다.

동시 출현값은, 키워드를 두개의 쌍으로 해서 동시 출현 횟수를 모두 세어야 하므로, TF값이 높은 키워드들 중에서 Top N개에 대해서만 계산하는 게 유리하다. N이 늘어날 수록 계산량이 제곱만큼 거지므로 시간이 매우 늘어나게 된다.

로컬 PC에서 돌렸는데, 대략 100개~200개 까지 했었다. 사실 그 보다 큰 갯수를 해서 네트워크 그래프를 그린다면 눈에 잘 안들어오는 것도 사실이라 클 필요는 없어 보인다.

 

import pandas as pd
maxWordForConcurrency = 100  #상위 100개에 대해서만 하려고 한다.
def main():
    word_count = pd.read_excel('./count_tf.xlsx', header=None)
    word_count = word_count.head(maxWordForConcurrency)

    word_list=list(word_count[0].values.astype('U'))
    con_count=[[0]*n for i in range(n)]

    df = pd.read_excel('./df.xlsx')
    contents_list=list(df["내용 토큰화"].values.astype('U'))

    # 두 키워드가 같은 문서에 나온 경우를 count
    for y in range(maxWordForConcurrency):
        for x in range(maxWordForConcurrency):
            cc = 0
            if y == x:  #자기 자신이 동시에 나온 문서를 카운트할 필요는 없으므로 skip
                continue
            for content in contents_list:
                if word_list[x] in content and word_list[y] in content:
                    con_count[y][x] += 1

    # 2개의 키워드가 동시 출현한 문서 수를, 리스트형태로 데이터화 한 뒤에 정렬
    count_list = []
    for y in range(maxWordForConcurrency):
        for x in range(maxWordForConcurrency):
            if y > x:
                continue
            count_list.append([word_list[y], word_list[x], con_count[y][x]])

    df = pd.DataFrame(count_list, columns=["word1", "word2", "freq"])
    df = df.sort_values(by=['freq'], ascending=False)
    df = df.reset_index(drop=True)

    # 동시 출현 키워드 쌍을 정렬하여 표시. 중심성 계산할 때 필요
    df.to_csv('./concurrency_list.csv', encoding='utf-8-sig')
    print("> exported concurrency_list")

    # x * x 배열의 sheet 형태로 빈도수 저장. 네트워크 분석 시 필요
    cc2 = pd.DataFrame(con_count, columns=word_list, index=word_list)
    cc2.to_excel('./concurrency_sheet.xlsx', index=True, header=True)
    print("> exported concurrency_sheet")

 

 

 

결과 아래와 같은 형태의 두개의 엑셀 파일이 생성되겠다.

 

◆ TF(Term Frequency) 계산

 

from sklearn.feature_extraction.text import CountVectorizer 

def main():
    df = pd.read_excel('./df.xlsx')

    listdf = list(df["내용 토큰화"].values.astype('U'))
    vectorizer = CountVectorizer(tokenizer=local_tokenizer)
    
    count = vectorizer.fit_transform(list(df["내용 토큰화"].values.astype('U')))    
    count = pd.DataFrame(count.toarray(), columns = vectorizer.get_feature_names_out())
    count = count.sum()
    count = pd.DataFrame(count)
   
    # 전체 토큰에 대해서 TF count가 필요없고, 상위 n개가 필요할 경우
    count = count[0].nlargest(maxWordForTF)
    print('\r\n> nlargest')
    print(count)

    count.to_excel('./count_tf.xlsx', index=True, header=False)
    print('> exported count_tf.xlsx')

 

 

앞서 진행한 정제 작업 후 생성해둔 data frame 파일(df.xlsx)로 부터 토큰 데이터를 읽어와서,

문서별로 토큰 출현 횟수를 계산하게 하였다. maxWordForTF 는 숫자이다. 100개 200개 정도 수준으로 필요한 갯수만 상위에서 잘라내도록 했다. 이 숫자 이하로 WordCloud에 표시될 단어 수나 Plot-bar/네트워크 그래프에 표시될 개수를 맞추게 될 것이다.

결과 엑셀은 대략 이런 모습으로 저장될 것이다.

◆ TF-IDF (Inverse Document Frequency)

from sklearn.feature_extraction.text import TfidfVectorizer

def main():
    df = pd.read_excel('./df.xlsx')
    tfidfvect = TfidfVectorizer(tokenizer=local_tokenizer)
    tfidfvect.fit(list(df["내용 토큰화"].values.astype('U')))

    tfidf = tfidfvect.transform(list(df["내용 토큰화"].values.astype('U')))
    feature_names = tfidfvect.get_feature_names_out()

    tfidf = pd.DataFrame(tfidf.toarray(), columns=feature_names)
    tfidf = tfidf.sum().to_frame()

    tfidf_excel = tfidf[0].nlargest(maxWordForTFIDF)
    print(tfidf_excel)

    tfidf_excel.to_excel('./tfidf.xlsx', index=True, header=True)
    print("> tfidf exported")

 

maxWordForTFIDF 변수에도 필요한 토큰수만큼 써주자.

결과 엑셀은 대략 이런 모습으로 저장될 것이다.

토크나이저는, 우리가 이미 정제후에 특수기호 "|"로 join해서 저장했기때문에, 단순히 "|"로 split해서 리턴해주면 되겠다.

 

def local_tokenizer(text):
    tokens = text.split('|')
    tokens_l = [token.lower() for token in tokens]
    return tokens_l

 

 

◆ TF-IDF 기준으로 Plotbar 그리기

위 tf-idf 계산 코드 아래에 아래처럼 plot bar를 그리는 코드를 추가해서 파일로 그릴 수 있다

(maxWordForPlotBar 값에도 보여주고 싶은 키워드 갯수를 쓴다)

 

    tfidf_plotbar = tfidf[0].nlargest(maxWordForPlotBar)
    fig = tfidf_plotbar.plot(kind='bar', figsize=(40, 20), fontsize=20).get_figure()
    plotbar_file_name = "./plot_bar.png"
    fig.savefig(plotbar_file_name)
    print("> plotbar image exported to ", plotbar_file_name)

 

 

대략 이런 이미지가 나올것이다.

◆ 우선 개발환경은 Python 3.11 버전에, Visual Studio Code를 사용하였다.

 

◆ 기본 데이터에서 데이터 정제

bigkinds에서 가져온 데이터라면, "키워드" 필드에 있는 데이터를 그대로 사용해도 무방할 듯 하다.

 

import pandas as pd

dataFile = './NewsResult.xlsx'
df = ''
if dataFile.endswith('.xlsx'):
    df = pd.read_excel(dataFile)
elif dataFile.endswith('.csv'):
    df = pd.read_csv(dataFile)

df = df[["키워드"]]
print("> original data")
print(df.head(5))

 

# 혹시 데이터 정제가 필요하면, 정제 함수를 만들고 아래처럼 호출
df["키워드"] = df["키워드"].map(refine_data)

def refine_data(text):
    try:
        text = re.sub('\\\\n', ' ', text)
        text = re.sub('[^가-힣ㄱ-ㅎㅏ-ㅣa-zA-Z]', ' ', text)
        text = re.sub('[\s]+', ' ', text)
        return text
    except Exception as e:
        print("error = ", e)
        return ''

 

 

데이터를 읽어와서 토큰화하자

 

token_list = []
empty_count = 0
for k in df["키워드"]:
	nouns = k.split(',')   # 이미 키워드로 뽑은것이라, konlpy 를 쓸 필요가 없음.
	static_nouns = find_static_nouns(k) # 기타 static 명사 추가. ex) konly로 찾지 못하는 예외 케이스들을 따로 찾아서 리스트로 리턴
	nouns = [*nouns, *static_nouns]
	
	line = []
	for n in nouns:
		if len(n) > 0:
			line.append(n)
	if (len(line) == 0):    # 간헐적으로 정제후 전혀 키워드가 안뽑힌 경우도 있을 수 있음
		empty_count += 1
		line = ''
	else:
		line = "|".join(line)
	token_list.append(line)

df["키워드"] = pd.DataFrame(token_list, columns = ["키워드"])

 

 

그외 추가 필터링, 처리 작업

# 단어 변경이 필요할 때
print("> replace_array_words")
df["키워드"] = df["키워드"].map(replace_array_words)

# 불필요한 키워드 제거
print("> remove_stopwords")
df["키워드"] = df["키워드"].map(remove_stopwords)

# 빈 라인이 있으면 제거
df = df[ (df["키워드"].notnull()) & (df["키워드"].str.len() > 0) ]
print(df[outputFieldToken].head(5))

#파일 출력
df.to_excel('./df.xlsx', index=False)
print("> df.xlsx exported")

 

konlpy로 명사를 추출하면, 1글자는 추출하지 않는 문제?가 있다.

1글자 키워드를 추출한다고 하면 너무 많은 키워드가 만들어질거 같긴하다. 1글자 키워드를 포함시키기 위해서 별도의 예외처리 코드가 필요할 것이다. 그리고 제한적으로 정해진(즉, 유의미한) 1글자 키워드만 포함시켜야 할 듯하고, 1글자 특성상 다른 단어의 일부에 포함되었을 경우가 들어 가지 않게 처리가 필요할 듯 하다.

예를 들어 "나" (Me) 라는 키워드가 유의미 하다면, 단순히 텍스트에서 "나"가 포함 되었는지만을 찾는다면 문제가 될 소지가 크다. "언제나" "만나서" 이런 단어에도 포함이 되었다고 카운트 될 것이기 때문이다.

공백까지 같이 찾거나, "나에게" "나를" 등의 키워드로 찾아서 replace 하는 등의 예외처리가 필요하다. 데이터를 보고 판단할 필요가 있어 조금은 번거로운 일이 될듯하다. (여전히 인간의 노가다?는 아직 필요한듯하다. GPT같은 LLM이 나와서 대체가 가능할 듯도 하지만 그것은 또한 비용 증가로 이어질 것이다)

그리고, 특정 키워드 제거나, 텍스트 replace를 할 때도, 단순히 전체 텍스트에 대해서 in 등으로 찾지말고,

divider 로 split 한 다음에 키워드가 완전히 동일한 지를 체크해서 처리해야 의도치 않은 수행을 막을 수 있을듯 하다.

* 기타 필터링/대체 함수는 아래처럼 구현했다.

 

# 1. 특별히 허용할 단어나 글자
def find_static_nouns(text):
    result = []
    KEYWORDS = [
        "새로움", '나를', '나에게', '나 자신', '나에대해', '길을 ' #공백은 의도한 것
    ]
    result = [key for key in KEYWORDS if key in text]
    return result

# 2. 특별히 단어를 변환해야 할 경우. 1번에서 특별히 허용한 단어를 특정 키워드로 변환 필요
def replace_array_words(text):    
    REPLACE_WORDS = [
        ("물이", "물"),
        ("마주", "마주하기"),
        ("나에게", "나"),
        ("나를", "나"),
        ("나 자신", "나"),
        ("나에대해", "나"),
        ("길을 ", "길"),
    ]
    arr_text = text.split('|')
    for a, b in REPLACE_WORDS:
        arr_text = [b if t == a else t for t in arr_text]
    return "|".join(arr_text)

# 3. 불용어 제거 및 한글자 허용 (토큰 단위 처리)
def remove_stopwords(text):
    try:
        tokens = text.split('|')
        stops = ['투데이','최근','성형', '대한', '현지','지난','기자']
        meaningful_words = [w for w in tokens if not w in stops]
        
        allow_one_lnth = ['물', '나', '삶', '책', '길']
        result = []
        
        for w in meaningful_words:
            if len(w) != 1 or w in allow_one_lnth:
                result.append(w)
        return '|'.join(result)
    except Exception as e:
        print("error = ", e)
        return ''

파이썬 문법 자체가 아직 익숙치 않은 초보라, 코드를 잘 최적한 한것인지 자신은 없다.

입력 데이터를 정교하게 분석이 필요할 수록 이런 필터링 함수가 복잡해질듯 하다. (특히 1글자 토큰 지원을 위해서는...)

→ 위 예시 케이스는 입력 데이터가 대략 800여개여서 눈으로 어느 정도 확인이 가능했다. 수천 수만개의 입력데이터라면 1토큰은 거의 포기를 해야지 않을까 싶다.

결과파일(df.xlsx)는 대략 이런식으로 저장될 것이다.

 

 

논문 등에서 특정 키워드나 분야에 대한 트렌드를 분석하기 위해서는 뉴스기사나 논문등의 자료로 부터 분석을 할 수 있다.

이번 프로젝트에서는 뉴스 기사를 수집하여 분석을 해보는 케이스였다.

뉴스 기사를 빅카인즈라는 사이트에서 통합해서 제공을 해주고 있었다. 뉴스 기사 뿐만 아니라, 해당 기사의 주요 키워드를 따로 뽑아서 주기도 하며, 검색된 기사들에 대한 분석도 사이트 자체적으로 해주기도 한다.

→ 빅카인즈 빅카인즈(BIG KINDS)

 

빅카인즈(BIG KINDS)

뉴스빅데이터 분석시스템, 뉴스 속 키워드 관계망, 주요 이슈, 정보원, 이슈 트렌드 분석 정보 제공

www.bigkinds.or.kr

 

엑셀로 기사를 다운 받으려면 로그인을 해야되서, 바로 회원가입부터 하는 것을 추천.

▶뉴스검색 → 뉴스검색 · 분석 → 검색어 입력

기간이나 언론사 선택, 상세 검색등이 가능하다.

▶2단계 검색 필터가 필요하면 처리 후에, 3단계 분석 결과 및 시각화를 확인한다

"데이터 다운로드"탭에서 우측 하단에 "엑셀다운로드" 를 누르면 다운받기가 가능하다.

자체적인 분석 결과도 제공해 주는데 꽤나 퀄리티가 좋은것 같다.

▶ 엑셀로 데이터를 받으면 십수개 이상의 컬럼의 데이터들로 제공을 한다.

사실 본문을 분석해서, 키워드 추출하고 불용어 제거 하는 등의 작업을 하는게 순서이지만,

이 사이트에서는 이미 "키워드" 컬럼에 컴마(,)로 구분된 데이터를 제공한다. (다행히도 키워드들은 중복 제거를 하지 않고, 기사에 출현한 횟수만큼, 해당 위치에 키워드를 표시한 것 같다. 중복 제거를 해버리면, TF-IDF 계산에 문제가 있을 수 있기 때문이다. 정확히는 TF값이 안맞게 되는것같다)

그리고, "본문" 컬럼의 데이터를 보면, 아쉽게도 전체 본문을 다 제공하지는 않고 있다. 초반부의 일부 기사 내용만 표시하고, 뒷부분은 말줄임표로 표시되어 있다.

아무튼 이 엑셀 데이터를 기반으로 해서 파이썬 스크립트를 돌려서 키워드 분석을 해보고자 한다.

 

방대한 분량들의 텍스트들에 대해서, 주요 키워드들을 뽑아내고, 발생 빈도, 주요 단어간의 관계, 동시 출현 빈도 분석, Word Cloud, 네트워크 분석등을 해보려고 한다.

분석 대상이 되는 텍스트는 특정 주제로 수집된 뉴스 기사들이거나, 논문 등이 될 수 있겠다.

Python Script와 그 외 분석 도구를 활용할 예정이다.

대략 아래 이미지나 엑셀 표의 분석 결과를 얻어 내보려고 한다.

▶Word Cloud

▶ PlotBar

▶키워드 네트워크

▶키워드 빈도

▶ 동시 출현 빈도 (List)

▶ 동시 출현 빈도 (N * N Sheet)

▶ Degree Centrality(연결중심성) 및 Eigenvector Centrality(위세중심성)

▶TF-IDF

연결중심성, 위세중심성, TF-IDF 등등이 정확히는 어떠한 분석적 의미가 있는지는 잘 알지는 못했지만, 키워드 분석에서 해당 결과들을 필요로 하는 경우들이 있어 파이썬으로 구현을 해보았다.

파이썬 문법도 아직 초보여서, 효율적인 코드가 아닌 부분도 있을 수 있다.

◆ 주요 키워드

TF(단어 빈도, term frequency)는 특정한 단어가 문서 내에 얼마나 자주 등장하는지를 나타내는 값으로, 이 값이 높을수록 문서에서 중요하다고 생각할 수 있다. 하지만 단어 자체가 문서군 내에서 자주 사용되는 경우, 이것은 그 단어가 흔하게 등장한다는 것을 의미한다.

역문서 빈도(TF-IDF : Term Frequency-Inverse Document Frequency) 는 한 단어가 문서 집합 전체에서 얼마나 공통적으로 나타나는지를 나타내는 값이다. 전체 문서의 수를 해당 단어를 포함한 문서의 수로 나눈 뒤 로그를 취하여 얻을 수 있다.

 

[출처] tf-idf - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

 

tf-idf - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. TF-IDF(Term Frequency - Inverse Document Frequency)는 정보 검색과 텍스트 마이닝에서 이용하는 가중치로, 여러 문서로 이루어진 문서군이 있을 때 어떤 단어가 특정 문서

ko.wikipedia.org

 

중심성 지수

[출처] [네트워크 분석] 네트워크 중심성(Centrality) 지수 - 연결(Degree), 매개(Betweeness), 위세(Eigenvector), 근접(Closeness) : 네이버 블로그 (naver.com)

 

[네트워크 분석] 네트워크 중심성(Centrality) 지수 - 연결(Degree), 매개(Betweeness), 위세(Eigenvector), 근

안녕하세요. 중심성(Centrality) 지수에 대해서 정리해보려고 합니다. 1. 중심성(Centrality) 지수 중심...

blog.naver.com

 

연결 중심성(Degree Centrality, Cd)

연결 중심성은 중심성 지수에서 가장 간단하면서 기본적인 지표입니다. 이 지표는 한 노드(Node)에 직접적으로 연결된 모든 엣지(Edge)의 개수로 지수를 평가합니다.

[네트워크 분석] 네트워크 중심성(Centrality) 지수 - 연결(Degree), 매개(Betweeness), 위세(Eigenvector), 근접(Closeness)|작성자 Mr WOO

 

위세 중심성(Eigenvector Centraility, Ce)

연결 중심성(Degree Centraility)는 특정 노드가 다른 노드와 연결된 정도를 나타낸 지수라면, 위세 중심성(Eigenvector Centrailiy)는 특정 노드와 연결된 다른 노드들의 중심성을 가중치에 반영하는 지표입니다. 즉, 위세 중심성이 높은 노드는 연결된 다른 노드가 네트워크에서 중요한 노드들이랑 많이 연결되었다는 의미를 얻을 수 있습니다.


[네트워크 분석] 네트워크 중심성(Centrality) 지수 - 연결(Degree), 매개(Betweeness), 위세(Eigenvector), 근접(Closeness)|작성자 Mr WOO

 

+ Recent posts