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

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

 

 

 

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

 

+ Recent posts