자바, 미안하다! 파이썬 한국어 nlp

33
자바, 미안하다! Korean NLP with Python PyCon Korea 2014 Lucy Park (박은정) KoNLPy on GitHub 1 / 33

Upload: lucy-park

Post on 14-Nov-2014

2.965 views

Category:

Technology


1 download

DESCRIPTION

@PyCon Korea 2014 NLTK 덕에 파이썬으로 자연어처리를 하는 것이 편리해졌다. 단, 한국어만 분석하려하지 않는다면. 파이썬으로 한국어를 분석할 수는 없을까? 국문, 영문, 중문 등 다양한 문자가 섞여 있는 문서는 어떻게 분석을 할 수 있을까? 이 발표에서는 자연어처리의 기초적인 개념을 다룬 후, NLTK 등의 자연어처리 라이브러리와 한국어 분석을 위해 개발중인 KoNLPy를 소개한다. 또, 파이썬으로 한국어를 분석할 때 유용한 몇 가지 트릭을 공유한다. http://konlpy.readthedocs.org

TRANSCRIPT

Page 1: 자바, 미안하다! 파이썬 한국어 NLP

자바, 미안하다!

Korean NLP with Python

PyCon Korea 2014

Lucy Park (박은정)

KoNLPy on GitHub

1 / 33

Page 2: 자바, 미안하다! 파이썬 한국어 NLP

개요 NLTK 덕에 파이썬으로 자연어처리를 하는 것이 편리해졌다.단, 한국어만 분석하려하지 않는다면.

파이썬으로 한국어를 분석할 수는 없을까?국문, 영문, 중문 등 다양한 문자가 섞여 있는 문서는 어떻게 분석할 수 있을까?

이 발표에서는 자연어처리의 기초적인 개념을 다룬 후, NLTK 등의 자연어처리 라이브러리와 한국어 분석을 위해 개발중인KoNLPy를 소개한다. 또, 파이썬으로 한국어를 분석할 때 유용한 몇 가지 트릭을 공유한다.

KoNLPy docs: http://konlpy.readthedocs.orgSlides URL: http://www.lucypark.kr/slides/2014-pyconkrSlides code: https://gist.github.com/e9t/546faa368424e04e25c7

2 / 33

Page 3: 자바, 미안하다! 파이썬 한국어 NLP

박은정(a.k.a.lucypark,echojuliett, e9t)

개발하는 데이터 분석가.

서울대학교 데이터마이닝 센터 박사과정"대한민국 정치의 모든 것" 만드는 팀포퐁 멤버Just another yak shaver...

11:49 <@sanxiyn> 또다시 yak shaving의 신비한 세계11:51 <@sanxiyn> yak shaving이 뭔지 다 아시죠?11:51 <디토군> 방금 찾아보고 왔음11:51 <@mana> (조용히 설명을 기대중)11:51 <@sanxiyn> 나무를 베려고 하는데11:52 <@sanxiyn> 도끼질을 하다가11:52 <@sanxiyn> 도끼가 더 잘 들면 나무를 쉽게 벨텐데 해서11:52 <@sanxiyn> 도끼 날을 세우다가11:52 <@sanxiyn> 도끼 가는 돌이 더 좋으면 도끼 날을 더 빨리 세울텐데 해서11:52 <@sanxiyn> 좋은 숫돌이 있는 곳을 수소문해 보니11:52 <@mana> …11:52 <&홍민희> 그거 전형적인 제 행동이네요11:52 <@sanxiyn> 저 멀이 어디에 세계 최고의 숫돌이 난다고11:52 <@sanxiyn> 거기까지 야크를 타고 가려다가11:52 <@mana> 항상하던 짓이라서 타이핑을 할 수 없었습니다11:52 <@sanxiyn> 야크 털을 깎아서…11:52 <@sanxiyn> etc.

3 / 33

Page 4: 자바, 미안하다! 파이썬 한국어 NLP

