AI

[Python] 자연어 처리 기초, 스팸 문자 분류 프로젝트

은구잇 2021. 12. 24. 14:53
728x90

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)