[Python] 자연어 처리 기초, 스팸 문자 분류 프로젝트
1. Tensorflow에서 자연어를 처리하는 방법
1) 단어 기반 인코딩
- Tokenizer 라이브러리 사용
- fit_on.texts : 문자 데이터를 입력받아서 리스트 형태로 변환
- word_index : 단어 숫자 키-값 형태의 딕셔너리로 반환
https://docs.python.org/ko/3/library/tokenize.html
tokenize — 파이썬 소스를 위한 토크나이저 — Python 3.10.1 문서
tokenize — 파이썬 소스를 위한 토크나이저 소스 코드: Lib/tokenize.py tokenize 모듈은 파이썬으로 구현된 파이썬 소스 코드를 위한 어휘 스캐너를 제공합니다. 이 모듈의 스캐너는 주석도 토큰으로 반
docs.python.org
<예제>
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
sentences = [
'I love my dog',
'I love my cat'
]
tokenizer = Tokenizer(num_words = 100)
tokenizer.fit_on_texts(sentences) # 문자 데이터를 입력받아서 리스트 형태로 변환
# 단어 숫자의 키-값 쌍으로 딕셔너리 반환
word_index = tokenizer.word_index
print(word_index)
2) 텍스트를 시퀀스로 변환
- texts_to_sequences 텍스트를 시퀀스로 변환
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
sentences = [
'I love my dog',
'I love my cat',
'You love my dogg!',
'Do you think my dog is amazing?'
]
tokenizer = Tokenizer(num_words = 100)
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_index
# 시퀀스 값으로 반환
sequences = tokenizer.texts_to_sequences(sentences)
print(sequences)
3) 패딩 설정하기
from tensorflow.keras.preprocessing.sequence import pad_sequences
padded = pad_sequences(sequences)
# 길이를 맞출때 0을 뒤에 추가하고싶으면 파라미터로 padding = 'post'
print(padded)
[[ 0 0 0 5 3 2 4]
[ 0 0 0 5 3 2 7]
[ 0 0 0 6 3 2 4]
[ 8 6 9 2 4 10 11]]
2. 스팸 문자 분류
데이터 : 스팸 문자 데이터 베이스가 있음
ham : 정상 데이터
span : 스팸 문자
- 위에 자연어 처리 방법을 사용해서 자연어를 숫자로 변환.
- 원 핫 벡터 임베딩 처리
from tensorflow import keras
import data_reader
from tensorflow.keras.utils import plot_model
EPOCHS = 50 # 예제 기본값은 50입니다.
dr = data_reader.DataReader()
# 인공신경망을 제작합니다.
model = keras.Sequential([
# 단어를 밀집 벡터로 만드는 역할, 정수 인코딩 된 단어를 입력으로 받음
# 인자 : 총 단어의 개수, 임베딩 벡터의 크기, 입력 시퀀스의 길이
keras.layers.Embedding(8983, 128),
# 입력으로 들어오는 벡터들의 평균을 구하는 역할 (고정된 크기)
keras.layers.GlobalAveragePooling1D(),
keras.layers.Dense(32, activation='relu'),
keras.layers.Dropout(0.1),
# 출력이 0~1 사이의 실수값으로 나오도록
keras.layers.Dense(1, activation='sigmoid')
])
model.summary()
# 인공신경망을 컴파일합니다.
model.compile(optimizer="adam", metrics=['accuracy'],
loss="binary_crossentropy")
# 인공신경망을 학습시킵니다.
print("\n\n************ TRAINING START ************ ")
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
history = model.fit(dr.train_X, dr.train_Y, epochs=EPOCHS,
validation_data=(dr.test_X, dr.test_Y),
callbacks=[early_stop])
모델 학습 후 손실율과 정확도 확인
# 학습 결과를 그래프로 출력합니다.
data_reader.draw_graph(history)