워드 클라우드(Wordcloud)
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 에서 나타난 "미국", "이란", "이집트"와 같은 키워드들은
이 가설을 검증하는 데 중요한 요소이다.
미국은 강력한 중재자 역할을 할 수 있지만, 이스라엘에 대해
편향적인 입장을 취하므로, 팔레스타인의 신뢰를 얻는 데 한계가 있다.
이란은 갈등을 심화시키는 요인으로, 평화 협상에서
중재자보다는 대립자의 역할을 하고 있다.
이집트는 오랜 기간 이스라엘과 팔레스타인 사이의 중재자 역할을 해왔으며,
라파 국경을 통해 인도적 지원을 조율하는 등 중요한 역할을 수행하고 있다.
결론적으로, 이스라엘-팔레스타인 갈등 해결에서
국제적 중재자의 역할은 매우 중요하며,
각 국가의 입장과 역할이 평화 협상의 성패에 큰 영향을 미친다.
중재자의 신뢰성, 중립성, 그리고 정치적 안정성이
성공적인 중재의 핵심 요소로 작용한다.