AI 그게 뭔데
끄적끄적 개발일지
AI 그게 뭔데
전체 방문자
오늘
어제
  • 분류 전체보기 (342)
    • 논문 (5)
    • DL(Deep-Learning) (34)
      • 개념 (14)
      • Python 기초 (14)
      • Tensorflow (6)
      • Pytorch (0)
    • NLP (10)
    • OpenCV (53)
    • DevOps (10)
      • AWS (2)
      • Docker & Kubernetes (4)
      • Spark (3)
      • SQL (1)
    • MacOS (1)
    • React-Native (2)
    • BI (3)
      • GA(Google Analytics) (3)
      • Tableau (0)
    • 알고리즘 (221)
      • 백준 (76)
      • 프로그래머스 (108)
      • 기타 알고리즘 (37)

인기 글

태그

  • level1
  • 알고리즘
  • LEVEL2
  • 연습문제
  • OpenCV
  • 백준
  • 파이썬
  • Python
  • 이코테
  • 프로그래머스

최근 글

hELLO · Designed By 정상우.
AI 그게 뭔데

끄적끄적 개발일지

NLP

토큰화 Tokenization

2022. 1. 27. 22:02

말뭉치 또는 코퍼스(Corpus)는 자연언어 연구를 위해 특정한 목적을 가지고 언어의 표본을 추출한 집합이다.

 

주어진 코퍼스(corpus)에서 토큰(token)이라 불리는 단위로 나누는 작업을 토큰화(tokenization)라고 부릅니다.

토큰의 단위가 상황에 따라 다르지만, 보통 의미있는 단위로 토큰을 정의합니다.

 

토큰화는 문장 형태의 데이터를 처리하기 위해 제일 처음 수행해야 하는 기본적인 작업이며, 주로 텍스트 전처리 과정에서 사용된다.  토큰화를 어떻게 하느냐에 따라 성능에 차이가 난다.

 

예를들어 "This is a pen" 이라는 말뭉치(Corpus)가 있을 때 토큰화를 하면 "this", "is", "a", "pen"으로 나뉜다.

한국어 문장을 예를 들면, "아버지가 방에 들어가신다" 를 토큰화 하면 "아버지", "가", "방", "에", "들어가", "신다" 로 나뉜다.

 

토큰화는 단어 토큰화(Word Tokenization)와 문장 토큰화(Sentence Tokenization) 로 나뉜다.

 

 

단어 토큰화(Word Tokenization)

corpus에서 토큰의 기준을 단어(word)로 하는 경우, 단어 토큰화(word tokenization)라고 한다.

단어 토큰화는 기본적으로 띄어쓰기를 기준으로 한다.

영어는 보통 띄어쓰기로 토큰이 구분되는 반면, 한국어는 띄어쓰기 만으로 토큰을 구분하기는 어렵다. 

 

 

# 영어

- NLTK 모듈 사용

from nltk import word_tokenize

sentence = "When I awoke, the sun had already risen."
words = word_tokenize(sentence)
print(words)

['When', 'I', 'awoke', ',', 'the', 'sun', 'had', 'already', 'risen', '.']

 

띄어쓰기를 기반으로 분리를 하되 콤마(,)와 마침표(.)는 별도의 토큰으로 구분했다.

어퍼스트로피(')가 있는 경우에는 어떻게 구분할까?

 

sentence = "Don't be too sorry about it. "
words = word_tokenize(sentence)
print(words)

['Do', "n't", 'be', 'too', 'sorry', 'about', 'it', '.']

 

Don't를 "Do", "n't"로 구분하였다.

구두점으로 분류를 하는 WordPunctTokenizer로도 확인해보자.

 

from nltk.tokenize import WordPunctTokenizer

sentence = "Don't be too sorry about it. Jone's say that. "
words = WordPunctTokenizer().tokenize(sentence)
print(words)

['Don', "'", 't', 'be', 'too', 'sorry', 'about', 'it', '.', 'Jone', "'", 's', 'say', 'that', '.']

 

어퍼스트로피(')도 별도의 토큰으로 보고 분류가 된 것을 볼 수 있다.

 

 

- Keras 사용

from tensorflow.keras.preprocessing.text import text_to_word_sequence

sentence = "Don't be too sorry about it. Jone's say that. "
words = text_to_word_sequence(sentence)
print(words)

["don't", 'be', 'too', 'sorry', 'about', 'it', "jone's", 'say', 'that']

 

케라스의 text_to_word_sequence는 기본적으로 모든 알파벳을 소문자로 바꾸고 마침표나 컴마, 느낌표 등의 구두점을 제거한다.

하지만 don't나 jone's와 같은 경우 어퍼스트로피(')는 보존하는 것을 볼 수 있다.

 

 

# 한국어

한국어의 경우 형태소 분석기를 활용하여 단어 토큰화를 진행 할 수 있다.

 

앞의 포스팅을 참고하면 좋을 것 같다.

 

 

문장 토큰화(Sentence Tokenization)

문장 토큰화는 문장의 마침표(.), 개행문자(\n), 느낌표(!), 물음표(?) 등 문장의 마지막을 뜻하는 기호에 따라 분리하는 것이 일반적이다. 

하지만 마침표(.)로 문장을 구분짓는다고 가정하면, 문장의 끝이 나오기 전에 이미 마침표가 여러번 등장할 경우 제대로 분리가 되지 않는다. 예를들면 "I'm a Ph.D student. Nice to meet you." 라는 문장이 "I'm a Ph.D student", "Nice to meet you" 라는 두 문장으로 나누고싶은데 마침표를 기준으로 하면 "I'm a Ph" ," D student", "Nice to meet you" 3개의 문장으로 구분이 된다.       

 

 

# 영어

- NLTK 모듈 사용

from nltk import sent_tokenize

text_sample = 'A.I is evolving. I look forward to the future.'
tokenized_sentences = sent_tokenize(text_sample)
print(tokenized_sentences)

['A.I is evolving.', 'I look forward to the future.']

 

NLTK 에서 마침표를 기준으로 하지 않아 잘 구분이 되었음을 확인할 수 있다.

 

 

# 한국어

pip install kss

 

import kss

text='자연어 처리는 흥미롭다. 하지만 한국어로 자연어 처리는 어렵다. 앞으로 배울게 많다.'
print(kss.split_sentences(text))

['자연어 처리는 흥미롭다.', '하지만 한국어로 자연어 처리는 어렵다.', '앞으로 배울게 많다.']

'NLP' 카테고리의 다른 글

정수 인코딩 (Integer Encoding)  (0) 2022.01.27
어간 추출(Stemming)과 표제어 추출(Lemmatization)  (0) 2022.01.27
불용어(Stop word) 제거  (0) 2022.01.27
형태소 분석기  (0) 2022.01.27
자연어 처리(Natural Language Processing)란 무엇인가?  (0) 2022.01.27
    AI 그게 뭔데
    AI 그게 뭔데
    공부와 개발 그리고 AI가 약간 첨가된 흔적 남기기

    티스토리툴바