Pytorch로 시작하는 딥러닝 입문(09-01. 토큰화)

2024. 3. 25. 22:22딥러닝 모델: 파이토치

자연어 처리에서 코퍼스 데이터가 필요에 맞게 전처리되지 않은 상태라면 해당 데이터를 사용하고자 하는 용도에 맞게 토큰화(tokenization), 정제(cleaning), 정규화(normalization)하는 일을 하게 된다. 여기서는 그 중 토큰화에 대해 학습한다. 

 

주어진 코퍼스(corpus)에서 토큰(token)이라고 불리는 단위로 나누는 작업을 토큰화(tokenization)이라고 한다. 토큰의 단위는 상황에 따라 다르지만 보통 의미 있는 단위로 토큰을 정의한다.

 

♣ 단어 토큰화(Word Tokenization)

토큰의 기준을 단어(word)로 하는 경우, 단어 토큰화(word tokenization)이라고 한다. 여기서 단어는 단어 단위 외에도 단어구, 의미를 갖는 문자열로도 간주된다. 

 

♣ 토큰화 중 생기는 선택의 순간

토큰화 중에는 예상하지 못한 경우가 발생할 수 있어서 토큰화의 기준을 생각해야 한다. 영어권 언어에서 ' 가 들어있는 단어를 어떻게 토큰으로 분류해야 하는지 선택한다고 가정해보자. 

 

Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop.

 

여기서 '가 들어간 Don't와 Jone's를 어떻게 토큰화할지 선택할 수 있다. 

 

ex) Don't, Don t, Dont, Do n't

ex) Jone's, Jone s, Jone, Jones

 

사용자가 원하는 결과가 나오도록 토큰화 도구를 직접 설계할 수도 있고, 기존에 공개된 도구들을 사용할 수도 있다. 

 

NLTK는 영어 코퍼스를 토큰화하기 위한 도구들을 제공한다. 그 중 word_tokenizeWordPunctTokenizer를 이용해서 '를 어떻게 처리하는지 확인해보자. 

 

 

word_tokenize가 Don't 를 Do와 n't로 분리하였으며 Jone's는 Jone과 's로 분리한 것을 확인할 수 있다. 

 

wordPunctTokenizer는 '를 어떻게 처리할까?

 

WordPunctTokenizer는 구두점을 별도로 분류하는 특징을 갖고 있기 때문에 앞서 사용한 word_tokenize와는 달리 Don't를 Don과 '와 t로 분리하였으며 Jone's를 Jone과 '와 s로 분리한 것을 확인할 수 있다. 

 

keras도 토큰화 도구로써 text_to_word_sequence를 지원한다. 

 

keras의 text_to_word_sequence는 기본적으로 모든 알파벳을 소문자로 바꾸면서 마침표, comma, 느낌표 등의 구두점을 제거한다. 하지만 don't나 jone's와 같은 경우 '는 보존하는 것을 확인할 수 있다. 

 

 

♣ 토큰화에서 고려해야 할 사항

1. 구두점이나 특수 문자를 단순 제외해서는 안 됨

 

주어진 corpus에서 단어들을 걸러낼 때 구두점이나 특수 문자를 단순히 제외하는 것은 옳지 않다. 예를 들면 마침표 같은 경우, 문장의 경계를 아는 데 도움이 된다. 

 

 

2. 줄임말과 단어 내에 띄어쓰기가 있는 경우

 

줄임말 예시: We're, I'm 등

단어 내 띄어쓰기 예시: New York, rock'n roll

 

용도에 따라서 하나의 단어 사이에 띄어쓰기가 있는 경우에도 하나의 토큰으로 봐야 하는 경우가 있다. 토큰화 작업은 위와 같은 단어를 하나로 인식하는 능력도 가져야 한다. 

 

 

3. 표준 토큰화 예제

 

표준 토큰화 중 하나인 Penn Treebank Tokenization 규칙

 

규칙1. 하이푼(-)으로 구성된 단어는 하나로 유지한다. 

규칙2. doesn't와 같이 '로 접는 부분이 함께하는 단어는 분리한다. 

 

 

♣ 문장 토큰화(Sentence Tokenization)

토큰의 단위가 문장(sentence)일 경우를 논의해보자. 이는 코퍼스 내에서 문장 단위로 구분하는 작업으로 때로는 문장 분류(sentence segmentation)라고도 부른다. 사용하는 코퍼스나 어느 국적의 언어인지, 해당 코퍼스 내에서 특수문자들이 어떻게 사용되고 있는지에 따라서 직접 규칙들을 정의할 수 있다. 

 

NLTK에서는 영어 문장의 토큰화를 수행하는 sent_tokenize를 지원한다. NLTK를 통해 문장 토큰화를 실습해보자. 

 

위 코드는 text에 저장된 여러 개의 문장들로부터 문장을 구분하는 코드다. 출력 결과를 보면 모든 문장을 성공적으로 구분했음을 알 수 있다. 이번에는 문장 중간에 마침표가 다수 등장하는 경우를 실습해보자 .

 

NLTK는 단순히 마침표를 구분자로 하여 문장을 구분하지는 않았기 때문에 Ph.D.를 문장 내의 단어로 보고 성공적으로 인식한다. 한국어에 대한 문장 토큰화 도구 중에 KSS(Korean Sentence Splitter. by 박상길님)가 있다.

 

 

 

♣ 품사 태깅

단어의 표기는 같지만 품사에 따라서 의미가 달라지기도 한다. 예를 들어 명사 '못'과 부사 '못'의 의미는 완전히 다르다. 단어의 의미를 제대로 파악하기 위해서는 해당 단어가 어떤 품사로 쓰였는지 살펴봐야 한다. 그에 따라 단어 토큰화 과정에서 각 단어가 어떤 품사로 쓰였는지 구분해놓기도 하는데, 이 작업을 품사 태깅(part-of- speech tagging)이라고 한다. 

 

NLTK와 KoNLPy를 통해 품사 태깅 실습을 해보자. 

 

Penn Treebank POG Tags에서 PRP는 인칭대명사, VBP는 동사, RB는 부사, VBG는 현재부사, IN은 전치사, NNP는 고유 명사, NNS는 복수형 명사, CC는 접속사, DT는 관사를 의미한다. 

 

한국어 자연어 처리를 위해서는 KoNLPy 파이썬 패키지를 사용할 수 있다. KoNLPy를 통해서 사용할 수 있는 형태소 분석기로는 Okt(Open Korea Text), 메캅(Mecab), 코모란(Lomoran), 한나눔(Hannanum), 꼬꼬마(Kkma)가 있다. 

 

<Okt 예시>

 

각각의 메소드는 아래와 같은 기능을 갖는다. 

 

morphs: 형태소 추출

pos: 품사 태깅

nouns: 명사 추출

 

KoNLPy의 형태소 분석기들은 공통적으로 위의 메소드들을 제공한다. 한국어 NLP에서 전처리에 형태소 분석기를 사용하는 것은 굉장히 유용하다. 

 

<Kkma 예시>

 

앞서 사용한 Okt 형태소 분석기와 결과가 다른 것을 확인할 수 있다. 사용하고자 하는 용도에 대해 어떤 형태소 분석기가 가장 적절한지 판단하여 사용하면 된다.