TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 데이터 분석>

[파이썬] 자연어 처리 (NLP) - 네이버 뉴스 텍스트 분석

by 기록자_Recordian 2024. 5. 16.
728x90
반응형
분석 내용(목표)

 
<파이썬으로 데이터 주무르기>를 통해 익혔던 텍스트 분석 방법을 활용하여
네이버 뉴스에서 '파이썬' 이라는 키워드로 기사를 검색해서 빈도수를 분석하고,
워드 클라우드를 생성, gensim 으로 유사도 파악 모델까지 만들어보는 것을 목표로 한다.


텍스트 분석에 필요한 기본 세팅(모듈, 라이브러리 설치)

 
여태까지 하던 노트북이 아닌, 새로운 컴퓨터에서 분석을 시작하므로
텍스트 분석 및 기타 파이썬 기능을 활용하기 위한 모듈과 라이브러리 등을 설치하는 작업이 필요하다.
 
1) cmd (윈도우 키 + R) 실행하여 pip install konlpy 로 KoNPLy 모듈 설치

konply 설치

 
2) JVM Jdk 다운로드
https://jdk.java.net/22/
https://blog.naver.com/devscb/223042574277
다운로드 한 후, [고급 시스템 환경 설정] - [환경변수]에서 설정

Windows:
시작 메뉴에서 "환경 변수"를 검색하여 "시스템 환경 변수 편집"을 엽니다.
"환경 변수" 버튼을 클릭합니다.
"시스템 변수"에서 "새로 만들기"를 클릭하고 변수 이름에 JAVA_HOME, 변수 값에 JDK 설치 경로(예: C:\Program Files\Java\jdk-11)를 입력합니다.
"Path" 변수 선택 후 "편집"을 클릭하고 ;%JAVA_HOME%\bin을 추가합니다.

 
※  변수가 제대로 설정되지 않으면 워드클라우드 생성 시 하단의 오류가 나면서 제대로 수행이 되지 않는다.

JVMNotFoundException: No JVM shared library file (jvm.dll) found. Try setting up the JAVA_HOME environment variable properly.

 
 
3) 아나콘다에서 JPype1 설치: JPype1은 Java Virtual Machine 과의 통합을 통해 Java 라이브러리에서 Python을 직접 호출할 수 있도록 해줌

 
4) cmd에서 pip install nltk 명령으로 nltk 설치

 
5) 터미널에서 python 입력 후, nltk에서 stopwards와 punkt 다운로드
※ 파이썬이 없을 경우, https://www.python.org/downloads/ 에서 다운로드
cmd에서 파이썬이 실행되지 않는 경우에는 [내컴퓨터]-[속성]-[고급 시스템 설정]-[환경변수]-[사용자 변수] 의 Path 에 파이썬 exe 폴더 경로를 추가해주어야 한다.

 
6) 워드 클라우드 설치
cmd에서 exit() 명령 입력하여 파이썬 모드를 종료한 후,
pip install wordcloud 명령으로 워드 클라우드 설치

7) gensim 설치
cmd에서 pip install gensim
※ gensim은 파이썬에서 토픽 모델링 및 자연어 처리를 위한 라이브러리

 


주피터노트북(Jupyter notebook)에 접속하여 블로그 크롤링하기

 
1) 아나콘다 프롬프트에서 jupyter notebook을 입력하여 파이썬에 접속한 후,
오른쪽 상단에 NEW - Notebook을 누르면 파이썬 코드를 입력할 수 있는 창이 생성된다.

2) 모듈 설치 하기(워드 클라우드, requests, BeautifulSoup, matplotlib, konlpy)

pip install wordcloud requests beautifulsoup4 matplotlib konlpy

<각 모듈 설명 with Chat GPT>


requests
requests는 Python의 HTTP 라이브러리로, 웹 페이지의 데이터를 가져올 때 사용됩니다. 간단하고 직관적인 API를 제공하여 GET, POST 등의 HTTP 요청을 쉽게 보낼 수 있습니다.

BeautifulSoup
BeautifulSoup은 HTML과 XML 파일을 파싱하는 라이브러리로, 웹 스크래핑에 자주 사용됩니다. 웹 페이지의 특정 요소를 선택하고 데이터를 추출할 수 있게 도와줍니다.

matplotlib
matplotlib은 데이터 시각화를 위한 라이브러리로, 그래프와 차트를 그릴 때 사용됩니다. 다양한 형태의 플롯을 생성할 수 있으며, 데이터 분석 결과를 시각적으로 표현할 수 있습니다.