"caricature"

4 / 33

Page 5: 자바, 미안하다! 파이썬 한국어 NLP

-- 만화가 김충원

"사람의 생김새를 결정짓는 것은골격과 피부의 미묘한 변화에서 비롯되는 차이점이고,

그 차이점을 없애 버린다면 모든 사람의 생김새는똑같을 것입니다."

5 / 33

Page 6: 자바, 미안하다! 파이썬 한국어 NLP

"데이터를 결정짓는 것은행과 열의 미묘한 변화에서 비롯되는 차이점이고,

그 차이점을 없애 버린다면 모든 데이터는똑같을 것입니다."

6 / 33

Page 7: 자바, 미안하다! 파이썬 한국어 NLP

수많은 공통점을 두고도차이를 만드는 요인.

데이터 분석의 관점에서는:

"Features"

7 / 33

Page 8: 자바, 미안하다! 파이썬 한국어 NLP

문서 간 차이를 만드는 "Features"는 뭘까?

8 / 33

Page 9: 자바, 미안하다! 파이썬 한국어 NLP

9 / 33

Page 10: 자바, 미안하다! 파이썬 한국어 NLP

10 / 33

Page 11: 자바, 미안하다! 파이썬 한국어 NLP

형태소

언어의 최소 의미 단위.

* 영어는 tokenizing, stemming으로 충분한 경우도 있지만 결국 마찬가지. ex: "unbreakable"=="un-"+"break"+"-able"

11 / 33

Page 12: 자바, 미안하다! 파이썬 한국어 NLP

형태소분석 with C/C++ & Java

corpus linguistics == 언어 분석을 computational하게 해보자!

1995년, KTS를 시작으로 국내외에서 여러 "오픈소스" 형태소 분석기가 개발됨형태소 분석기를 만든다 == 알고리즘 구현 + 방대한 코퍼스 기반으로 사전 구축

한마디로, 정말 대단한 작업

* 형태소 분석기 링크들은 여기에: http://konlpy.readthedocs.org/en/latest/references12 / 33

Page 13: 자바, 미안하다! 파이썬 한국어 NLP

이러한 역작들을,

더 많은 사람들이 쉽게 이용하게 할 수 있을까?

13 / 33

Page 14: 자바, 미안하다! 파이썬 한국어 NLP

그러한 관점에서누구나 쉽게 NLP를 할 수 있게 해준 패키지 두 개:

KoNLP, for R

NLTK, for Python

14 / 33

Page 15: 자바, 미안하다! 파이썬 한국어 NLP

KoNLP, for R https://github.com/haven-jeon/KoNLP

한나눔 형태소 분석기 R interface

세종계획한국어 코퍼스, 사전 등을 마련한 10년 계획 정부사업의 확장적 사용

그 외 NLP를 편리하게 하는 각종 함수 구현많은 down-to-earth 예제를 담은 documentation

"Python으로도 이런게 있으면 좋겠다!" 이름에도 내포돼있듯 KoNLPy의 가장 큰 inspiration!

15 / 33

Page 16: 자바, 미안하다! 파이썬 한국어 NLP

NLTK, for Python http://nltk.org

Porter, snowball, Lancaster 등 다양한 stemming 알고리즘 포함그 외 chunking, NER, classification 알고리즘 포함50개가 넘는 (주로 영어지만 다양한 언어의) 코퍼스 포함역시 풍부한 문서(Natural) language free, platform free, and free

"한국어만 지원되면 정말 좋겠다!"

* NLTK는 Language-free한 속성 때문에 파이썬 한국어 NLP에도 유용하게 이용할 수 있습니다. (예시: Collocation 찾기)16 / 33

Page 17: 자바, 미안하다! 파이썬 한국어 NLP

파이썬으로 형태소 분석,

한국어 NLP 할 수 있으면 정말 좋겠네

