카테고리 없음

워드 클라우드(Wordcloud)

SHIN JI HAN 2024. 6. 1. 09:57
728x90
728x90
Reporting Date: June. 1, 2024

 

 


Reporting Date: May. 25, 2024  수행된 크롤링을 바탕으로
이스라엘 전쟁에 관한 뉴스 기사를  워드 클라우드로 생성하는 작업을 수행하였다. 
코드는 크게 불용어 제거,  토큰화,  빈도 계산워드 클라우드 생성의  4 단계로 나누어져 있다.


 

 

 

1 .  Python libraries

import re # 정규표현식 사용: 텍스트 데이터를 클렌징
import pandas as pd # 데이터 프레임 사용


import os # 파일의 존재 검사
from collections import Counter # 단어의 빈도수 계산


import nltk # 자연어 처리: 텍스트 토큰화를 위해 사용
from nltk.tokenize import word_tokenize # 텍스트 데이터를 단어 단위로 분할하기


import pickle # pickle 파일 로드


# 워드 클라우드
from wordcloud import WordCloud # 생성
import matplotlib.pyplot as plt # 시각화
from matplotlib import font_manager, rc # 폰트

 

 

 

2 .  불 용 어  제 거 ( Stopword  Removal )

두 개의 불용어 사전 파일을 로드하여 불용어 목록을 만드는 과정을 수행한다. 

# 불용어 사전 파일 경로
stopword_file_path1 = r"C:\Users\jkl12\Downloads\불용어 사전.txt"
stopword_file_path2 = r"C:\Users\jkl12\Downloads\불용어 사전2.txt"


# 불용어 사전 로드 함수
def load_stopwords(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        
        # 줄 단위로 나누기
        stopwords = file.read().splitlines()
    
    # 불용어 리스트를 집합(set)으로 변환하여 중복 제거
    return set(stopwords)

# 불용어 사전 호출 및 변수에 저장
custom_stopwords1 = load_stopwords(stopword_file_path1)
custom_stopwords2 = load_stopwords(stopword_file_path2)

 

 

 

3 .  파 일  로 드

분석에 방해가 되는 불필요한 요소들을 제거하여 정제된 텍스트를 만드는 과정을 수행한다.

# news_data3.pkl 파일 로드
with open("news_data3.pkl", "rb") as f:
    news_data = pickle.load(f)

# 뉴스 데이터에서 'content' 열의 텍스트 추출
text_data = ' '.join(news_data['content'])


# 텍스트 클렌징 함수
def clean_text(text):
    
    # 특수 문자 및 숫자 제거
    text = re.sub(r'[^a-z가-힣\s]', '', text)
    
    return text

# 클렌징된 텍스트 생성
cleaned_text = clean_text(text_data)

 

 

 

4 .  토 큰 화 ( Tokenization )

텍스트를 분석 가능한 작은 단위로 분할하는 과정을 수행한다.

# NLTK 데이터 다운로드 (최초 1회 실행)
# 문장 분리 및 단어 토큰화를 위해 필요한 데이터
nltk.download('punkt')

# 토큰화: 단어 단위로 분할
tokens = word_tokenize(cleaned_text)

 

 

 

5 .  빈 도  계 산 ( Frequency  Calculation )

각 단어(또는 토큰)가 얼마나 자주 등장하는지를 세는 과정을 수행한다. 

# 불용어 사전에 포함된 단어를 제외한 단어들만 남기기
filtered_tokens1 = [word for word in tokens if word not in custom_stopwords1]
word_counts1 = Counter(filtered_tokens1)

filtered_tokens2 = [word for word in tokens if word not in custom_stopwords2]
word_counts2 = Counter(filtered_tokens2)

 

 

 

6 .  워 드  클 라 우 드  생 성

위 작업을 토대로  Word Cloud 1 을 진행하였으며,  중요한 단어의 가시성 향상을 위해,
상위  6 개의 단어를  제외  Word Cloud 2 를 간격을 조정하여 생성하였다.

# 나눔고딕 폰트 설정
font_path = r"C:\Users\jkl12\Downloads\Font\nanum-all\나눔 글꼴\나눔스퀘어네오\NanumSquareNeo-bRg.ttf"


# 폰트 설정
font_name = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font_name)


# 워드 클라우드 생성
wordcloud1 = WordCloud(width=1000, height=500, background_color='white', 
font_path=font_path).generate_from_frequencies(word_counts1)

wordcloud2 = WordCloud(width=1000, height=500, background_color='white', 
font_path=font_path).generate_from_frequencies(word_counts2)


# 워드 클라우드 시각화
plt.figure(figsize=(12, 18))


# 첫 번째 워드 클라우드
plt.subplot(2, 1, 1)
plt.imshow(wordcloud1, interpolation='bilinear')

