*개인적으로 공부한 내용을 백업한 것으로 설명이 불친절합니다.
위키독스(https://wikidocs.net/21698) 를 보고 공부한 내용입니다.
프로보노 프로젝트에서 머신러닝 엔진을 정한 후 전처리 개발을 맡아 개발하던 중 전처리를 해야 하는 이유와 자연어를 토큰화하고 인덱싱해야하는 근본적인 이유에 대해 의문점이 생겨 개인적으로 공부하게 되었다.
또한 우리가 사용하고자 하는 데이터 셋은 한국어로 된 자연어이기 때문에 기존 영어 파이썬 자연어 처리(Natural Language Processing, NLP) 라이브러리를 사용했을 때 제대로 처리가 되지 않았다. 그 이유도 함께 알아보고자 하였다.
토큰화를 한다는게 뭐지? 토큰화란?
자연어 처리에서 크롤링 등으로 얻어낸 코퍼스 데이터가 필요에 맞게 전처리되지 않은 상태라면 해당 데이터를 사용하고자 하는 용도에 맞게 토큰화, 정제, 정규화 해야한다. 토큰화란 주어진 코퍼스(corpus)에서 토큰(token)이라 불리는 단위로 나누는 작업이다.
단어 토큰화
토큰의 기준을 단어(word)로 하는 경우, 단어 토큰화라고 한다. 여기서 단어는 단어 단위 외에도 단어구, 의미를 갖는 문자열로도 간주된다. 예를 들어 문자를 제외시키는 간단한 단어 토큰화 작업을 수행해보면
입력>>> Time is an illusion. Lunchtime double so!
출력>>> "Time", "is", "an", "illustion", "Lunchtime", "double", "so"
구두점을 지운 뒤에 띄어쓰기를 기준으로 잘라낸 가장 기초적인 토큰화이다.
보통 토큰화 작업은 단순히 구두점이나 트수문자를 전부 제거하는 정제 작업을 수행하는 것만으로 해결되지 않는다. 구두점이나 특수문자를 전부 제거하면 토큰이 의미를 잃어버리는 경우가 발생하기 때문이다. 또한, 띄어쓰기 단위로 자르면 사실상 단어 토큰이 구분되는 영어와 달리 한국어는 띄어쓰기만으로 단어 토큰을 구분하기 어렵다. (어려운 점)
토큰화에서 고려해야 할 사항
1. 구두점이나 특수 문자를 단순 제외해서는 안된다.
예) AT&T, m.p.h, $45.55, 02/04/12 등
2. 줄임말과 단어 내에 띄어쓰기가 있는 경우
예) rock n roll
사용 용도에 따라서 하나의 토큰으로 봐야 하는 경우도 있을 수 있으므로, 토큰화 작업은 단어를 하나로 인식할 수도 있어야 한다.
3. 영어보다 한국어 자연어 처리가 어렵다. (문장 토큰화)
=>KSS 라이브러리를 추천
영어는 New York과 같은 합성어나 he's 와 같이 줄임말에 대한 예외처리만 한다면, 띄어쓰기(whitespace)를 기준으로 하는 띄어쓰기 토큰화를 수행해도 단어 토큰화가 잘 작동한다. 거의 대부분의 경우에서 단어 단위로 띄어쓰기가 이루어지기 때문에 띄어쓰기 토큰화와 단어 토큰화가 거의 같기 때문이다.
하지만 한국어는 영어와는 달리 띄어쓰기만으로는 토큰화를 하기에 부족하다. 한국어의 경우에는 띄어쓰기 단위가 되는 단위를 '어절'이라고 하는데 어절 토큰화와 단어 토큰화가 같지 않기 때문이다. 그 근본적인 이유는 한국어가 영어와는 다른 형태를 가지는 조사, 어미 등을 붙여서 말을 만드는 언어라는 점에서 시작된다.
품사 태깅(POS, part of speeh tagging)
단어는 표기는 같지만, 품사에 따라서 단어의 의미가 달라지기도 한다. 한국어에서 '못'이라는 단어는 명사로서는 망치를 사용해서 목재 따위를 고정하는 물건을 의미하지만 부사로서의 '못'은 '먹는다', '달린다'와 같은 동작 동사를 할 수 없다는 의미로 쓰인다. 즉, 결국 단어의 의미를 제대로 파악하기 위해서는 해당 단어가 어떤 품사로 쓰였는지 보는 것이 주요 지표가 된다. 그에 따라 단어 토큰화 과정에서 각 단어가 어떤 품사로 쓰였는지를 구분해놓기도 하는데, 이 작업을 품사 태깅(part-of-speech tagging)이라고 한다.
영어 라이브러리는 NLTK, 한국어 라이브러리는 KoNLPy 파이썬 패키지를 사용한다.
KoNLPy의 형태소 분석기로는 Okt, Mecab, Komoran, Hannanum, Kkma가 있다.
'프로젝트 > 2021 한이음(probono)' 카테고리의 다른 글
[프로보노프로젝트/딥러닝] 텍스트 데이터 양 늘리기 (Text Data Augmentation) (4) | 2021.08.09 |
---|---|
[프로보노프로젝트/오류해결] AttributeError: 'float' object has no attribute 'lower' (0) | 2021.07.31 |
[프로보노프로젝트/딥러닝] RNN과 LSTM (0) | 2021.07.24 |
[프로보노프로젝트/딥러닝] 딥러닝 기초 (0) | 2021.07.16 |
[프로보노 프로젝트] ICT 수행계획서 작성 (1) | 2021.04.17 |