본문 바로가기

2016

2016. 7. 28 /  쭈르꾸미



저는 언어학과 컴퓨터 과학을 이중 전공해서 언어학도와 컴공학도의 이질적(?) 삶에 대해 잘 알고 있습니다만... 요새 순수 언어학만 전공하는 제 동기들을 보면 Python 을 정말 열심히 배우는 것 같습니다. 파이썬은 문법도 되게 간결해서 컴맹도 배울 수 있고, 자연어 처리를 위한 수많은 라이브러리들의 강력한 기능을 쓸 수 있거든요

오늘 제가 다룰 NLTK 는 파이썬에서 자연어 처리를 할 수 있게 해주는 편리한 라이브러리입니다. 

NLTK 설치

** 파이썬이 설치 안된 분은 파이썬부터 설치하세요.

1. 윈도우 사용자
https://pypi.python.org/pypi/nltk 에 가서 nltk-3.x.x.win32.exe 를 내려받아 실행해서 설치하면 됩니다. 

2. 맥/유닉스 사용자
터미널을 실행해서 다음 명령어를 입력하세요.
sudo pip install -U nltk

잘 설치가 되어있는지 확인하려면 Python IDLE 에서 import nltk 를 해보세요. 아무런 에러가 나오지 않으면 제대로 설치된 것입니다. 


자연어 처리할 샘플 문자열 내려받기

NLTK 에서는 처음 설치하고 처리할 문자열이 없는 저 같은 잉여들을 위해 book 이라는 모듈에 다양한 책들을 내장시켜 놓았습니다. 이 책들은 
nltk.download()

을 파이썬 IDLE 에 입력함으로써 내려받을 수 있습니다. 그리고 나서 아래와 같은 창이 뜰건데요,


오늘은 book 만 이용해서 자연어 처리를 해보도록 하겠습니다. (제일 용량이 작아요)


텍스트 불러오기

내려받았으면 파이썬에 불러와야겠죠. 

from nltk.book import *
을 입력합니다. 대략 코드를 설명해보자면, "nltk의 book 라는 모듈에서(from) 모든 것(*)을 import 해와라" 가 되겠습니다.

>>> from nltk.book import *
*** Introductory Examples for the NLTK Book ***
Loading text1, ..., text9 and sent1, ..., sent9
Type the name of the text or sentence to view it.
Type: 'texts()' or 'sents()' to list the materials.
text1: Moby Dick by Herman Melville 1851
text2: Sense and Sensibility by Jane Austen 1811
text3: The Book of Genesis
text4: Inaugural Address Corpus
text5: Chat Corpus
text6: Monty Python and the Holy Grail
text7: Wall Street Journal
text8: Personals Corpus
text9: The Man Who Was Thursday by G . K . Chesterton 1908

총 9개 텍스트를 불러왔습니다. text1, text2, text3, ... text9 은 각각의 책에 부여된 이름입니다. 예를 들어 모비딕은 text1 이라고 부르기로 약속한 것입니다. 


각종 기능 탐구

1. concordance: 단어가 쓰인 모든 경우의 문맥을 찾아줌 (색인)

concordance 는 색인이라는 뜻인데, 책 맨 뒷장에 있는 그 색인을 생각하시면 될 것 같습니다. 색인 보시면 책에 나온 단어들이 나열되어 있고 그 단어가 쓰인 페이지 수를 보여주잖아요. NLTK 의 concordance 는 텍스트에서 주어진 단어가 쓰인 문맥을 다 찾아줍니다.

>>> text4.concordance("terror")
Displaying 8 of 8 matches:
menaces , by fraud or violence , by terror , intrigue , or venality , the Gove
ameless , unreasoning , unjustified terror which paralyzes needed efforts to c
ublic seemed frozen by a fatalistic terror , we proved that this is not true .
 to alter that uncertain balance of terror that stays the hand of mankind ' s 
eans freeing all Americans from the terror of runaway living costs . All must 
still . They fuel the fanaticism of terror . And they torment the lives of mil
d maintain a strong defense against terror and destruction . Our children will
k to advance their aims by inducing terror and slaughtering innocents , we say