konlpy
konlpy는 한국어 자연어 처리를 위한 라이브러리로, 형태소 분석기와 같은 도구들을 제공하여 텍스트 데이터의 언어적 특성을 분석할 수 있습니다. 예를 들어, 명사, 동사 등의 품사를 분류하는 작업을 할 수 있습니다.

 
3) 설치한 모듈 import + 기타 모듈 import

from tqdm import tqdm_notebook
import urllib.request
import time
import requests

from bs4 import BeautifulSoup
from wordcloud import WordCloud

from konlpy.tag import Okt

import numpy as np
import pandas as pd

import platform
import matplotlib.pyplot as plt

%matplotlib inline

# wordcloud 라이브러리에서 WordCloud 클래스와 STOPWORDS 세트가져오기
from wordcloud import WordCloud, STOPWORDS

# Python 이미징 라이브러리(PIL) 가져오기
from PIL import Image

#한글 폰트 문제 해결
path = "c:/Windows/Fonts/malgun.ttf"

from matplotlib import font_manager, rc
if platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Sorry')

# 마이너스 기호가 깨지는 문제를 해결
plt.rcParams['axes.unicode_minus'] = False

# 웹 스크래핑을 위한 BeautifulSoup와 urllib을 import 
from bs4 import BeautifulSoup
from urllib.request import urlopen
import urllib
import time

# 상태 진행 바 설치
!pip show ipywidgets
!pip install ipywidgets --upgrade

 
4) 네이버 뉴스 내용을 크롤링할 코드 입력 (python_article_text 변수에 저장)

# 검색할 질의어 설정
query = "파이썬"

# 검색 결과 페이지 URL
url = f"https://search.naver.com/search.naver?ssc=tab.news.all&where=news&sm=tab_jum&query={query}"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

# 파이썬 기사에 대한 후보 텍스트를 저장할 리스트를 초기화.
python_article_text = []  

start_num = 0  # 변수 초기화

# 범위 내에서 페이지를 반복하여 검색 결과를 가져오는 반복문.
for n in tqdm_notebook(range(1, 100, 10)):
    # 현재 페이지 URL
    page_url = f"{url}&start={start_num}"
    
    # HTTP GET 요청 보내고 응답 받기
    response = requests.get(page_url)
    
    # BeautifulSoup을 사용하여 HTML을 파싱.
    soup = BeautifulSoup(response.text, "html.parser")
  
    # HTML에서 모든 <div> 태그를 찾아서 가져옴.
    tmp = soup.find_all('div')
    
    # 각 태그에서 텍스트를 추출하여 python_article__text 리스트에 추가.
    for line in tmp:
        python_article_text.append(line.text)
    
    # 서버에 부담을 주지 않기 위해 0.5초의 간격을 두고 잠시 대기.
    time.sleep(0.5)

내용이 잘 저장된 것을 볼 수 있다


형태소 분석 및 토큰화

 
1) 먼저 nltk 모듈을 import 하고 okt 클래스도 불러온다

import nltk
from konlpy.tag import Okt; o = Okt()

 
2) 크롤링해서 저장한 python_article_text 리스트의 내용들을 줄 바꿈을 추가하여 새로운 텍스트로 나눈다.

# python_article_text 리스트에서 처음 100개의 요소를 가져와서 하나의 문자열인 python_text에 추가

#python_text 변수를 빈 문자열('')로 초기화
python_text = ''

# for 루프를 사용하여 python_article_text의 각 요소를 순회
for each_line in python_article_text[:100]: # python_article_text 리스트의 처음 100개의 요소를 가져옴

# 각 요소를 python_text 문자열에 추가(줄바꿈 문자('\n')를 추가하여 한 줄씩 새로운 텍스트로 구분)
    python_text = python_text + each_line + '\n'

 
3)  토큰화

tokens_ko = o.morphs(python_text)
tokens_ko

 
총 단어수와 중복을 제외한 단어수를 조회해보면

ko = nltk.Text(tokens_ko, name='파이썬')
print(len(ko.tokens))
print(len(set(ko.tokens)))

4) 빈도수 확인
그리고 자연어 처리 (NLP)를 사용하여 텍스트 데이터에서 가장 자주 등장하는 단어들을 추출해보면

ko = nltk.Text(tokens_ko, name='파이썬')
ko.vocab().most_common(100)

보면 의미 없는 단어들이 좀 있다.

 


