반응형
토큰화 ?
주어진 코퍼스(corpus)에서 토큰(token)이라 불리는 단위로 나누는 작업을 토큰화(tokenization)라고 함.
문제상황
Keras로 다중 클래스 분류 문제에서 모델 정확도 향상에 전처리 단계를 검토하는 중
현 개발중인 모델에서는
from keras.preprocessing.text import Tokenizer
를 사용하고 있지만, keras.preprocessing과 nltk 두개의 tokenizers 둘 중에 어떤 토큰화가 좋을까? 의문에서 시작.
keras.preprocessing vs nltk.tokenize
기본적으로 둘 다 일부 정규식 기반 토큰화를 사용하고 있음. 차이점은 복잡성(complexity)에 있음.
- Keras Tokenizer : 특정 구두점 문자를 대체하고 나머지 공백 문자를 분할.
- NLTK tokenize : Treebank 토크나이저를 사용하여 Penn Treebank에서와 같이 정규식을 사용하여 텍스트를 토큰화함.
분할 표준 수축(split standard contractions), ex) [don't -> do, n't] , [they'll -> they, 'll]
대부분 구두점 문자는 별도의 토큰으로 취급
공백이 뒤에 오는 경우 쉼표와 작은 따옴표 분리
줄 끝에 나타나는 별도의 마침표
예제(nltk의 예제) 비교 분석
- nltk.tokenize
from nltk.tokenize import TreebankWordTokenizer
sentences = '''Good muffins cost $3.88\nin New York. Please buy me\ntwo of them.\nThanks.'''
TreebankWordTokenizer().tokenize(s)
결과값 :
['Good',
'muffins',
'cost',
'$',
'3.88',
'in',
'New',
'York.',
'Please',
'buy',
'me',
'two',
'of',
'them.',
'Thanks',
'.']
- keras.preprocessing.text
from keras.preprocessing.text import Tokenizer
sentences = ['''Good muffins cost $3.88\nin New York. Please buy me\ntwo of them.\nThanks.''']
tokenizer = Tokenizer(num_words = 100)
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_index
print(word_index)
결과값 :
{'good': 1, 'muffins': 2, 'cost': 3, '3': 4, '88': 5, 'in': 6, 'new': 7, 'york': 8, 'please': 9, 'buy': 10, 'me': 11, 'two': 12, 'of': 13, 'them': 14, 'thanks': 15}
둘 다 정규식 기반 토큰화를 사용하기에 실행은 매우 빠름.
느껴지는 가장 큰 차이점을 이야기하자면, " we've "를 nltk는 ' we ', " 've "로 분류한 반면, keras는 " we've "로 분류함.
nltk는 대소문자를 구별하는 반면, keras는 모두 소문자로 치환함.
숫자, 날짜 등을 올바르게 구문 분석하고 품사 태깅, 엔티티 인식을 수행할 수 있는 신경망 기반 신경망을 실제로 원한다면 다음을 고려해볼 수 있음.
- 텍스트 처리, 종속성 찾기, 엔터티 인식 등을 위한 전체 파이프라인을 제공하는 Stanford CoreNLP
- SpaCy 는 또한 유사한 결과를 제공할 뿐만 아니라 GloVe와 같은 해당 단어 벡터를 로드하는 완전한 Python NLP 파이프라인입니다.
위의 두 가지 방법은 정규식 기반 방법보다 느리지만 처리하려는 소스 텍스트에 따라 다름.
반응형
'공부' 카테고리의 다른 글
[NLP] 한글 임베딩 (0) | 2022.12.28 |
---|---|
머신러닝 강의 1편 (1) | 2022.12.21 |
Voting, Bagging, Boosting (0) | 2022.10.28 |
[NLP] Text Vectorization (작성중) (0) | 2022.09.08 |
상관계수의 종류 (0) | 2022.08.30 |