🚴‍♂️
TIL
  • MAIN
  • : TIL?
  • : WIL
  • : Plan
  • : Retrospective
    • 21Y
      • Wait a moment!
      • 9M 2W
      • 9M1W
      • 8M4W
      • 8M3W
      • 8M2W
      • 8M1W
      • 7M4W
      • 7M3W
      • 7M2W
      • 7M1W
      • 6M5W
      • 1H
    • 새사람 되기 프로젝트
      • 2회차
      • 1회차
  • TIL : ML
    • Paper Analysis
      • BERT
      • Transformer
    • Boostcamp 2st
      • [S]Data Viz
        • (4-3) Seaborn 심화
        • (4-2) Seaborn 기초
        • (4-1) Seaborn 소개
        • (3-4) More Tips
        • (3-3) Facet 사용하기
        • (3-2) Color 사용하기
        • (3-1) Text 사용하기
        • (2-3) Scatter Plot 사용하기
        • (2-2) Line Plot 사용하기
        • (2-1) Bar Plot 사용하기
        • (1-3) Python과 Matplotlib
        • (1-2) 시각화의 요소
        • (1-1) Welcome to Visualization (OT)
      • [P]MRC
        • (2강) Extraction-based MRC
        • (1강) MRC Intro & Python Basics
      • [P]KLUE
        • (5강) BERT 기반 단일 문장 분류 모델 학습
        • (4강) 한국어 BERT 언어 모델 학습
        • [NLP] 문장 내 개체간 관계 추출
        • (3강) BERT 언어모델 소개
        • (2강) 자연어의 전처리
        • (1강) 인공지능과 자연어 처리
      • [U]Stage-CV
      • [U]Stage-NLP
        • 7W Retrospective
        • (10강) Advanced Self-supervised Pre-training Models
        • (09강) Self-supervised Pre-training Models
        • (08강) Transformer (2)
        • (07강) Transformer (1)
        • 6W Retrospective
        • (06강) Beam Search and BLEU score
        • (05강) Sequence to Sequence with Attention
        • (04강) LSTM and GRU
        • (03강) Recurrent Neural Network and Language Modeling
        • (02강) Word Embedding
        • (01강) Intro to NLP, Bag-of-Words
        • [필수 과제 4] Preprocessing for NMT Model
        • [필수 과제 3] Subword-level Language Model
        • [필수 과제2] RNN-based Language Model
        • [선택 과제] BERT Fine-tuning with transformers
        • [필수 과제] Data Preprocessing
      • Mask Wear Image Classification
        • 5W Retrospective
        • Report_Level1_6
        • Performance | Review
        • DAY 11 : HardVoting | MultiLabelClassification
        • DAY 10 : Cutmix
        • DAY 9 : Loss Function
        • DAY 8 : Baseline
        • DAY 7 : Class Imbalance | Stratification
        • DAY 6 : Error Fix
        • DAY 5 : Facenet | Save
        • DAY 4 : VIT | F1_Loss | LrScheduler
        • DAY 3 : DataSet/Lodaer | EfficientNet
        • DAY 2 : Labeling
        • DAY 1 : EDA
        • 2_EDA Analysis
      • [P]Stage-1
        • 4W Retrospective
        • (10강) Experiment Toolkits & Tips
        • (9강) Ensemble
        • (8강) Training & Inference 2
        • (7강) Training & Inference 1
        • (6강) Model 2
        • (5강) Model 1
        • (4강) Data Generation
        • (3강) Dataset
        • (2강) Image Classification & EDA
        • (1강) Competition with AI Stages!
      • [U]Stage-3
        • 3W Retrospective
        • PyTorch
          • (10강) PyTorch Troubleshooting
          • (09강) Hyperparameter Tuning
          • (08강) Multi-GPU 학습
          • (07강) Monitoring tools for PyTorch
          • (06강) 모델 불러오기
          • (05강) Dataset & Dataloader
          • (04강) AutoGrad & Optimizer
          • (03강) PyTorch 프로젝트 구조 이해하기
          • (02강) PyTorch Basics
          • (01강) Introduction to PyTorch
      • [U]Stage-2
        • 2W Retrospective
        • DL Basic
          • (10강) Generative Models 2
          • (09강) Generative Models 1
          • (08강) Sequential Models - Transformer
          • (07강) Sequential Models - RNN
          • (06강) Computer Vision Applications
          • (05강) Modern CNN - 1x1 convolution의 중요성
          • (04강) Convolution은 무엇인가?
          • (03강) Optimization
          • (02강) 뉴럴 네트워크 - MLP (Multi-Layer Perceptron)
          • (01강) 딥러닝 기본 용어 설명 - Historical Review
        • Assignment
          • [필수 과제] Multi-headed Attention Assignment
          • [필수 과제] LSTM Assignment
          • [필수 과제] CNN Assignment
          • [필수 과제] Optimization Assignment
          • [필수 과제] MLP Assignment
      • [U]Stage-1
        • 1W Retrospective
        • AI Math
          • (AI Math 10강) RNN 첫걸음
          • (AI Math 9강) CNN 첫걸음
          • (AI Math 8강) 베이즈 통계학 맛보기
          • (AI Math 7강) 통계학 맛보기
          • (AI Math 6강) 확률론 맛보기
          • (AI Math 5강) 딥러닝 학습방법 이해하기
          • (AI Math 4강) 경사하강법 - 매운맛
          • (AI Math 3강) 경사하강법 - 순한맛
          • (AI Math 2강) 행렬이 뭐예요?
          • (AI Math 1강) 벡터가 뭐예요?
        • Python
          • (Python 7-2강) pandas II
          • (Python 7-1강) pandas I
          • (Python 6강) numpy
          • (Python 5-2강) Python data handling
          • (Python 5-1강) File / Exception / Log Handling
          • (Python 4-2강) Module and Project
          • (Python 4-1강) Python Object Oriented Programming
          • (Python 3-2강) Pythonic code
          • (Python 3-1강) Python Data Structure
          • (Python 2-4강) String and advanced function concept
          • (Python 2-3강) Conditionals and Loops
          • (Python 2-2강) Function and Console I/O
          • (Python 2-1강) Variables
          • (Python 1-3강) 파이썬 코딩 환경
          • (Python 1-2강) 파이썬 개요
          • (Python 1-1강) Basic computer class for newbies
        • Assignment
          • [선택 과제 3] Maximum Likelihood Estimate
          • [선택 과제 2] Backpropagation
          • [선택 과제 1] Gradient Descent
          • [필수 과제 5] Morsecode
          • [필수 과제 4] Baseball
          • [필수 과제 3] Text Processing 2
          • [필수 과제 2] Text Processing 1
          • [필수 과제 1] Basic Math
    • 딥러닝 CNN 완벽 가이드 - Fundamental 편
      • 종합 실습 2 - 캐글 Plant Pathology(나무잎 병 진단) 경연 대회
      • 종합 실습 1 - 120종의 Dog Breed Identification 모델 최적화
      • 사전 훈련 모델의 미세 조정 학습과 다양한 Learning Rate Scheduler의 적용
      • Advanced CNN 모델 파헤치기 - ResNet 상세와 EfficientNet 개요
      • Advanced CNN 모델 파헤치기 - AlexNet, VGGNet, GoogLeNet
      • Albumentation을 이용한 Augmentation기법과 Keras Sequence 활용하기
      • 사전 훈련 CNN 모델의 활용과 Keras Generator 메커니즘 이해
      • 데이터 증강의 이해 - Keras ImageDataGenerator 활용
      • CNN 모델 구현 및 성능 향상 기본 기법 적용하기
    • AI School 1st
    • 현업 실무자에게 배우는 Kaggle 머신러닝 입문
    • 파이썬 딥러닝 파이토치
  • TIL : Python & Math
    • Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
      • Relations - 다대다 관계
      • Relations - 다대일 관계
      • 템플릿 파일 모듈화 하기
      • TDD (Test Driven Development)
      • template tags & 조건문
      • 정적 파일(static files) & 미디어 파일(media files)
      • FBV (Function Based View)와 CBV (Class Based View)
      • Django 입문하기
      • 부트스트랩
      • 프론트엔드 기초다지기 (HTML, CSS, JS)
      • 들어가기 + 환경설정
    • Algorithm
      • Programmers
        • Level1
          • 소수 만들기
          • 숫자 문자열과 영단어
          • 자연수 뒤집어 배열로 만들기
          • 정수 내림차순으로 배치하기
          • 정수 제곱근 판별
          • 제일 작은 수 제거하기
          • 직사각형 별찍기
          • 짝수와 홀수
          • 체육복
          • 최대공약수와 최소공배수
          • 콜라츠 추측
          • 크레인 인형뽑기 게임
          • 키패드 누르기
          • 평균 구하기
          • 폰켓몬
          • 하샤드 수
          • 핸드폰 번호 가리기
          • 행렬의 덧셈
        • Level2
          • 숫자의 표현
          • 순위 검색
          • 수식 최대화
          • 소수 찾기
          • 소수 만들기
          • 삼각 달팽이
          • 문자열 압축
          • 메뉴 리뉴얼
          • 더 맵게
          • 땅따먹기
          • 멀쩡한 사각형
          • 괄호 회전하기
          • 괄호 변환
          • 구명보트
          • 기능 개발
          • 뉴스 클러스터링
          • 다리를 지나는 트럭
          • 다음 큰 숫자
          • 게임 맵 최단거리
          • 거리두기 확인하기
          • 가장 큰 정사각형 찾기
          • H-Index
          • JadenCase 문자열 만들기
          • N개의 최소공배수
          • N진수 게임
          • 가장 큰 수
          • 124 나라의 숫자
          • 2개 이하로 다른 비트
          • [3차] 파일명 정렬
          • [3차] 압축
          • 줄 서는 방법
          • [3차] 방금 그곡
          • 거리두기 확인하기
        • Level3
          • 매칭 점수
          • 외벽 점검
          • 기지국 설치
          • 숫자 게임
          • 110 옮기기
          • 광고 제거
          • 길 찾기 게임
          • 셔틀버스
          • 단속카메라
          • 표 편집
          • N-Queen
          • 징검다리 건너기
          • 최고의 집합
          • 합승 택시 요금
          • 거스름돈
          • 하노이의 탑
          • 멀리 뛰기
          • 모두 0으로 만들기
        • Level4
    • Head First Python
    • 데이터 분석을 위한 SQL
    • 단 두 장의 문서로 데이터 분석과 시각화 뽀개기
    • Linear Algebra(Khan Academy)
    • 인공지능을 위한 선형대수
    • Statistics110
  • TIL : etc
    • [따배런] Kubernetes
    • [따배런] Docker
      • 2. 도커 설치 실습 1 - 학습편(준비물/실습 유형 소개)
      • 1. 컨테이너와 도커의 이해 - 컨테이너를 쓰는이유 / 일반프로그램과 컨테이너프로그램의 차이점
      • 0. 드디어 찾아온 Docker 강의! 왕초보에서 도커 마스터로 - OT
    • CoinTrading
      • [가상 화폐 자동 매매 프로그램] 백테스팅 : 간단한 테스팅
    • Gatsby
      • 01 깃북 포기 선언
  • TIL : Project
    • Mask Wear Image Classification
    • Project. GARIGO
  • 2021 TIL
    • CHANGED
    • JUN
      • 30 Wed
      • 29 Tue
      • 28 Mon
      • 27 Sun
      • 26 Sat
      • 25 Fri
      • 24 Thu
      • 23 Wed
      • 22 Tue
      • 21 Mon
      • 20 Sun
      • 19 Sat
      • 18 Fri
      • 17 Thu
      • 16 Wed
      • 15 Tue
      • 14 Mon
      • 13 Sun
      • 12 Sat
      • 11 Fri
      • 10 Thu
      • 9 Wed
      • 8 Tue
      • 7 Mon
      • 6 Sun
      • 5 Sat
      • 4 Fri
      • 3 Thu
      • 2 Wed
      • 1 Tue
    • MAY
      • 31 Mon
      • 30 Sun
      • 29 Sat
      • 28 Fri
      • 27 Thu
      • 26 Wed
      • 25 Tue
      • 24 Mon
      • 23 Sun
      • 22 Sat
      • 21 Fri
      • 20 Thu
      • 19 Wed
      • 18 Tue
      • 17 Mon
      • 16 Sun
      • 15 Sat
      • 14 Fri
      • 13 Thu
      • 12 Wed
      • 11 Tue
      • 10 Mon
      • 9 Sun
      • 8 Sat
      • 7 Fri
      • 6 Thu
      • 5 Wed
      • 4 Tue
      • 3 Mon
      • 2 Sun
      • 1 Sat
    • APR
      • 30 Fri
      • 29 Thu
      • 28 Wed
      • 27 Tue
      • 26 Mon
      • 25 Sun
      • 24 Sat
      • 23 Fri
      • 22 Thu
      • 21 Wed
      • 20 Tue
      • 19 Mon
      • 18 Sun
      • 17 Sat
      • 16 Fri
      • 15 Thu
      • 14 Wed
      • 13 Tue
      • 12 Mon
      • 11 Sun
      • 10 Sat
      • 9 Fri
      • 8 Thu
      • 7 Wed
      • 6 Tue
      • 5 Mon
      • 4 Sun
      • 3 Sat
      • 2 Fri
      • 1 Thu
    • MAR
      • 31 Wed
      • 30 Tue
      • 29 Mon
      • 28 Sun
      • 27 Sat
      • 26 Fri
      • 25 Thu
      • 24 Wed
      • 23 Tue
      • 22 Mon
      • 21 Sun
      • 20 Sat
      • 19 Fri
      • 18 Thu
      • 17 Wed
      • 16 Tue
      • 15 Mon
      • 14 Sun
      • 13 Sat
      • 12 Fri
      • 11 Thu
      • 10 Wed
      • 9 Tue
      • 8 Mon
      • 7 Sun
      • 6 Sat
      • 5 Fri
      • 4 Thu
      • 3 Wed
      • 2 Tue
      • 1 Mon
    • FEB
      • 28 Sun
      • 27 Sat
      • 26 Fri
      • 25 Thu
      • 24 Wed
      • 23 Tue
      • 22 Mon
      • 21 Sun
      • 20 Sat
      • 19 Fri
      • 18 Thu
      • 17 Wed
      • 16 Tue
      • 15 Mon
      • 14 Sun
      • 13 Sat
      • 12 Fri
      • 11 Thu
      • 10 Wed
      • 9 Tue
      • 8 Mon
      • 7 Sun
      • 6 Sat
      • 5 Fri
      • 4 Thu
      • 3 Wed
      • 2 Tue
      • 1 Mon
    • JAN
      • 31 Sun
      • 30 Sat
      • 29 Fri
      • 28 Thu
      • 27 Wed
      • 26 Tue
      • 25 Mon
      • 24 Sun
      • 23 Sat
      • 22 Fri
      • 21 Thu
      • 20 Wed
      • 19 Tue
      • 18 Mon
      • 17 Sun
      • 16 Sat
      • 15 Fri
      • 14 Thu
      • 13 Wed
      • 12 Tue
      • 11 Mon
      • 10 Sun
      • 9 Sat
      • 8 Fri
      • 7 Thu
      • 6 Wed
      • 5 Tue
      • 4 Mon
      • 3 Sun
      • 2 Sat
      • 1 Fri
  • 2020 TIL
    • DEC
      • 31 Thu
      • 30 Wed
      • 29 Tue
      • 28 Mon
      • 27 Sun
      • 26 Sat
      • 25 Fri
      • 24 Thu
      • 23 Wed
      • 22 Tue
      • 21 Mon
      • 20 Sun
      • 19 Sat
      • 18 Fri
      • 17 Thu
      • 16 Wed
      • 15 Tue
      • 14 Mon
      • 13 Sun
      • 12 Sat
      • 11 Fri
      • 10 Thu
      • 9 Wed
      • 8 Tue
      • 7 Mon
      • 6 Sun
      • 5 Sat
      • 4 Fri
      • 3 Tue
      • 2 Wed
      • 1 Tue
    • NOV
      • 30 Mon
