4.3 토큰화

유명곤·5일 전

텍스트를 모델에 넣으려면 무엇을 하나의 입력 단위로 볼지 정해야 한다. 같은 문장도 어디서 나누느냐에 따라 모델이 받는 단위와 그 개수가 달라진다. 토큰화(Tokenization)는 텍스트를 일정한 기준에 따라 토큰(Token)이라는 단위로 나누는 작업이다.

경계를 나누는 일과 내용을 지우는 일

토큰이 항상 사전에 실린 단어 하나인 것은 아니다. 문장 토큰화(Sentence tokenization)는 글에서 문장의 경계를 찾고, 단어 토큰화(Word tokenization)는 문장 안의 단어 등을 구분한다. 긴 글을 문장으로 나눈 뒤 각 문장을 다시 단어로 나눌 수도 있다. 어떤 단위를 만들려는지에 따라 분리 기준도 달라진다.

토큰화는 불필요한 내용을 제거하는 정제(Cleaning)나 표기 차이를 일정한 형태로 맞추는 정규화(Normalization)와 구분한다. 문자열을 공백에서 나누는 것, HTML 태그를 지우는 것, 영문을 소문자로 바꾸는 것은 서로 다른 결정이다. 한 도구가 여러 작업을 함께 처리하더라도 무엇이 나뉘고 무엇이 바뀌는지 알아야 한다.

구두점은 이 차이를 보여 준다. 소수 12.50을 한 토큰으로 둘 수도 있고 12, ., 50으로 나눌 수도 있다. 그러나 점을 삭제해 1250으로 만들면 원래 값이 달라진다. 경계를 나누는 것과 문자를 없애는 것은 같은 작업이 아니다. NLTK의 word_tokenize와 WordPunctTokenizer도 공식 예시에서 소수점을 서로 다르게 처리한다.

문장 분리에서도 마침표를 모두 문장의 끝으로 볼 수 없다. 소수점이나 Ph.D.처럼 약어에 포함된 점은 문장 내부에 나타날 수 있기 때문이다. sent_tokenize 같은 문장 분리 도구와 단어 분리 도구는 해결하려는 경계 문제가 다르다.

한국어에서는 한 어절에 여러 형태소가 들어간다

한국어에서 띄어쓰기로 구분한 단위를 어절(Eojeol)이라고 한다. 한국어는 조사와 어미 등이 붙어 문법 관계를 나타내는 교착어(Agglutinative language)이므로, 한 어절을 그대로 토큰으로 쓰면 어휘와 문법 요소가 함께 묶일 수 있다.

형태소(Morpheme)는 뜻이나 문법적 기능을 가진 가장 작은 말의 단위다. 형태소 분석(Morphological analysis)은 이런 단위를 구분한다. 공백 위치만 찾는 분리와 달리, 어절 안의 구성을 파악해야 한다.

학생이, 학생을, 학생에게를 각각 하나의 토큰으로 두면 세 표현은 서로 다른 문자열이다. 조사를 분리하면 공통 부분인 학생을 같은 단위로 다루고, 문법 관계를 나타내는 부분은 따로 남길 수 있다. 다음은 분석기의 출력이 아니라 설명을 위해 직접 나눈 예시다.

기준민수가 밥을 먹었다를 나눈 단위
어절민수가, 밥을, 먹었다
형태소민수, 가, 밥, 을, 먹, 었, 다

형태소는 혼자 쓰일 수 있는 자립 형태소와 다른 형태소에 붙어 쓰이는 의존 형태소로 구분한다. 조사와 어미뿐 아니라 먹- 같은 용언의 어간도 의존 형태소다. 따라서 형태소를 모두 독립된 단어라고 생각하면 안 된다.

형태소 분석을 쓴다고 항상 정확히 나뉘는 것은 아니다. 띄어쓰기 오류, 신조어, 비표준 표현이 있는 자료에서는 분석 결과가 달라질 수 있다. 한국어라는 이유만으로 모든 모델에 같은 형태소 분석을 적용할 필요도 없다.

분석기와 메서드에 따라 남는 정보가 달라진다

KoNLPy는 여러 한국어 분석기를 Python에서 사용할 수 있게 제공한다. Okt(Open Korean Text)와 꼬꼬마(Kkma)는 같은 이름의 메서드로 형태소, 품사, 명사를 얻을 수 있다.

메서드얻는 정보
morphs(text)분석한 형태소의 목록
pos(text)형태소와 품사 태그의 쌍
nouns(text)추출한 명사의 목록

품사 태깅(Part-of-speech tagging)은 토큰이 명사·동사·조사 등 어떤 품사로 쓰였는지 표시한다. 표면 문자열만 볼 때보다 문법적 역할에 관한 정보를 더 얻지만, 태그가 단어의 모든 의미를 나타내지는 않는다.

같은 메서드를 써도 분석기마다 분리 기준과 품사 체계가 다르다. 교재에 실린 결과에서 연휴에는은 Okt가 연휴, 에는으로, Kkma가 연휴, 에, 는으로 나눈다. 이는 교재의 예시이며 직접 실행한 결과가 아니다. morphs라는 이름만으로 분리 결과가 서로 같거나 학교 문법과 완전히 일치한다고 볼 수 없다.

Okt는 norm으로 표기를 정규화하고 stem으로 용언을 기본형으로 바꿀 수 있다. 두 옵션의 기본값은 False다. 분석 결과를 비교할 때는 분석기 이름뿐 아니라 옵션과 버전도 함께 봐야 한다.

나눌 기준은 모델에 필요한 정보에서 정한다

명사 추출은 글의 대상을 파악하는 데 도움이 될 수 있지만, 감성분류에 필요한 정보를 충분히 남긴다고 보장하지는 않는다. 이야기는 좋았다와 이야기는 좋지 않았다에서 명사만 남기면 반대되는 평가를 구분할 단서를 잃을 수 있다. 자주 등장하거나 조사·어미라는 이유만으로 제거 여부를 결정해서는 안 된다.

토큰을 짧게 나누는 것 자체가 목표는 아니다. 어떤 표현을 같은 단위로 묶을지, 어떤 차이를 남겨야 문제를 풀 수 있을지가 기준이다. 토큰화가 끝나도 결과는 문자열 단위의 나열이다. 이를 모델 입력으로 쓰려면 정수 번호를 붙이고 벡터와 연결하는 과정이 이어진다. 토큰화는 그보다 앞서 무엇을 하나의 단위로 셀지 정한다.

참고자료

profile
Werde, der du bist!

0개의 댓글