plt.title('Word Cloud 1\n', 
fontproperties=font_manager.FontProperties(fname=font_path, size=20))

plt.axis('off')
plt.text(0, -0.3, 
         '1. 가자지구 (Gaza Strip): 팔레스타인의 한 지역으로,' 
         '이스라엘과 오랜 기간 갈등을 겪어온 곳.\n\n'
         
         '2. 라파 (Rafah): 가자지구 남부에 위치한 도시,' 
         '이집트와의 경계에 있음.\n\n'
         
         '3. 베냐민 네타냐후 (Benjamin Netanyahu): 이스라엘의 전 총리.\n\n' 
         
         '4. 미국 (United States): 이스라엘의 주요 동맹국.\n\n'
         
         '5. 팔레스타인 (Palestine): 가자지구, 서안지구(웨스트뱅크)가'
         '팔레스타인 자치 정부의 통제하에 있음,' 
         '이스라엘과 갈등이 지속되고 있음.\n\n',
         
         ha='left', va='center', 
         transform=plt.gca().transAxes, fontsize=10, 
         fontproperties=font_manager.FontProperties(fname=font_path))



# 두 번째 워드 클라우드
plt.subplot(2, 1, 2)
plt.imshow(wordcloud2, interpolation='bilinear')

plt.title('Word Cloud 2 \n 가자지구, 라파, 베냐민, 네타냐후, 미국, 팔레스타인 제외\n', 
          fontproperties=font_manager.FontProperties(fname=font_path, size=20))

plt.axis('off')
plt.text(0, -0.3, 
         '1. 하마스 (Hamas): 가자지구를 통치하는 팔레스타인 무장 정파,'
         '이스라엘과의 무력 충돌의 주요 행위자 중 하나.\n\n'
         
         '2. 이란 (Iran): 팔레스타인(하마스) 지원 및 지지 의사 표명 \n\n'
         
         '3. 최남단 (Southernmost): 가자지구의 남쪽 경계는 이집트와 접함,' 
         '무기 밀수와 인도적 지원 경로.\n\n'
         
         '4. 이집트 (Egypt): 이스라엘과 팔레스타인 사이의 중재자 역할.\n\n'
         
         '5. 앤토니 블링컨 (Antony Blinken) 미국의 외교관 & 정치인,'
         '2021년 1월부터 조 바이든 대통령의 행정부에서 국무장관 역임 중.\n\n'
         
         '6. 요아브 갈란트 (Yoav Gallant): 이스라엘의 군사 및 정치 지도자 중 한 명.',
         
         ha='left', va='center', 
         transform=plt.gca().transAxes, fontsize=10, 
         fontproperties=font_manager.FontProperties(fname=font_path))


# 두 워드 클라우드 간격 조정
plt.subplots_adjust(hspace=1)

plt.show()

 

 

 

7 .  인 사 이 드 ( Insight )

Word Cloud 1 에서는 "가자지구", "라파", "팔레스타인", "네타냐후", "미국" 등,

Word Cloud 2 에서는 "하마스", "이란", "최남단", "블링컨", "이집트", "갈란트" 등의

키워드가  나왔다.

 

그러나 워드 클라우드를 생성하기 전에 이스라엘 전쟁이라는 주제에 대해 명확한 

가설을 설정하지 않았기 때문에,  목적성 있는 인사이트를 도출하는 데 어려움이 있었다.

그래서 가설을 임의로 정하여 진행해보았다.

 

가설: 이스라엘-팔레스타인 갈등에서 국제적 중재자의 역할은 중요하다.
Word Cloud 2 에서 나타난 "미국", "이란", "이집트"와 같은 키워드들은

이 가설을 검증하는 데 중요한 요소이다.

 

미국은 강력한 중재자 역할을 할 수 있지만, 이스라엘에 대해
편향적인 입장을 취하므로, 팔레스타인의 신뢰를 얻는 데 한계가 있다.

 

이란은 갈등을 심화시키는 요인으로, 평화 협상에서
중재자보다는 대립자의 역할을 하고 있다.

 

이집트는 오랜 기간 이스라엘과 팔레스타인 사이의 중재자 역할을 해왔으며,
라파 국경을 통해 인도적 지원을 조율하는 등 중요한 역할을 수행하고 있다.

 

결론적으로, 이스라엘-팔레스타인 갈등 해결에서 
국제적 중재자의 역할은 매우 중요하며,

각 국가의 입장과 역할이 평화 협상의 성패에 큰 영향을 미친다. 
중재자의 신뢰성, 중립성, 그리고 정치적 안정성
성공적인 중재의 핵심 요소로 작용한다.


 

728x90
반응형