Powered by GitBook
On this page
  • 1. 자연어 전처리
  • 1.1 자연어처리의 단계
  • 1.2 Python string 관련 함수
  • 2. 한국어 토큰화
  • 2.1 한국어 토큰화
  • 실습
  • 전처리를 위한 코퍼스 수집
  • 문장 분리
  • Normalizing

Was this helpful?

  1. TIL : ML
  2. Boostcamp 2st
  3. [P]KLUE

(2강) 자연어의 전처리

Previous(3강) BERT 언어모델 소개Next(1강) 인공지능과 자연어 처리

Last updated 3 years ago

Was this helpful?

1. 자연어 전처리

전처리

  • 원시 데이터(rawdata)를 기계 학습 모델이 학습하는데 적합하게 만드는 프로세스

  • 학습에 사용될 데이터를 수집&가공하는 모든 프로세스

전처리가 필요한 이유

Task의 성능을 가장 확실하게 올릴 수 있는 방법! 모델을 아무리 바꾸고, 튜닝하더라도, 데이터 자체가 문제가 있다면 성능이 나올 수 없다. 가장 중요한 것은 데이터이다.

1.1 자연어처리의 단계

1.2 Python string 관련 함수

2. 한국어 토큰화

자연어를 어떤 단위로 관찰할 것인지

