1 of 43

awesome-spacer

케라스로 띄어쓰기 정복하기

정연준

2019.07.04

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

2 of 43

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

3 of 43

Motivation

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

4 of 43

한국어 띄어쓰기의 어려움

  • 쓰레기가 될만한 물건은 ➡
  • 쓸만한 범퍼 ➡
  • 아마도 카레라이스 뿐일까 한다 ➡
  • 아이디(계정)가 기억이 안나는데요. ➡

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

5 of 43

한국어 띄어쓰기의 어려움

  • 쓰레기가 될만한 물건은 ➡ 쓰레기가 될 만한 물건은 <환경운동연합:동강 취재>
  • 쓸만한 범퍼 ➡ 쓸 만한 범퍼 <환경운동연합:생활 실천 지침>
  • 아마도 카레라이스 뿐일까 한다. ➡ 아마도 카레라이스뿐일까 한다. <아이팝콘:팝콘투어 / 세계여행>
  • 아이디(계정)가 기억이 안나는데요. ➡ 아이디(계정)가 기억이 안 나는데요. <다음:도움말>

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

6 of 43

케라스 문서 공식 한글화

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

7 of 43

한국어 띄어쓰기 교정

  • 네이버 띄어쓰기 검사기
  • 부산대 띄어쓰기 검사기

API의 부재

자동화의 어려움

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

8 of 43

문제 정의

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

9 of 43

한국어 띄어쓰기 교정

  • 한국어의 띄어쓰기 교정 문제는 “주어진 문장에서 띄어지지 않는 글자들 중, 본래 띄어써야 하는 부분을 교정하는 것”으로 한정
  • 한국어 띄어쓰기 교정은 연속된 글자들에서 각 글자 다음에 공백이 올지 판단하는 이진 분류 문제로 치환 가능
  • 띄어쓰기가 잘 되어있는 데이터로부터 띄어쓰기 패턴을 학습하여 오류 수정 가능

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

10 of 43

환경 설정

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

11 of 43

GPU가 없다면, 구글 Colab을

  • 주피터 노트북 형식의 개발 환경 제공
  • K80 GPU(11.4GB) 제공
  • 단일 VM 할당 제한, 12시간 제한
    • 일일 제한이 없기 때문에 12시간 사용 후, 새로운 VM으로 다시 사용 가능
  • 윈도우에서도 손쉽게 리눅스 환경 사용 가능
  • 구글 드라이브와의 연동으로 데이터 업로드/다운로드 용이
  • 자세한 설정은 화면으로

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

12 of 43

데이터셋 준비

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

13 of 43

어떤 데이터셋을 사용해야 할까?

  • 정답 데이터 확보의 중요성
    • Garbage in, garbage out

  • 어떤 데이터가 있나?
  • 인터넷 뉴스 크롤링
  • 위키피디아 한글 문서
  • 세종 말뭉치 데이터

  • 데이터셋 선택이 갖는 의미
    • 트위터 데이터로 학습한 모델을 신문 기사에 적용할 수 있을까?

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

14 of 43

세종 코퍼스 사용하기

  • https://ithub.korean.go.kr/user/guide/corpus/guide1.do
    • 말뭉치들이 여러 게시판에 나뉘어 저장돼있어 사용이 까다롭다
  • 전체 데이터가 필요하다면

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

15 of 43

세종 코퍼스 사용하기

  • [ISSUE] Mac/Windows 환경에서는 sejong-corpus 실행 불가
  • 샘플 다운로드 링크(150개의 파일, 18MB)

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

16 of 43

샘플 데이터 살펴보기

  • 모든 텍스트 파일에서 텍스트만 얻으려면 어떻게 해야할까?
  • sejong-corpus 텍스트 파일 예시
    • sejong-corpus/corpus-utf8/2BA90A03.txt
  • HTML 형식
    • 파싱 필요
  • 텍스트는 <p></p> 태그로 추출
  • 파일별로 추출한 텍스트를 하나로 머지

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

17 of 43

샘플 데이터 살펴보기

  • <p> 태그를 일괄적으로 지우기 위한 정규표현식
    • <p>임의의 문장. 하나. 두개.</p>

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

18 of 43

샘플 데이터 살펴보기

  1. HTML 파일 파싱
  2. <p> 태그 추출
  3. 태그 제거
  4. 길이가 0인 문장 제거
    1. <p>\n</p>
  5. 모든 영문자는 소문자로 대체

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