저는 미국 대통령들의 역대 연설을 모아둔 text4 에서 terror 라는 낱말이 쓰인 문맥을 찾아봤습니다. violence, unjustified, fatalistic 같은 단어들이 보이네요.

2. similar: 주어진 단어와 비슷한 환경에서 쓰인 단어를 찾아줌

아까 미국 대통령 연설문에서 terror 라는 단어가 어디에 쓰였는지 찾아봤을 때 unjustified _________, fatalistic __________ 와 같이 단어가 쓰이는 환경이 있다는 걸 확인하셨을텐데요. similar 은 텍스트 안에서 terror 와 비슷한 환경에서 쓰인 단어를 찾아줍니다. 한번 해볼까요?

>>> text4.similar("terror")
life congress knowledge power liberty peace freedom suffering wealth
duty nations war history government idealism good legislation

단어의 뜻이 비슷한 것이랑 착각하시면 안됩니다. 순전히 쓰이는 환경이 비슷한 단어들을 찾아주는 것이라고 기억하세요. 대략 congress, legislation, nations 같은 단어들이 많이 보입니다. 아무래도 정치적으로 테러라고 하면 폭탄 테러 같은 경우에 많이 쓰이니까 그런 것일까요? 다른 텍스트에서는 terror 와 비슷한 환경에서 쓰인 단어에 어떤 것이 있는지 찾아보겠습니다. 


>>> text1.similar("terror")

man thing way ship bone harpooneer distance sound speed sign sight

whale night picture land voyage whaling repose circle battle


 결국 대통령 연설문에서 쓰인 terror 의 느낌과 소설책에서 쓰인 terror의 느낌이 다르다는 것을 알수 있었습니다. 하지만 둘다 문장이 얼마 없어서인지 의미있는 결과는 없네요.

3. dispersion_plot: 텍스트 내 단어 사용 빈도와 위치를 분산 그래프로 그려줌

백 번 설명 보단 한 번 보는게 더 나은 아주 유용한 기능입니다. 

text4.dispersion_plot(["citizens", "democracy", "freedom", "duties", "America"])

 text4 은 우선 옛날-현재 순으로 미국 대통령들의 연설이 나열되어있습니다. 이 점을 이용해서 다섯 개 단어가 시간을 흐르면서 얼마나 자주 사용됐었는지 알아본 예제였습니다.

참고로, plot 기능을 이용하기 위해서는 NumPy 가 설치되어있어야 합니다. 


4. word_tokenize : token 나누기

>>> sentence = "It was always hard for me to shine and try to immortalize my name."
>>> tokens = nltk.word_tokenize(sentence)
>>> tokens
['It', 'was', 'always', 'hard', 'for', 'me', 'to', 'shine', 'and', 'try', 'to', 'immortalize', 'my', 'name', '.']

5. pos_tag: 품사 태깅

>>> tagged = nltk.pos_tag(tokens)
>>> tagged
[('It', 'PRP'), ('was', 'VBD'), ('always', 'RB'), ('hard', 'RB'), ('for', 'IN'), ('me', 'PRP'), ('to', 'TO'), ('shine', 'VB'), ('and', 'CC'), ('try', 'VB'), ('to', 'TO'), ('immortalize', 'VB'), ('my', 'PRP$'), ('name', 'NN'), ('.', '.')]


영어 분야에서는 자연어 처리 연구가 꽤나 진전되어있는 상태입니다. 다음에는 한국어 자연어 처리 모듈도 공부해봐야겠습니다.


크리에이티브 커먼즈 라이선스
Creative Commons License


[원문출처 : http://il-q.tistory.com/entry/파이썬과-함께하는-자연어-처리-NLTK]

공개SW 기술팁 - 번호, 제목, 조회수, 작성
번호 제목 작성 조회수
3 파이썬을 배우자! 온라인 교육 사이트 8선 file 2018-06-29 3967
2 [파이썬] 파이썬과 함께하는 자연어 처리: NLTK 2016-12-30 3750
1 [IT열쇳말] 파이썬 2016-09-23 2866
맨 위로
맨 위로