2.1 한국어 토큰화

토큰화(Tokenizing)

  • 주어진 데이터를 토큰(Token)이라 불리는 단위로 나누는 작업

  • 토큰이 되는 기준은 다를 수 있음(어절,단어,형태소,음절,자소 등)

문장 토큰화(SentenceTokenizing)

  • 문장 분리

단어 토큰화(WordTokenizing)

  • 구두점 분리,단어 분리 “Hello, World!”->“Hello”,“,”,“World”,“!”

실습

전처리를 위한 코퍼스 수집

!pip install newspaper3k
  • newspaper3k는 url을 입력하면 뉴스기사의 제목과 컨텐츠를 자동으로 분류해서 크롤링 할 수 있다.

import newspaper
newspaper.languages()

Your available languages are:

input code		full name
  id			  Indonesian
  ko			  Korean
  ja			  Japanese
  zh			  Chinese
  it			  Italian
  ar			  Arabic
  fi			  Finnish
  vi			  Vietnamese
  nb			  Norwegian (Bokmål)
  sl			  Slovenian
  sr			  Serbian
  no			  Norwegian
  sv			  Swedish
  he			  Hebrew
  mk			  Macedonian
  et			  Estonian
  nl			  Dutch
  pl			  Polish
  hi			  Hindi
  uk			  Ukrainian
  ro			  Romanian
  ru			  Russian
  fr			  French
  fa			  Persian
  tr			  Turkish
  hu			  Hungarian
  hr			  Croatian
  bg			  Bulgarian
  el			  Greek
  sw			  Swahili
  de			  German
  es			  Spanish
  be			  Belarusian
  da			  Danish
  pt			  Portuguese
  en			  English
  • 한국어를 제공하는 것을 알 수 있다.

