2024. 10. 8. 10:02ㆍAI/NLP 자연어 처리
1. 단어 수 맞추기 (Padding)
모든 문장의 길이를 동일하게 맞추기 위해 짧은 문장에는 '0'을 추가한다. 예를 들어, 문장의 최대 길이가 4라면, 길이가 2인 문장은 0을 추가하여 [2, 0, 0, 0]처럼 패딩한다.
- 원래 문장: [3, 4]
- 패딩된 문장: [3, 4, 0, 0]
2. 원-핫 인코딩 준비
각 단어에 고유한 인덱스(숫자)를 부여한다. 이 인덱스를 나중에 원-핫 인코딩으로 변환한다.
- 단어 인덱스: [3, 4, 5, 0]
3. 원-핫 인코딩 수행
각 단어 인덱스를 원-핫 벡터로 변환한다. 원-핫 인코딩은 인덱스에 해당하는 위치만 1로 표시하고 나머지는 모두 0으로 표시하는 방식이다.
- 단어 인덱스 3번: [0, 0, 1, 0, 0, 0, ...]
- 단어 인덱스 4번: [0, 0, 0, 1, 0, 0, ...]
4. 문장 변환
패딩된 문장을 각 단어 인덱스에 해당하는 원-핫 벡터로 변환한다.
- 패딩된 문장: [3, 4, 5, 0]
- 변환된 원-핫 인코딩 문장:
[0, 0, 1, 0, 0, ...] (단어 인덱스 3번)
[0, 0, 0, 1, 0, ...] (단어 인덱스 4번)
[0, 0, 0, 0, 1, ...] (단어 인덱스 5번)
[1, 0, 0, 0, 0, ...] (패딩된 0)
이 과정을 통해 문장을 고정된 크기의 벡터로 변환하고, 각 단어는 원-핫 벡터로 표현된다.
from numpy import array
from tensorflow.keras.preprocessing.text import Tokenizer
IMDB 스타일의 리뷰 데이터 및 클래스 레이블
docs = ["Amazing movie! A must-watch.", "Absolutely loved it!", "One of the best films I've seen.",
"Highly recommend watching this!", "I could watch this movie over and over again.",
"It was just okay, nothing special.", "I didn't enjoy it as much as I thought.",
"The movie felt too long and boring.", "The acting was pretty bad.", "I was really disappointed with the film."]
classes = array([1, 1, 1, 1, 1, 0, 0, 0, 0, 0])
토크나이저 생성 및 텍스트를 토큰화
token = Tokenizer()
token.fit_on_texts(docs)
print("단어 인덱스:", token.word_index)
텍스트를 시퀀스로 변환
x = token.texts_to_sequences(docs)
print("리뷰 텍스트 토큰화 결과:", x)
패딩을 통해 시퀀스 길이를 맞춤 (최대 길이 4)
from tensorflow.keras.preprocessing.sequence import pad_sequences
padded_x = pad_sequences(x, maxlen=4)
print("패딩 처리된 시퀀스:", padded_x)
딥러닝 모델 정의 및 학습
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Embedding
print("\n딥러닝 모델 시작:")
word_size = len(token.word_index) + 1 단어 개수
모델 구성
model = Sequential()
model.add(Embedding(word_size, 8, input_length=4))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
모델 컴파일 및 학습
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(padded_x, classes, epochs=20)
모델 평가
accuracy = model.evaluate(padded_x, classes)[1]
print("\nAccuracy: %.4f" % accuracy)
padding
모든 문장의 길이를 동일하게 맞추기 위해 짧은 문장에 '0'을 추가하는 과정을 패딩이라고 한다. 예를 들어, 가장 긴 문장의 길이가 4일 때, 그보다 짧은 문장은 뒤에 0을 채워서 문장 길이를 맞춘다.
from tensorflow.keras.preprocessing.sequence import pad_sequences
패딩을 통해 시퀀스 길이를 맞춤 (최대 길이 4)
padded_x = pad_sequences(x, maxlen=4)
print("패딩 처리된 시퀀스:", padded_x)
원-핫 인코딩 준비
각 단어에 고유한 인덱스(숫자)를 부여하는 과정이다.
from tensorflow.keras.preprocessing.text import Tokenizer
토크나이저 생성 및 텍스트를 토큰화
token = Tokenizer()
token.fit_on_texts(docs)
print("단어 인덱스:", token.word_index)
텍스트를 시퀀스로 변환
x = token.texts_to_sequences(docs)
print("리뷰 텍스트 토큰화 결과:", x)
여기서 Tokenizer 객체를 사용해 각 단어에 고유한 인덱스를 부여한다. 예를 들어, "Amazing"이라는 단어는 인덱스 1, "movie"는 인덱스 2가 부여된다. 이 과정을 통해 텍스트는 숫자 리스트로 변환되고, 그 결과는 texts_to_sequences를 통해 시퀀스로 나타난다.
원-핫 인코딩 수행
각 단어 인덱스를 원-핫 벡터로 변환하는 단계이다. 원-핫 인코딩이란, 각 단어 인덱스에 해당하는 위치는 1로 표시하고, 나머지는 모두 0으로 표시하는 방식이다.
Embedding 레이어가 이 역할을 대체
from tensorflow.keras.layers import Embedding
모델 구성
model.add(Embedding(word_size, 8, input_length=4))
여기서 Embedding 레이어는 단어 인덱스를 고차원 벡터로 변환하는 역할을 한다. 원-핫 인코딩 대신, Embedding 레이어는 각 단어를 고유한 벡터 공간에 위치시켜 딥러닝 모델이 더 나은 학습을 할 수 있도록 돕는다.
문장 변환
패딩된 문장을 각 단어 인덱스에 해당하는 원-핫 벡터로 변환하는 과정이다. 예를 들어, [3, 4, 5, 0]이라는 문장이 있으면, 각 단어 인덱스에 맞는 원-핫 벡터로 변환된다. 패딩된 0도 벡터로 변환된다.
Embedding 레이어는 입력된 단어 인덱스에 대해 그에 맞는 벡터를 반환하고, 패딩된 값에 대해서도 처리한다.
'AI > NLP 자연어 처리' 카테고리의 다른 글
딥러닝 개발환경 구성 (0) | 2024.09.19 |
---|---|
One-Hot Encoding | Cosine Similarity | Word embedding (0) | 2024.08.11 |