불용어 처리 후 빈도수 그래프 그리기

 
1) 앞서 빈도수 조회를 토대로 의미 없는 단어들을 찾아낸 뒤, 불용어 처리를 해준다.

# 불용어처리(여러 번 수행)
stop_words = [',', '을', '은', '는', '이', '가', 'keep', '(', '으로', '...',
              '하기', '의', '를', '된', '컨', '조', '순', '도', '바로가기',
              '자세히', '/', '한', '해', '・', '', '△', '·', '3', '개월', '로',
              '된다면', '주세요', '지', '에서', '등', '40', '1', '와', '끄기',
             '.','에','언론사',')','보기','닫기','도움말','전체','선택','keep',"'", 
             '과','펼치기','접기','화','인','-','언','하','1시간','"', ]

#용어가 제거된 텍스트를 기반으로 nltk 라이브러리의 Text 객체를 생성
tokens_ko = [each_word for each_word in tokens_ko if each_word not in stop_words]

ko = nltk.Text(tokens_ko, name='파이썬')
ko.vocab().most_common(50)

 
2) 그후 빈도수 그래프를 그려보면


워드 클라우드 그리기

 
빈도수가 높은 단어 300개를 가지고 워드 클라우드를 생성한다.

# 데이터 준비
data = ko.vocab().most_common(300)

# 워드클라우드 객체 생성 (폰트 지정)
wordcloud = WordCloud(font_path="c:/Windows/Fonts/malgun.ttf",
                      relative_scaling=0.5,  # 상대적인 크기 조정값 설정
                      background_color='white',  # 배경은 흰색
                      width=800, height=400  # 이미지의 가로와 세로 크기 설정
                      )

# 텍스트 생성
text = "\n".join([f"{word}: {freq}" for word, freq in data])

# 워드클라우드 생성
wordcloud.generate(text)

# 이미지 출력
plt.figure(figsize=(16, 8))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()

 

당연히 파이썬이 가장 크다. (불용어 처리가 제대로 되지 않은 단어들도 있다)

 


유사도 파악하기

 
먼저 word2vec 라이브러리를 임포트하고

from gensim.models import word2vec

조사나 어미 등을 제거하는 과정을 거치고

okt = Okt()
results = []
lines = python_article_text

for line in lines:
    malist = okt.pos(line, norm=True, stem=True)
    r = []

    for word in malist:
        if not word[1] in ["Josa", "Eomi", "Punctuation"]:
            r.append(word[0])

    r1 = (" ".join(r)).strip()
    results.append(r1)
    print(r1)

 
이렇게 만들어진 데이터를 저장.

data_file = 'py_article.data'
with open(data_file, 'w', encoding='utf-8') as fp:
    fp.write("\n".join(results))
# Word2Vec 임포트
from gensim.models import Word2Vec

# 파일 경로
data_file = 'py_article.data'

# 문장 단위로 읽어들이기
sentences = word2vec.LineSentence(data_file)

# 모델 학습
model = Word2Vec(sentences, vector_size=100, window=5, min_count=5, workers=4)

# 학습된 모델 저장
model.save('py_article.model')

 
그리고 모델을 불러와서

model = word2vec.Word2Vec.load('py_article.model')

 
'파이썬'과 유사한 단어를 추출하면

model.wv.most_similar(positive=['파이썬'])

 

독학, 연산자, 자격증, 리스트 등이 나타난다.
 
그 외에도 다른 단어 & 단어들의 조합으로 유사도가 높은 단어들을 조회해본다.

 
마지막으로, 연산자 라는 단어에서 책을 뺀 결과도 확인해본다.

model.wv.most_similar(positive=['연산자'], negative=['책'])


※ 애플로고를 이용해서 워드클라우드 만드는 것은 실패했는데, 혹시 아시는 분 있으면
소스코드와 이미지 올려놓을테니 도움 부탁 드립니다!

Python_News_NLP.ipynb
2.24MB
apple.png
0.04MB

 

 

▶ 성공한 결과물 확인

 

[파이썬] 자연어 처리 (NLP) - 네이버 뉴스 텍스트 분석(2)

이전 내용  [파이썬] 자연어 처리 (NLP) - 네이버 뉴스 텍스트 분석분석 내용(목표) 를 통해 익혔던 텍스트 분석 방법을 활용하여네이버 뉴스에서 '파이썬' 이라는 키워드로 기사를 검색해서 빈

puppy-foot-it.tistory.com

 

728x90
반응형