name: inverse
layout: true
class: title, center, middle, inverse
PyCon Korea 2014
자바, 미안하다!
.footnote[
.left-column[
]
.right-column[
NLTK 덕에 파이썬으로 자연어처리를 하는 것이 편리해졌다.
단, 한국어만 분석하려하지 않는다면.
파이썬으로 한국어를 분석할 수는 없을까?
국문, 영문, 중문 등 다양한 문자가 섞여 있는 문서는 어떻게 분석할 수 있을까?
이 발표에서는 자연어처리의 기초적인 개념을 다룬 후, NLTK 등의 자연어처리 라이브러리와 한국어 분석을 위해 개발중인 KoNLPy를 소개한다. 또, 파이썬으로 한국어를 분석할 때 유용한 몇 가지 트릭을 공유한다.
.small[
.left-column[
(a.k.a. lucypark, echojuliett, e9t)
]
.right-column[
- 서울대학교 데이터마이닝 센터 박사과정
- "대한민국 정치의 모든 것" 만드는 팀포퐁 멤버
- Just another yak shaver...
.small.gray[
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.
]]
class: center
.full-image[]
"caricature"
class: center, middle, inverse, full-text
".gold[사람의 생김새]를 결정짓는 것은
.gold[골격과 피부의 미묘한 변화에서 비롯되는 차이]점이고,
그 차이점을 없애 버린다면 모든 사람의 생김새는
똑같을 것입니다."
.pull-right[-- 만화가 김충원]
class: center, middle, inverse, full-text
".gold[데이터]를 결정짓는 것은
.gold[행과 열의 미묘한 변화에서 비롯되는 차이]점이고,
그 차이점을 없애 버린다면 모든 데이터는
똑같을 것입니다."
class: center, middle, full-text
수많은 공통점을 두고도
차이를 만드는 요인.
데이터 분석의 관점에서는:
.blue["Features"]
class: center, middle, full-text
문서 간 차이를 만드는
.blue["Features"]는
뭘까?
class: middle
.full-image[]
class: middle
.full-image[]
class: center, middle, full-text
.blue[형태소]
언어의 최소 의미 단위.
.footnote[* 영어는 tokenizing, stemming으로 충분한 경우도 있지만 결국 마찬가지. .small.gray[ex: "unbreakable"=="un-"+"break"+"-able"]]
.full-image[]
- corpus linguistics == 언어 분석을 computational하게 해보자!
- 1995년, KTS를 시작으로 국내외에서 여러 "오픈소스" 형태소 분석기가 개발됨
- 형태소 분석기를 만든다 == 알고리즘 구현 + 방대한 코퍼스 기반으로 사전 구축
.footnote[* 형태소 분석기 링크들은 여기에: http://konlpy.readthedocs.org/en/latest/references]
class: center, middle, full-text
이러한 역작들을,
.blue[더 많은 사람]들이 .blue[쉽게] 이용하게 할 수 있을까?
class: center, middle, full-text
그러한 관점에서
누구나 쉽게 NLP를 할 수 있게 해준 패키지 두 개:
.left[
- KoNLP, for R
- NLTK, for Python
]
.mid-image[]
- 한나눔 형태소 분석기 R interface
- 세종계획.small.gray[한국어 코퍼스, 사전 등을 마련한 10년 계획 정부사업]의 확장적 사용
- 그 외 NLP를 편리하게 하는 각종 함수 구현
- 많은 down-to-earth 예제를 담은 documentation
- "Python으로도 이런게 있으면 좋겠다!" .small.blue[이름에도 내포돼있듯 KoNLPy의 가장 큰 inspiration!]
.mid-image[]
- Porter, snowball, Lancaster 등 다양한 stemming 알고리즘 포함
- 그 외 chunking, NER, classification 알고리즘 포함
- 50개가 넘는 (주로 영어지만 다양한 언어의) 코퍼스 포함
- 역시 풍부한 문서
- (Natural) language free, platform free, and free
- "한국어만 지원되면 정말 좋겠다!"
.footnote[* NLTK는 Language-free한 속성 때문에 파이썬 한국어 NLP에도 유용하게 이용할 수 있습니다. (예시: Collocation 찾기)]
class: center, middle, full-text
.blue[파이썬]으로 .gray[형태소 분석],
.blue[한국어 NLP] 할 수 있으면 정말 좋겠네
.left[
- 형태소 분석기 뿐 아니라, 더 많은 자연어 처리 기능 & 코퍼스를 포괄하면서
- 여러 형태소 분석기 중에서는 목적/취향에 맞는 것을 쉽게 선택할 수 있게
- 누구나 참여할 수 있는, 여과없는 오픈소스를
- 상세한 예제를 담은 문서와 함께
- 가장 Pythonic 한 형태로
]
.footnote[(...로 만드는 것이 "목표".)]
.mid-image[]
- "Standing on the shoulders of giants"
- 2014년 7월, 한나눔 형태소 분석기만 담아 첫 릴리즈
- 2014년 8월, 꼬꼬마, MeCab-ko 형태소 분석기도 포함하여 v0.3.0 릴리즈
- 국회 의안 등 재사용/재배포가 가능한 공문서 위주로 toying data 추가
- 그 외 각종 튜토리얼,
konlpy.utils.pprint
등 편리한 함수 추가
- GitHub을 통해 누구나 논의와 개발에 참여할 수 있습니다!
class: center, middle, full-text
한 번 써볼까요?
class: middle
$ pip install JPype1 # Aㅏ... dependencies...
$ pip install konlpy
>>> 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)]
.scroll[
>>> 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),
(,, SC),
(좋, VA),
(은데, EF),
(?, SF)]
]
.full-image[]
-
형태소 분석 모듈 간 성능 비교
- 형태소 분석기는 속도, 메모리 사용, 정확도 등으로 성능 평가
- One-size-fits-all 이라기보다는 서로 장단점이 있는 경우가 많음
- 알고리즘 뿐 아니라 사전의 영향도 매우**2 큼
- 자신의 목적/취향에 맞는 분석기+사전 조합을 사용
.center[]
.footnote[
* Warning!
(1) 형태소 분석기 간 직접적인 비교가 아니라, KoNLPy 내부 모듈 간 비교입니다.
(2) POS tagging은 형태소 분석과 구분됩니다. 자세한 설명은 구글신께 양보드립니다 :)]
class: center, middle, full-text
좀 더 재밌는걸 해봅시다!
- 목적: 파이썬만으로 웹문서에서 중요한 명사를 뽑아 워드클라우드로 그리기!
.width-50.small-image[]
.width-50.small-image[]
.footnote[
* 코드는 지면상 여기에서: http://konlpy.readthedocs.org/en/latest/examples/wordcloud/ (재밌는 예제들도 더 있어요!)
]
.full-image[]
http://pokr.kr/person/1958194
- 사전 interface 통일
konlpy.download()
: 코퍼스, 사전 등 data file을 소스코드에서 분리
- GCJ 등을 활용해서 JVM을 따로 구동하지 않는 방법 고려
- Python3 support
- 한국어 documentation?
class: center, middle, full-text
시간이 좀 남았나요?
-
문자의 정체 확인하기
>>> 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']
-
한글 romanize하기
>>> from unidecode import unidecode
>>> unidecode(u'파이콘')
'paikon'
-
한자, 한글, 영문가 섞여 있는 경우
- Multilingual NLP에서 제안하는 다양한 접근법이 있습니다.
- 간단한 꼼수 한 가지는: "한자 전처리, 영문 후처리"
- 한자는 transliterate하고 (ex: '丁新闻' -> 정신문)
- 한국어 처리를 한 후에 (ex: POS tagging)
- 영문으로 분류된 tag에 한해 따로 stemming 등을 거침
class: center, middle, inverse, full-text
감사합니다 :D
http://lucypark.kr
@echojuliett