갈루아의 반서재

NLTK (3) - 문장을 단어 단위로 분해하기 Tokenizing sentences into words


이제 문장을 단어 단위로 분해해보자. 텍스트 처리에 있어 단어 리스트를 생성하는 것은 기본적이고도 필수적인 작업니다. 기본적으로 아래와 같이 word_tokenize() 함수를 이용하여 처리가능하다.

from nltk.tokenize import word_tokenize
word_tokenize('Hello world.')
Out[1]:
['Hello', 'world', '.']


word_tokenize() 함수는 TreebankWordTokenizer 클래스의 인스턴스에 tokenize() 함수를 호출하는 래퍼 함수이다. 다음 코드와 같은 의미를 갖는다.

from nltk.tokenize import TreebankWordTokenizer
tokenizer = TreebankWordTokenizer()
tokenizer.tokenize('Hello World.')
Out[1]:
['Hello', 'world', '.']

스페이스와 구두점을 이용해 단어를 분해한다. 그리고 보는 바와 같이, 구두점을 버리지는 않는다. 

이외에 눈여겨 봐야할 2개의 분해기가 있는데, PunktWordTokenizer와 WordPunctTokenizer이 바로 그것이다. 구두점과 축약형을 다루는 방식에서 TreebankWordTokenizer와는 차이가 난다. 


Separating contractions

TreebankWordTokenizer 클래스는 Penn Treebank 말뭉치 규약을 사용한다. 이 말뭉치는 NLP 에서 가장 많이 사용되는 것 중의 하나로, 1980년대 월 스트리트 저널의 기사에 기반해 만들어졌다. 분해기의 주요 규약 중 하나가 축약형을 분해해내는 것이다. 다음의 코드를 보자. 

from nltk.tokenize import word_tokenize
word_tokenize("can't")
Out[2]:
['ca', "n't"]


PunktWordTokenizer

또 하나의 대안은 PunktWordTokenizer 이다. 구두점 기반으로 분해를 하는데, 대신 단어는 보존한다. 아래와 같다. 

from nltk.tokenize import PunktWordTokenizer
tokenizer = PunktWordTokenizer()
tokenizer.tokenize("Can't is a contraction.")
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-3-c7eca3def05d> in <module>()
----> 1 from nltk.tokenize import PunktWordTokenizer
      2 tokenizer = PunktWordTokenizer()
      3 tokenizer.tokenize("Can't is a contraction.")

ImportError: cannot import name 'PunktWordTokenizer'

하지만 위와 같이 오류를 발생시킨다. 해결방법을 찾아보았으나 작동하지 않는다.

ImportError: cannot import name 'PunktWordTokenizer' 


WordPunctTokenizer

WordPunctTokenizer 라는 분해기도 있다. 이 분해기의 경우 모든 구두점을 단위로 분해한다. 아래와 같다.

from nltk.tokenize import WordPunctTokenizer
tokenizer = WordPunctTokenizer()
tokenizer.tokenize("Can't is a contraction.")
Out[5]:
['Can', "'", 't', 'is', 'a', 'contraction', '.']