뉴스기사는 재배포 역시 저작권에 위배되기 때문에 매우 주의해야한다. 그래서 보통 실습에서는 저작권에서 비교적 자유로운 위키트리 뉴스 데이터를 사용한다.

from newspaper import Article

news_url = "https://www.wikitree.co.kr/articles/252931"

article = Article(news_url, language='ko')
article.download()
article.parse()
print('title:', article.title)
print('context:', article.text)
title: 알파고에 첫승 거두고 미소짓는 이세돌 사진
context: 이하 뉴스1&인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단

이하 뉴스1

인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단의 사진이 화제다.

13일 서울 광화문 포시즌스 호텔에서 열린 '구글 딥마인드 챌린지 매치'에서 이세돌 9단은 알파고와의 제4국에서 승리했다. 이날 대국장을 빠져나가는 이세돌 9단의 모습이 사진에 포착됐다.

이세돌 9단은 상의 주머니에 양손을 넣고 옅은 미소를 지었다. 이 사진은 SNS에서 화제를 모았다.

오늘 알파고에게 승리하고 대국장 빠져나가는 이세돌이라는데ㅋㅋㅋㅋㅋㅋㅋ 포토제닉ㅋㅋㅋㅋㅋㅋㅋ 이대로 헐리웃 영화 만들어지고 포스터 소취요 pic.twitter.com/4IRFJu18hx — 조드윅 앓는 서린 (@katharine_stark) 2016년 3월 13일