19 of 43

샘플 데이터 살펴보기

  • 그냥 찍어도 77%
  • 평균 122 글자

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

20 of 43

tf2.0-beta + keras

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

21 of 43

어떻게 해결할까?

  • 딥러닝 프레임워크
    • Keras + tf2.0-beta
    • Keras
    • PyTorch
    • CNTK

차트 출처: https://www.edureka.co/blog/keras-vs-tensorflow-vs-pytorch

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

22 of 43

어떻게 해결할까?

  • 딥러닝 프레임워크
    • Keras + tf2.0-beta
    • Keras
    • PyTorch
    • CNTK

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

23 of 43

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

24 of 43

슬라이드 출처: https://www.slideshare.net/MIjeongJeon1/keras-81639526?from_action=save

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

25 of 43

슬라이드 출처: https://www.slideshare.net/MIjeongJeon1/keras-81639526?from_action=save

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

26 of 43

  1. Word Vectors

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

27 of 43

One-hot Encoding

  • 딥러닝은 결국 복잡한 행렬 연산의 집합
    • 텍스트를 수치화할 수 있어야한다.
    • 문자간에 +, -, * 등 연산이 정의되어있지 않다.
  • 텍스트 → 벡터

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

28 of 43

One-hot Encoding

  • 딥러닝은 결국 복잡한 행렬 연산의 집합
    • 텍스트를 수치화할 수 있어야한다.
    • 문자간에 +, -, * 등 연산이 정의되어있지 않다.
  • 텍스트 → 벡터

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

29 of 43

One-hot Encoding

  • 딥러닝은 결국 복잡한 행렬 연산의 집합
    • 텍스트를 수치화할 수 있어야한다.
    • 문자간에 +, -, * 등 연산이 정의되어있지 않다.
  • 텍스트 → 벡터
  • 단어의 수가 많아지면?

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

30 of 43

Word Embedding

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

31 of 43

2. N-gram

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

32 of 43

N-gram

  • 아버지가방에들어가셨다
  • 아버지가 방에 if ‘가 방에’ > ‘가방에’
  • 아버지 가방에 if ‘가 방에’ < ‘가방에’

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

33 of 43

N-gram

  • 1-D Convolution으로 N-gram 학습 가능
  • 필터의 크기 : N
    • N = 1 : (아), (버), (지), (가)
    • N = 2 : (아,버), (버,지), (지,가)
    • N = 3 : (아, 버, 지), (버, 지, 가)
  • 필터의 개수 : 학습된 N-gram의 개수
    • (아,버), (버,지), (지,가), ...

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

34 of 43

3. LSTM

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

35 of 43

LSTM

  • 시퀀스 데이터 처리에 강하다
  • 그런데 느리다
  • 많이 느리다

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

36 of 43

결론

  • N-gram을 학습할 수 있다
  • 글자의 연속 -> 학습된 N-gram의 시퀀스(최소 단위 변환)
  • LSTM으로 시퀀스 데이터 학습
  • 각 글자(N-gram)에 대해 이진분류 진행

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

37 of 43

4. Implementation

5. Training

6. Test → .ipynb를 보며 실습

코드

학습된 모델

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

38 of 43

데이터 입력

  • 모든 텍스트 파일에서 텍스트만 얻으려면 어떻게 해야할까?
  • sejong-corpus 텍스트 파일 예시
    • sejong-corpus/corpus-utf8/2BA90A03.txt
  • HTML 형식
    • 파싱 필요
  • 텍스트는 <p></p> 태그로 추출
  • 파일별로 추출한 텍스트를 하나로 머지

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

39 of 43

Future work

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

40 of 43

성능을 어떻게 높일까?

  1. Colab 기준 400Mb(약 1억 글자)를 학습 시, 1 epoch에 약 2시간
  2. 도메인에 특정한 데이터셋 확보
    1. 위키 데이터로는 구어체에 대한 분류는 부정확할 것
  3. LSTM Bidirectional
  4. Alphabet <w>
  5. Digits <d>
  6. Class별 Weight(0.85 : 0.15)
  7. Etc...

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

41 of 43

References

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

42 of 43

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준

43 of 43

Call for contribution

All contributions are welcome!

Submit PR @ https://github.com/fuzzythecat/awesome-spacer

2ND 함께하는 딥러닝 컨퍼런스 Keras Korea 정연준