네트워크 분석(Network Analysis)은 단어들 또는 문장들 간의 관계를 네트워크 구조로 모델링하고 이를 분석하는 기법입니다. 데이터 내에서 중요한 정보를 추출하거나, 단어 관계 분석, 문서 클러스터링, 트렌드 분석, 감성 분석 등에 유용한 방법입니다.

토큰화를 통해 전처리된 sentences.txt 데이터를 입력파일로 사용하여 실습을 진행하겠습니다. украина와 россия를 타켓단어로 설정하고, 문장에서 타겟 단어와 함께 등장한 다른 단어들을 추출하여 공출현 관계를 네트워크 그래프 형태로 시각화해 봅시다.

  1. 필요한 라이브러리를 임포트합니다.

    from collections import Counter, defaultdict
    
  2. 파일 경로를 설정합니다.

    input_file = '/content/sentences.txt'
    
  3. 공출현 관계를 저장할 변수를 설정합니다.

    cooccurrence_network = defaultdict(Counter)
    target_words = ['украина', 'россия']
    

    타겟 단어(украина, россия)와 함께 등장한 다른 단어들의 빈도를 카운팅합니다.

  4. 파일을 열고 데이터를 처리하겠습니다.

    with open(input_file, 'r', encoding='utf-8') as infile:
      for line in infile:
        words = line.strip().split()
        for target in target_words:
          if target in words:
            for word in words:
              if word != target:
                cooccurrence_network[target][word] += 1
    

    각 줄을 단어 리스트로 변환합니다. 두 단어가 문장에 존재하는지 확인합니다. 문장에 타겟 단어가 포함되어 있으면, 그 문장에서 타겟 단어와 함께 등장한 다른 단어들을 추출하여 공출현 관계를 기록합니다

  5. 결과를 출력합니다.

    for target in target_words:
      print(f"\\n'{target}'와 결합한 단어들 (상위 20개):")
      for word, count in cooccurrence_network[target].most_common(30):
        print(f"{target} - {word}: {count}")
    

    most_common(30)을 사용하여 각 타겟 단어와 결합한 단어들 중 빈도수가 높은 상위 30개 단어를 출력합니다. 각 타겟 단어와 관련된 공출현 단어와 빈도를 출력합니다.

  6. 지금까지의 과정을 모두 포함하면 다음과 같이 코드가 완성됩니다.

    from collections import Counter, defaultdict
    
    input_file = '/content/sentences.txt'
    
    cooccurrence_network = defaultdict(Counter)
    target_words = ['украина', 'россия']
    
    with open(input_file, 'r', encoding='utf-8') as infile:
      for line in infile:
        words = line.strip().split()
        for target in target_words:
          if target in words:
            for word in words:
              if word != target:
                cooccurrence_network[target][word] += 1
    
    for target in target_words:
      print(f"\\n'{target}'와 결합한 단어들 (상위 20개):")
      for word, count in cooccurrence_network[target].most_common(30):
        print(f"{target} - {word}: {count}")
    
  7. 화살표 버튼을 클릭하여 셀을 실행합니다.

    다음과 같이 출력됩니다.

    image20.png

출력된 결과를 바탕으로 단어 간 공출현 관계를 네트워크 그래프 형태로 시각화해 봅시다. 단어들을 노드로, 단어들 간의 공출현 관계를 엣지로 나타낼 것입니다.

  1. 새로운 코드 셀을 삽입하고, 필요한 라이브러리를 임포트합니다.

    import networkx as nx
    import matplotlib.pyplot as plt
    from collections import Counter, defaultdict
    

    네트워크 구조로 시각화하기 위해 NetworkX 라이브러리를 사용하겠습니다.

  2. 2~4와 동일한 작업을 수행합니다.

    input_file = '/content/sentences.txt'
    
    cooccurrence_network = defaultdict(Counter)
    target_words = ['украина', 'россия']
    
    with open(input_file, 'r', encoding='utf-8') as infile:
      for line in infile:
        words = line.strip().split()
        for target in target_words:
          if target in words:
            for word in words:
              if word != target:
                cooccurrence_network[target][word] += 1
    
  3. 빈 그래프 객체를 생성하고, 상위 20개의 연결을 그래프에 추가합니다.

    G = nx.Graph()
    for target in target_words:
      for word, count in cooccurrence_network[target].most_common(20):
        G.add_edge(target, word, weight=count)
    

    각 타겟 단어와 결합된 단어들 중 빈도수가 높은 상위 20개 단어를 추출한 후, 타겟 단어와 결합된 단어들 사이에 엣지를 추가합니다.

  4. 그래프의 위치를 설정합니다.

    pos = nx.spring_layout(G, k=0.5, seed=42)  
    

    k는 노드들 간의 기본 거리이고, seed는 랜덤한 요소를 고정시키기 위한 값입니다.

  5. 노드의 색상과 크기를 설정합니다.

    node_colors = []
    for node in G.nodes():
      if node in target_words:
        node_colors.append('red')
      else:
        node_colors.append('lightblue')
    

    타겟 단어(украина와 россия)는 빨간색, 나머지 단어들은 파란색으로 설정하겠습니다.

  6. 엣지의 두께를 설정합니다.

    edges = G.edges(data=True)
    edge_weights = [edge[2]['weight'] for edge in edges]