대국을 마친 뒤, 이세돌 9단은 "한판 이겼는데 이렇게까지 축하를 받아보는 것은 처음"이라고 말했다. 이세돌 9단은 기자회견장에도 함박 웃음을 감추지 못했다.

추가적인 전처리 실습을 위해 뉴스에서 많이 포함되는 예제 텍스트를 추가한다.

context = article.text.split('\n')
context.append("<h1>여기에 태그가 있네요!</h1> <h3>이곳에도 태그가 있구요</h3> html은 <b>태그</b>로 이루어진 문서입니다. 텍스트를 <b>진하게</b> 만들 수도 있고, <u>밑줄</u>을 칠 수도 있습니다. ‘<br>이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…<br>‘")
context.append("(서울=위키트리) 김성현 기자 (seonghkim@smilegate.com) <저작권자(c) 무단전재-재배포 금지> ‘<br>이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…<br>‘")
context.append("(사진=위키트리, 무단 전재-재배포 금지) ‘<br>이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…<br>‘")
context.append("#이세돌 #알파고 #인공지능 #딥러닝 #바둑")
for i, sent in enumerate(context):
    print(i, sent)
0 이하 뉴스1&인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단
1 
2 이하 뉴스1
3 
4 인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단의 사진이 화제다.
5 
6 13일 서울 광화문 포시즌스 호텔에서 열린 '구글 딥마인드 챌린지 매치'에서 이세돌 9단은 알파고와의 제4국에서 승리했다. 이날 대국장을 빠져나가는 이세돌 9단의 모습이 사진에 포착됐다.
7 
8 이세돌 9단은 상의 주머니에 양손을 넣고 옅은 미소를 지었다. 이 사진은 SNS에서 화제를 모았다.
9 
10 오늘 알파고에게 승리하고 대국장 빠져나가는 이세돌이라는데ㅋㅋㅋㅋㅋㅋㅋ 포토제닉ㅋㅋㅋㅋㅋㅋㅋ 이대로 헐리웃 영화 만들어지고 포스터 소취요 pic.twitter.com/4IRFJu18hx — 조드윅 앓는 서린 (@katharine_stark) 2016년 3월 13일
11 
12 대국을 마친 뒤, 이세돌 9단은 "한판 이겼는데 이렇게까지 축하를 받아보는 것은 처음"이라고 말했다. 이세돌 9단은 기자회견장에도 함박 웃음을 감추지 못했다.
13 <h1>여기에 태그가 있네요!</h1> <h3>이곳에도 태그가 있구요</h3> html은 <b>태그</b>로 이루어진 문서입니다. 텍스트를 <b>진하게</b> 만들 수도 있고, <u>밑줄</u>을 칠 수도 있습니다. ‘<br>이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…<br>‘
14 (서울=위키트리) 김성현 기자 (seonghkim@smilegate.com) <저작권자(c) 무단전재-재배포 금지> ‘<br>이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…<br>‘
15 (사진=위키트리, 무단 전재-재배포 금지) ‘<br>이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…<br>‘
16 #이세돌 #알파고 #인공지능 #딥러닝 #바둑

보통은 이렇게 HTML 태그가 무분별하게 부착되어 있게된다. 이는 re 라이브러리를 이용해 제거할 수 있다.

import re

def remove_html(texts):
    """
    HTML 태그를 제거합니다.
    ``<p>안녕하세요 ㅎㅎ </p>`` -> ``안녕하세요 ㅎㅎ ``
    """
    preprcessed_text = []
    for text in texts:
        text = re.sub(r"<[^>]+>\s+(?=<)|<[^>]+>", "", text).strip()
        if text:
            preprcessed_text.append(text)
    return preprcessed_text
    
context = remove_html(context)
for i, sent in enumerate(context):
    print(i, sent)
0 이하 뉴스1&인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단
1 이하 뉴스1
2 인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단의 사진이 화제다.
3 13일 서울 광화문 포시즌스 호텔에서 열린 '구글 딥마인드 챌린지 매치'에서 이세돌 9단은 알파고와의 제4국에서 승리했다. 이날 대국장을 빠져나가는 이세돌 9단의 모습이 사진에 포착됐다.
4 이세돌 9단은 상의 주머니에 양손을 넣고 옅은 미소를 지었다. 이 사진은 SNS에서 화제를 모았다.
5 오늘 알파고에게 승리하고 대국장 빠져나가는 이세돌이라는데ㅋㅋㅋㅋㅋㅋㅋ 포토제닉ㅋㅋㅋㅋㅋㅋㅋ 이대로 헐리웃 영화 만들어지고 포스터 소취요 pic.twitter.com/4IRFJu18hx — 조드윅 앓는 서린 (@katharine_stark) 2016년 3월 13일
6 대국을 마친 뒤, 이세돌 9단은 "한판 이겼는데 이렇게까지 축하를 받아보는 것은 처음"이라고 말했다. 이세돌 9단은 기자회견장에도 함박 웃음을 감추지 못했다.
7 여기에 태그가 있네요!이곳에도 태그가 있구요 html은 태그로 이루어진 문서입니다. 텍스트를 진하게 만들 수도 있고, 밑줄을 칠 수도 있습니다. ‘이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…‘
8 (서울=위키트리) 김성현 기자 (seonghkim@smilegate.com)  ‘이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…‘
9 (사진=위키트리, 무단 전재-재배포 금지) ‘이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…‘
10 #이세돌 #알파고 #인공지능 #딥러닝 #바둑
  • html 태그가 사라진 모습