1. 형태소 분석기 뿐 아니라, 더 많은 자연어 처리 기능 & 코퍼스를 포괄하면서2. 여러 형태소 분석기 중에서는 목적/취향에 맞는 것을 쉽게 선택할 수 있게3. 누구나 참여할 수 있는, 여과없는 오픈소스를4. 상세한 예제를 담은 문서와 함께5. 가장 Pythonic 한 형태로

(...로 만드는 것이 "목표".)

17 / 33

Page 18: 자바, 미안하다! 파이썬 한국어 NLP

KoNLPy, for Python http://konlpy.rtfd.org

"Standing on the shoulders of giants"

2014년 7월, 한나눔 형태소 분석기만 담아 첫 릴리즈2014년 8월, 꼬꼬마, MeCab-ko 형태소 분석기도 포함하여 v0.3.0 릴리즈국회 의안 등 재사용/재배포가 가능한 공문서 위주로 toying data 추가그 외 각종 튜토리얼, konlpy.utils.pprint 등 편리한 함수 추가

GitHub을 통해 누구나 논의와 개발에 참여할 수 있습니다!

18 / 33

Page 19: 자바, 미안하다! 파이썬 한국어 NLP

한 번 써볼까요?

19 / 33

Page 20: 자바, 미안하다! 파이썬 한국어 NLP

Installation

$ pip install JPype1 # Aㅏ... dependencies...$ pip install konlpy

20 / 33

Page 21: 자바, 미안하다! 파이썬 한국어 NLP

>>> from konlpy.tag import Kkma>>> from konlpy.utils import pprint # 파이썬 2에서 편리한 출력을 위함>>> kkma = Kkma()>>> pprint(kkma.sentences(u'네, 안녕하세요. 반갑습니다.'))[네, 안녕하세요.., 반갑습니다.]>>> pprint(kkma.nouns(u'질문이나 건의사항은 깃헙 이슈 트래커에 남겨주세요.'))[질문, 건의, 건의사항, 사항, 깃헙, 이슈, 트래커]>>> pprint(kkma.pos(u'오류보고는 실행환경, 에러메세지와함께 설명을 최대한상세히!̂ '̂)[(오류, NNG), (보고, NNG), (는, JX), (실행, NNG), (환경, NNG), (,, SP), (에러, NNG), (메세지, NNG), (와, JKM), (함께, MAG), (설명, NNG), (을, JKO), (최대한, NNG), (상세히, MAG), (!, SF), (̂ ,̂ EMO)]

21 / 33

Page 22: 자바, 미안하다! 파이썬 한국어 NLP

>>> from konlpy.tag import *>>> from konlpy.utils import pprint>>> engines = [Kkma(), Hannanum(), Mecab()]>>> s = u"갤럭시는 화면이 큰데, 좋은데?" # 'ㄴ데', '은데'가 다르다는 것에 주목!>>> for e in engines:... print e... pprint(e.pos(s))<konlpy.tag._kkma.Kkma instance at 0x2d292d8>[(갤럭시, UN), (는, JX), (화면, NNG), (이, JKS), (크, VA), (ㄴ데, ECE), (,, SP), (좋, VA), (은데, ECD), (?, SF)]<konlpy.tag._hannanum.Hannanum instance at 0x2d299e0>[(갤럭시, N), (는, J), (화면, N), (이, J), (크, P), (ㄴ데, E), (,, S), (좋, P), (은, E), (데, N), (?, S)]<konlpy.tag._mecab.Mecab instance at 0x2d29950>[(갤럭시, NNP), (는, JX), (화면, NNG), (이, JKS), (큰데, VA+EC),

22 / 33

Page 23: 자바, 미안하다! 파이썬 한국어 NLP

태그셋 비교: Korean POS tags comparison chart

23 / 33

Page 24: 자바, 미안하다! 파이썬 한국어 NLP

형태소 분석 모듈 간 성능 비교

