NLP 실습 - (1) 데이터 수집 및 전처리

2023. 1. 29. 23:11Machine Learning

 이번 포스팅에서는 2020년 초반에 자연어처리를 공부하면서 실습했던 내용 중 데이터 수집과 정제 위주로 내용을 정리해보려고 합니다.

자연어 처리 실습을 위해 처음 정한 주제는 "신문사 분류" 였습니다. 데이터 수집과 성능 평가 관점에서 해당 주제를 선정하게 되었습니다. 네이버 뉴스의 경우 비교적 접근이 쉽고, 방대한 양의 데이터 수집이 가능하므로 학습에 활용하기 적절합니다. 그리고 자연어 처리에는 '요약', '번역', '문장 생성' 등 다양한 분야가 있지만 모델 구현을 연습하는 단계에서 성능 평가 기준이 명확해야하므로 '분류' 모델로 방향을 잡았습니다.


1. 데이터 크롤링

 1.1. 수집 데이터 정의

    데이터는 네이버뉴스를 크롤링을 통해 수집하였습니다. 이때, 뉴스 키워드는 '코로나'로 2020.02.15 ~ 2020.04.10(약 2개월) 기간의 지면기사를 수집하였습니다. 신문사 분류를 위해 그 당시 모두의 관심사였고, 중립적인 키워드라고 생각했던 코로나를 검색어로 데이터를 수집했습니다.

 

 1.2. 데이터 수집 단계

    (1) 코로나 관련 기사 검색을 위한 url을 확인

  • 네이버 뉴스 탭을 보면 검색 옵션을 설정할 수 있고, 그에 따라 url이 달라집니다.
  • (적용 전) https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%BD%94%EB%A1%9C%EB%82%98
    (적용 후) https://search.naver.com/search.naver?where=news&query=%EC%BD%94%EB%A1%9C%EB%82%98&sm=tab_opt&sort=0&photo=3&field=0&pd=3&ds=2020.02.15&de=2020.02.29&docid=&related=0&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so%3Ar%2Cp%3Afrom20200215to20200229&is_sug_officeid=0
  • 해당 url로 부터 관련 기사 목록을 가져올 수 있습니다.

(좌) 코로나 뉴스 검색 (우) 코로나 뉴스 검색 및 검색 옵션 지정

   

    (2) 각 기사의 주요 정보 추출 (기사 날짜, 신문사, 기사 제목, 기사 내용, url)

  • (1) 에서 조회한 기사 중 네이버뉴스에서 정보를 가져옵니다.
    기사 제목을 클릭하는 것이 아니라 네이버뉴스를 클릭해서 들어갈 경우 통일된 html 형식을 가지고 있어 반복적인 크롤링이 가능하기 때문입니다.

검색된 기사 예시

 

    (3) 데이터 확인

  • 각 기사에서 주요 정보들만 추출하여 아래와 같이 dataframe 형태로 저장한 것을 확인할 수 있습니다.

 

2. 데이터 정제

2.1 분석 주제 관련 데이터 정제

    기사의 내용 및 제목을 학습하여 신문사를 분류하는 것이 목적이었기 때문에, 기사 내용에서 신문사를 유추할 수 있는 내용은 정규식을 활용하여 제거하고, 기사 내용이 중복되는 경우에도 삭제하였습니다. 예를 들어, 신문사 이름, 이메일, 기자이름을 제거하였고, 기사 말미에 공통된 문구를 쓰는 경우가 있어 기사 내용에서 제거하였습니다.

 

2.2. 자연어 학습을 위한 데이터 전처리

  (1) 토큰화 (Tokenization)

  • 토큰화란 말뭉치(Corpus)를 토큰(Token)이라는 의미를 가지는 단위로 나누는 작업을 말합니다. 이때 토큰은 단어 혹은 문장 단위가 될 수 있습니다. 하지만 한국어에서는 의미 단위를 구분하기 위해 형태소를 고려해야합니다.
  • 형태소 단위의 토큰화를 위해서는 KoNLPy 패키지의 Okt, Mecab, Komoran, Hannanum, Kkma 와 같은 형태소 분석기를 활용할 수 있습니다. 이 중 Mecab이 속도가 빠른 장점이 있어 주로 활용된다고 합니다.
  • Mecab의 사용법은 아래와 같이 설치후 간단하게 사용할 수 있으며, 다른 형태소 분석기도 유사한 방식으로 사용할 수 있습니다.
# Install
! git clone https://github.com/SOMJANG/Mecab-ko-for-Google-Colab.git
! bash Mecab-ko-for-Google-Colab/install_mecab-ko_on_colab190912.sh 

# Import
from konlpy.tag import Mecab

# Tokenization
tokenizer = Mecab()
morphs = tokenizer.morphs(text)

 

  (2) 불용어(Stopword) 처리

  • 문단/문장을 토큰화한 뒤 유의하지 않은 토큰들을 제거하는 작업이 필요합니다. 조사, 접미사와 같이 자주 등장하지만 의미가 없는 토큰들을 불용어라 부르고 학습 전 제거해줍니다.
  • 불용어 처리를 위해 다른 사용자가 정의해 놓은 불용어 사전을 활용하거나, 직접 정리한 불용어 사전을 사용하는 방법이 있습니다.
import pandas as np

stopwords = pd.read_csv("한국어_불용어사전.csv", names=["형태"])
morphs_ex = [m for m in morphs if m not in stopwords["형태"].values]

 여기까지 자연어처리 실습을 위해 데이터 수집 및 데이터 전처리 과정에 대해 간단히 정리해보았습니다. 다음 포스팅에서는 BeRT 모델을 활용한 신문기사 학습 및 신문사 분류 모델을 만드는 과정에 대해 정리해보겠습니다. 세부적인 코드나 자세한 설명이 필요하시면 댓글로 남겨주세요:-)