문장 분리

한국어 문장분리기에서 가장 성능이 우수한 것으로 알려진 kss 라이브러리를 사용해서 문장 단위로 모델이 학습할 수 있도록 해준다.

!pip install kss
import kss

sents = []

for sent in context:
    sent = sent.strip()
    if sent:
        splited_sent = kss.split_sentences(sent)
        sents.extend(splited_sent)
        
for i, sent in enumerate(sents):
    print(i, sent)
0 이하 뉴스1&인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단
1 이하 뉴스1
2 인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단의 사진이 화제다.
3 13일 서울 광화문 포시즌스 호텔에서 열린 '구글 딥마인드 챌린지 매치'에서 이세돌 9단은 알파고와의 제4국에서 승리했다.
4 이날 대국장을 빠져나가는 이세돌 9단의 모습이 사진에 포착됐다.
5 이세돌 9단은 상의 주머니에 양손을 넣고 옅은 미소를 지었다.
6 이 사진은 SNS에서 화제를 모았다.
7 오늘 알파고에게 승리하고 대국장 빠져나가는 이세돌이라는데ㅋㅋㅋㅋㅋㅋㅋ 포토제닉ㅋㅋㅋㅋㅋㅋㅋ 이대로 헐리웃 영화 만들어지고 포스터 소취요 pic.twitter.com/4IRFJu18hx — 조드윅 앓는 서린 (@katharine_stark) 2016년 3월 13일
8 대국을 마친 뒤, 이세돌 9단은 "한판 이겼는데 이렇게까지 축하를 받아보는 것은 처음"이라고 말했다.
9 이세돌 9단은 기자회견장에도 함박 웃음을 감추지 못했다.
10 여기에 태그가 있네요!
11 이곳에도 태그가 있구요
12 html은 태그로 이루어진 문서입니다.
13 텍스트를 진하게 만들 수도 있고, 밑줄을 칠 수도 있습니다. ‘이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…‘
14 (서울=위키트리) 김성현 기자 (seonghkim@smilegate.com) ‘이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…‘
15 (사진=위키트리, 무단 전재-재배포 금지) ‘이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…‘
16 #이세돌 #알파고 #인공지능 #딥러닝 #바둑
  • 잘 보면 이전의 10문장에서 16문장으로 그 수가 증가했지만 완벽하게 문장분리가 이루어지지 않았다.

  • 7번 문장을 보면 사람도 문장 분리하기 애매한 문장이있다.

  • 또, 특정 링크가 포함되어 있거나 0번과 1번처럼 중복적인 데이터도 존재한다.

  • 기자 이름이나 ㅋㅋㅋ 같은 어구도 불필요한 정보이다. 또 이메일 같은 개인정보를 제거해야한다.

Normalizing

def remove_email(texts):
    """
    이메일을 제거합니다.
    ``홍길동 abc@gmail.com 연락주세요!`` -> ``홍길동  연락주세요!``
    """
    preprocessed_text = []
    for text in texts:
        text = re.sub(r"[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+", "", text).strip()
        if text:
            preprocessed_text.append(text)
    return preprocessed_text
    
sents = remove_email(sents)
for i, sent in enumerate(sents):
    print(i, sent)
0 이하 뉴스1&인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단
1 이하 뉴스1
2 인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단의 사진이 화제다.
3 13일 서울 광화문 포시즌스 호텔에서 열린 '구글 딥마인드 챌린지 매치'에서 이세돌 9단은 알파고와의 제4국에서 승리했다.
4 이날 대국장을 빠져나가는 이세돌 9단의 모습이 사진에 포착됐다.
5 이세돌 9단은 상의 주머니에 양손을 넣고 옅은 미소를 지었다.
6 이 사진은 SNS에서 화제를 모았다.
7 오늘 알파고에게 승리하고 대국장 빠져나가는 이세돌이라는데ㅋㅋㅋㅋㅋㅋㅋ 포토제닉ㅋㅋㅋㅋㅋㅋㅋ 이대로 헐리웃 영화 만들어지고 포스터 소취요 pic.twitter.com/4IRFJu18hx — 조드윅 앓는 서린 (@katharine_stark) 2016년 3월 13일
8 대국을 마친 뒤, 이세돌 9단은 "한판 이겼는데 이렇게까지 축하를 받아보는 것은 처음"이라고 말했다.
9 이세돌 9단은 기자회견장에도 함박 웃음을 감추지 못했다.
10 여기에 태그가 있네요!
11 이곳에도 태그가 있구요
12 html은 태그로 이루어진 문서입니다.
13 텍스트를 진하게 만들 수도 있고, 밑줄을 칠 수도 있습니다. ‘이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…‘
14 (서울=위키트리) 김성현 기자 () ‘이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…‘
15 (사진=위키트리, 무단 전재-재배포 금지) ‘이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…‘
16 #이세돌 #알파고 #인공지능 #딥러닝 #바둑
  • 이메일이 사라진 모습