형태소 분석기는 속도, 메모리 사용, 정확도 등으로 성능 평가One-size-fits-all 이라기보다는 서로 장단점이 있는 경우가 많음알고리즘 뿐 아니라 사전의 영향도 매우**2 큼자신의 목적/취향에 맞는 분석기+사전 조합을 사용

* Warning!(1) 형태소 분석기 간 직접적인 비교가 아니라, KoNLPy 내부 모듈 간 비교입니다.(2) POS tagging은 형태소 분석과 구분됩니다. 자세한 설명은 구글신께 양보드립니다 :)

24 / 33

Page 25: 자바, 미안하다! 파이썬 한국어 NLP

좀 더 재밌는걸 해봅시다!

25 / 33

Page 26: 자바, 미안하다! 파이썬 한국어 NLP

예제: 워드클라우드 그리기목적: 파이썬만으로 웹문서에서 중요한 명사를 뽑아 워드클라우드로 그리기!

* 코드는 지면상 여기에서: http://konlpy.readthedocs.org/en/latest/examples/wordcloud/ (재밌는 예제들도 더 있어요!)26 / 33

Page 27: 자바, 미안하다! 파이썬 한국어 NLP

이걸 응용해서 만든 것이:

http://pokr.kr/person/1958194

27 / 33

Page 28: 자바, 미안하다! 파이썬 한국어 NLP

Future works for KoNLPy1. 사전 interface 통일2. konlpy.download(): 코퍼스, 사전 등 data file을 소스코드에서 분리3. GCJ 등을 활용해서 JVM을 따로 구동하지 않는 방법 고려4. Python3 support

5. 한국어 documentation?

28 / 33

Page 29: 자바, 미안하다! 파이썬 한국어 NLP

시간이 좀 남았나요?

29 / 33

Page 30: 자바, 미안하다! 파이썬 한국어 NLP

몇 가지 트릭한글 파일 읽기: "Decode early, encode late"

>>> with open('somefile.txt', 'r') as f:

... doc = f.read().decode('utf-8')

>>> import codecs

>>> codecs.open('somefile.txt', encoding='utf-8')

sublee님의 Hangulize

>>> from hangulize import hangulize

>>> print hangulize('Guido van Rossum', 'nld')

히도 판로쉼

30 / 33

Page 31: 자바, 미안하다! 파이썬 한국어 NLP

몇 가지 트릭문자의 정체 확인하기

>>> from unicodedata import name

>>> print '%s, %s, %s' % (name(u"ㆍ"), name(u"․"), name(u"・"))HANGUL LETTER ARAEA, ONE DOT LEADER, HALFWIDTH KATAKANA MIDDLE DOT

>>> "・".decode("unicode-escape")

u'\xef\xbd\xa5'

>>> ord(u"・"), repr(u"・")

(65381, "u'\\uff65'")

특수문자를 제외하고 어절을 얻고 싶은 경우

>>> import regex

>>> regex.findall(ur'\p{Hangul}+', u'다람쥐, 헌 쳇바퀴에 타고파.')

[u'\ub2e4\ub78c\uc950', u'\ud5cc', u'\uccc7\ubc14\ud034\uc5d0', u'\ud0c0\uace0\ud30c']

31 / 33

Page 32: 자바, 미안하다! 파이썬 한국어 NLP

몇 가지 트릭한글 romanize하기

>>> from unidecode import unidecode

>>> unidecode(u'파이콘')

'paikon'

한자, 한글, 영문가 섞여 있는 경우

Multilingual NLP에서 제안하는 다양한 접근법이 있습니다.

간단한 꼼수 한 가지는: "한자 전처리, 영문 후처리"

한자는 transliterate하고 (ex: '丁新闻' -> 정신문)

한국어 처리를 한 후에 (ex: POS tagging)

영문으로 분류된 tag에 한해 따로 stemming 등을 거침

32 / 33

Page 33: 자바, 미안하다! 파이썬 한국어 NLP

감사합니다 :D

http://lucypark.kr

@echojuliett

33 / 33