자연어 처리
1. 자연어
자연어는 인간이 일상적으로 의사소통에 사용하는 언어로, 말과 글을 통해 표현되는 언어를 말합니다. 자연어는 문법, 어휘, 맥락, 뉘앙스 등 복잡한 요소들로 이루어져 있어 규칙적인 구조와 함께 다양한 변형이 가능합니다. 컴퓨터 과학에서는 이러한 자연어를 이해하고 처리하기 위해 자연어 처리(NLP, Natural Language Processing) 기술이 사용되며, 이를 통해 텍스트 분석, 번역, 음성 인식, 챗봇과 같은 다양한 응용이 가능합니다. 자연어는 인간의 사고와 문화적 배경을 반영하므로, 이를 다루는 기술은 인문학적 이해와 기술적 접근이 결합되어야 합니다.
2. 자연어 처리
자연어 처리는(Natural Language Processing, NLP) 컴퓨터가 인간의 언어를 이해하고 처리하며 생성할 수 있도록 돕는 인공지능 기술 분야입니다. 이를 통해 텍스트나 음성 데이터를 분석하고, 번역, 요약, 감정 분석, 질의응답, 음성인식 등 다양한 작업을 수행할 수 있습니다. 자연어 처리는 언어학, 컴퓨터 과학, 인공지능의 융합으로 이루어지며, 형태소 분석, 구문 분석, 의미 분석 등 여러 단계를 포함합니다. 최근에는 딥러닝 기술과 대규모 언어 모델의 발전으로 자연어 처리 성능이 크게 향상되어 챗봇, 검색 엔진, 추천 시스템과 같은 실생활 응용에서 널리 사용되고 있습니다.
3. 토큰화
토큰화(Tokenization)는 텍스트 데이터를 분석하거나 처리하기 위해 문장을 의미 있는 단위로 나누는 과정입니다. 이 단위는 단어, 어절, 형태소, 또는 문자 단위일 수 있으며, 자연어 처리(NLP)의 기초 단계로 매우 중요한 역할을 합니다. 예를 들어, 영어에서는 공백이나 구두점을 기준으로 단어를 나누는 것이 일반적이지만, 한국어나 일본어처럼 공백이 명확하지 않은 언어에서는 형태소 분석기를 사용하여 어절이나 형태소 단위로 나누는 작업이 필요합니다.
문장 토큰화
문장 토큰화는 텍스트를 문장 단위로 나누는 과정입니다. 일반적으로 마침표(.), 물음표(?), 느낌표(!)와 같은 문장 부호를 기준으로 문장을 구분합니다. 예를 들어, "안녕하세요. 오늘 날씨가 좋네요!"라는 문장은 "안녕하세요."와 "오늘 날씨가 좋네요!"로 나눌 수 있습니다. 하지만 약어(예: "Dr.", "Mr.")나 숫자(예: "3.14")처럼 마침표를 포함하지만 문장 경계가 아닌 경우를 처리해야 하므로 복잡한 규칙이나 모델이 필요합니다. 문장 토큰화는 문서 요약, 감정 분석, 번역 등의 작업에서 중요한 역할을 합니다. (한국어에서의 문장 토크나이저로 'KSS'를 추천)
정수인코딩
정수 인코딩(Integer Encoding)은 자연어 처리에서 텍스트 데이터를 모델이 이해할 수 있는 숫자 형태로 변환하는 과정입니다. 문장을 토큰화해 단어·서브워드·문자 단위로 나눈 뒤, 각 토큰에 고유한 정수 ID를 부여하여 문장을 숫자 시퀀스로 표현합니다. 이렇게 정수로 변환된 데이터는 신경망 모델에 입력될 수 있고, 이후 임베딩 레이어를 통해 연속적인 벡터 공간으로 매핑되어 의미 정보를 학습하는 기반이 됩니다.
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding
import numpy as np
# 전처리할 텍스트를 정합니다.
text = '커피 한잔 어때'
# Tokenizer 객체 생성 및 fit_on_texts로 단어 인덱스 학습
tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
# texts_to_sequences로 텍스트를 시퀀스로 변환
sequences = tokenizer.texts_to_sequences([text])
print(sequences)
# 단어 인덱스 확인
word_index = tokenizer.word_index
print("단어 인덱스: ", word_index)
- Tokenizer는 기본적으로 띄어쓰기(whitespace)를 기준으로 단어를 나눕니다.
- 그리고 단어 안에 있는 일부 특수문자나 구두점(, . ! ? 등)은 제거합니다.
- 모두 소문자(lowercase)로 변환합니다 (영어 기준).
- 그래서 Tokenizer를 그냥 쓰면 공백 단위 토큰화 + 단순한 전처리만 적용됩니다.
# 단어 빈도수 세기
# 전처리하려는 세 개의 문장을 정합니다.
docs = ['먼저 텍스트의 각 단어를 나누어 토큰화합니다.',
'텍스트의 단어로 토큰화해야 딥러닝에서 인식됩니다.',
'토큰화한 결과는 딥러닝에서 사용할 수 있습니다.',
]
# 토큰화 함수를 이용해 전처리 하는 과정입니다.
tokenizer = Tokenizer() # 토큰화 함수 지정
tokenizer.fit_on_texts(docs) # 토큰화 함수에 문장 적용
# 단어의 빈도수를 계산한 결과를 각 옵션에 맞추어 출력합니다.
print("단어 카운트: ", tokenizer.word_counts)
# 출력되는 순서는 랜덤입니다.
print("문장 카운트: ", tokenizer.document_count)
print("각 단어가 몇 개의 문장에 포함되어 있는가: ", tokenizer.word_docs)
print("각 단어에 매겨진 인덱스 값: ", tokenizer.word_index)
# 전처리할 텍스트를 정합니다.
texts = ['커피 한잔 어때', '오늘 날씨 참 좋네', '옷이 어울려요']
# Tokenizer 객체 생성 및 fit_on_texts로 단어 인덱스 학습
tokenizer = Tokenizer()
tokenizer.fit_on_texts(texts)
# texts_to_sequences로 텍스트를 시퀀스로 변환
sequences = tokenizer.texts_to_sequences(texts)
# 단어 인덱스 확인
word_index = tokenizer.word_index
print("\n단어 인덱스:\n", word_index)
# 패딩을 통해 시퀀스 길이를 맞춥니다.
print("\n시퀀스:\n", sequences)
padded_sequences = pad_sequences(sequences, 4)
print("\n패딩된 시퀀스:\n", padded_sequences)
model = Sequential()
model.add(Embedding(input_dim=len(word_index) + 1, output_dim=5))
#input_dim에 1을 더하는 것은 인덱스 0을 패딩 값으로 사용하기 위함.
#Keras의 Tokenizer는 단어 인덱스를 1부터 시작하기 때문에, 인덱스 0은 패딩 값으로 예약
#output_dim은 단어가 임베딩될 벡터의 길이
# 임베딩 결과 확인
embedding_output = model.predict(padded_sequences)
print("\n임베딩 결과:\n", embedding_output)
패딩
패딩(Padding)은 자연어 처리나 시계열 모델에서 길이가 다른 시퀀스를 동일한 길이로 맞추기 위해 비어 있는 부분을 특정 값(보통 0)으로 채우는 과정입니다. 딥러닝 모델은 미니배치 단위로 데이터를 처리하는데, 입력 길이가 제각각이면 행렬 연산을 할 수 없기 때문에 패딩을 통해 모두 같은 길이로 정규화합니다. 이렇게 맞춰진 시퀀스는 이후 RNN, LSTM, Transformer 같은 모델에 효율적으로 입력될 수 있으며, 패딩된 값은 실제 학습에 영향을 주지 않도록 마스크(masking) 기법과 함께 사용됩니다.