def remove_hashtag(texts):
    """
    해쉬태그(#)를 제거합니다.
    ``대박! #맛집 #JMT`` -> ``대박!  ``
    """
    preprocessed_text = []
    for text in texts:
        text = re.sub(r"#\S+", "", text).strip()
        if text:
            preprocessed_text.append(text)
    return preprocessed_text
    
sents = remove_hashtag(sents)
for i, sent in enumerate(sents):
    print(i, sent)
0 이하 뉴스1&인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단
1 이하 뉴스1
2 인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단의 사진이 화제다.
3 13일 서울 광화문 포시즌스 호텔에서 열린 '구글 딥마인드 챌린지 매치'에서 이세돌 9단은 알파고와의 제4국에서 승리했다.
4 이날 대국장을 빠져나가는 이세돌 9단의 모습이 사진에 포착됐다.
5 이세돌 9단은 상의 주머니에 양손을 넣고 옅은 미소를 지었다.
6 이 사진은 SNS에서 화제를 모았다.
7 오늘 알파고에게 승리하고 대국장 빠져나가는 이세돌이라는데ㅋㅋㅋㅋㅋㅋㅋ 포토제닉ㅋㅋㅋㅋㅋㅋㅋ 이대로 헐리웃 영화 만들어지고 포스터 소취요 pic.twitter.com/4IRFJu18hx — 조드윅 앓는 서린 (@katharine_stark) 2016년 3월 13일
8 대국을 마친 뒤, 이세돌 9단은 "한판 이겼는데 이렇게까지 축하를 받아보는 것은 처음"이라고 말했다.
9 이세돌 9단은 기자회견장에도 함박 웃음을 감추지 못했다.
10 여기에 태그가 있네요!
11 이곳에도 태그가 있구요
12 html은 태그로 이루어진 문서입니다.
13 텍스트를 진하게 만들 수도 있고, 밑줄을 칠 수도 있습니다. ‘이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…‘
14 (서울=위키트리) 김성현 기자 () ‘이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…‘
15 (사진=위키트리, 무단 전재-재배포 금지) ‘이 줄은 실제 뉴스(news,)에 포함되지 않은 임시 데이터임을 알립니다…‘
  • 해시태그로 구성된 부분이 사라졌다.

또, @로 이루어진 부분도 인스타그램이나 이메일등을 태그할 수 있는 부분이라서 이 부분도 제거한다. url 역시 제거한다.

문제를 일으킬 수 있는 문자들도 제거한다. 한국어를 크롤링하게되면 이상한 문자들이 같이 크롤링하게 되기 때문에 이러한 문자를 제거한다.

그리고, 기자정보와 언론사정보를 제거한다.

그 외에도 다음을 제거한다.

  • 뉴스 내 포함된 이미제 정보

  • 위키피디아 전처리를 위한 함수

    • 수학(math,) => 수학(math)

    • 수학() => 수학

def remove_user_mention(texts):
    """
    유저에 대한 멘션(@) 태그를 제거합니다.
    ``@홍길동 감사합니다!`` -> `` 감사합니다!``
    """
    preprocessed_text = []
    for text in texts:
        text = re.sub(r"@\w+", "", text).strip()
        if text:
            preprocessed_text.append(text)
    return preprocessed_text
    
    
def remove_url(texts):
    """
    URL을 제거합니다.
    ``주소: www.naver.com`` -> ``주소: ``
    """
    preprocessed_text = []
    for text in texts:
        text = re.sub(r"(http|https)?:\/\/\S+\b|www\.(\w+\.)+\S*", "", text).strip()
        text = re.sub(r"pic\.(\w+\.)+\S*", "", text).strip()
        if text:
            preprocessed_text.append(text)
    return preprocessed_text    
    
def remove_bad_char(texts):
    """
    문제를 일으킬 수 있는 문자들을 제거합니다.
    """
    bad_chars = {"\u200b": "", "…": " ... ", "\ufeff": ""}
    preprcessed_text = []
    for text in texts:
        for bad_char in bad_chars:
            text = text.replace(bad_char, bad_chars[bad_char])
        text = re.sub(r"[\+á?\xc3\xa1]", "", text)
        if text:
            preprcessed_text.append(text)
    return preprcessed_text
    
def remove_press(texts):
    """
    언론 정보를 제거합니다.
    ``홍길동 기자 (연합뉴스)`` -> ````
    ``(이스탄불=연합뉴스) 하채림 특파원 -> ````
    """
    re_patterns = [
        r"\([^(]*?(뉴스|경제|일보|미디어|데일리|한겨례|타임즈|위키트리)\)",
        r"[가-힣]{0,4} (기자|선임기자|수습기자|특파원|객원기자|논설고문|통신원|연구소장) ",  # 이름 + 기자
        r"[가-힣]{1,}(뉴스|경제|일보|미디어|데일리|한겨례|타임|위키트리)",  # (... 연합뉴스) ..
        r"\(\s+\)",  # (  )
        r"\(=\s+\)",  # (=  )
        r"\(\s+=\)",  # (  =)
    ]

    preprocessed_text = []
    for text in texts:
        for re_pattern in re_patterns:
            text = re.sub(re_pattern, "", text).strip()
        if text:
            preprocessed_text.append(text)    
    return preprocessed_text
    
def remove_copyright(texts):
    """
    뉴스 내 포함된 저작권 관련 텍스트를 제거합니다.
    ``(사진=저작권자(c) 연합뉴스, 무단 전재-재배포 금지)`` -> ``(사진= 연합뉴스, 무단 전재-재배포 금지)`` TODO 수정할 것
    """
    re_patterns = [
        r"\<저작권자(\(c\)|ⓒ|©|\(Copyright\)|(\(c\))|(\(C\))).+?\>",
        r"저작권자\(c\)|ⓒ|©|(Copyright)|(\(c\))|(\(C\))"
    ]
    preprocessed_text = []
    for text in texts:
        for re_pattern in re_patterns:
            text = re.sub(re_pattern, "", text).strip()
        if text:
            preprocessed_text.append(text)    
    return preprocessed_text
    
def remove_photo_info(texts):
    """
    뉴스 내 포함된 이미지에 대한 label을 제거합니다.
    ``(사진= 연합뉴스, 무단 전재-재배포 금지)`` -> ````
    ``(출처=청주시)`` -> ````
    """
    preprocessed_text = []
    for text in texts:
        text = re.sub(r"\(출처 ?= ?.+\) |\(사진 ?= ?.+\) |\(자료 ?= ?.+\)| \(자료사진\) |사진=.+기자 ", "", text).strip()
        if text:
            preprocessed_text.append(text)
    return preprocessed_text

def remove_useless_breacket(texts):
    """
    위키피디아 전처리를 위한 함수입니다.
    괄호 내부에 의미가 없는 정보를 제거합니다.
    아무런 정보를 포함하고 있지 않다면, 괄호를 통채로 제거합니다.
    ``수학(,)`` -> ``수학``
    ``수학(數學,) -> ``수학(數學)``
    """
    bracket_pattern = re.compile(r"\((.*?)\)")
    preprocessed_text = []
    for text in texts:
        modi_text = ""
        text = text.replace("()", "")  # 수학() -> 수학
        brackets = bracket_pattern.search(text)
        if not brackets:
            if text:
                preprocessed_text.append(text)
                continue
        replace_brackets = {}
        # key: 원본 문장에서 고쳐야하는 index, value: 고쳐져야 하는 값
        # e.g. {'2,8': '(數學)','34,37': ''}
        while brackets:
            index_key = str(brackets.start()) + "," + str(brackets.end())
            bracket = text[brackets.start() + 1 : brackets.end() - 1]
            infos = bracket.split(",")
            modi_infos = []
            for info in infos:
                info = info.strip()
                if len(info) > 0:
                    modi_infos.append(info)
            if len(modi_infos) > 0:
                replace_brackets[index_key] = "(" + ", ".join(modi_infos) + ")"
            else:
                replace_brackets[index_key] = ""
            brackets = bracket_pattern.search(text, brackets.start() + 1)
        end_index = 0
        for index_key in replace_brackets.keys():
            start_index = int(index_key.split(",")[0])
            modi_text += text[end_index:start_index]
            modi_text += replace_brackets[index_key]
            end_index = int(index_key.split(",")[1])
        modi_text += text[end_index:]
        modi_text = modi_text.strip()
        if modi_text:
            preprocessed_text.append(modi_text)
    return preprocessed_text
sents = remove_useless_breacket(sents)
for i, sent in enumerate(sents):
    print(i, sent)
0 이하 뉴스1&인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단
1 이하 뉴스1
2 인공지능 알파고(AlphaGo)를 상대로 첫 승리를 거둔 이세돌 9단의 사진이 화제다.
3 13일 서울 광화문 포시즌스 호텔에서 열린 '구글 딥마인드 챌린지 매치'에서 이세돌 9단은 알파고와의 제4국에서 승리했다.
4 이날 대국장을 빠져나가는 이세돌 9단의 모습이 사진에 포착됐다.
5 이세돌 9단은 상의 주머니에 양손을 넣고 옅은 미소를 지었다.
6 이 사진은 SNS에서 화제를 모았다.
7 오늘 알파고에게 승리하고 대국장 빠져나가는 이세돌이라는데ㅋㅋㅋㅋㅋㅋㅋ 포토제닉ㅋㅋㅋㅋㅋㅋㅋ 이대로 헐리웃 영화 만들어지고 포스터 소취요  — 조드윅 앓는 서린  2016년 3월 13일
8 대국을 마친 뒤, 이세돌 9단은 "한판 이겼는데 이렇게까지 축하를 받아보는 것은 처음"이라고 말했다.
9 이세돌 9단은 기자회견장에도 함박 웃음을 감추지 못했다.
10 여기에 태그가 있네요!
11 이곳에도 태그가 있구요
12 html은 태그로 이루어진 문서입니다.
13 텍스트를 진하게 만들 수도 있고, 밑줄을 칠 수도 있습니다. ‘이 줄은 실제 뉴스(news)에 포함되지 않은 임시 데이터임을 알립니다 ... ‘
14 ‘이 줄은 실제 뉴스(news)에 포함되지 않은 임시 데이터임을 알립니다 ... ‘
15 ‘이 줄은 실제 뉴스(news)에 포함되지 않은 임시 데이터임을 알립니다 ... ‘

어느 정도 따라하면서 공부하려고 했는데, 방대한 양의 여기까지만 작성합니다...