댓글 스팸 머신러닝 모델 빌드

1. 시작하기 전에

이 Codelab에서는 TensorFlow 및 TensorFlow Lite Model Maker를 사용하여 만든 코드를 검토하고 댓글 스팸을 기반으로 하는 데이터 세트를 사용하여 모델을 만듭니다. kaggle에서는 원본 데이터를 확인할 수 있습니다. 이 데이터를 하나의 CSV로 취합하여 깨진 텍스트, 마크업, 반복되는 단어 등을 삭제했습니다. 이렇게 하면 텍스트 대신 모델에 더 쉽게 집중할 수 있습니다.

검토할 코드는 이 코드에서 제공되었지만, Google Colab에서 코드를 확인하는 것이 좋습니다.

기본 요건

  • 이 Codelab은 머신러닝을 처음 사용하는 숙련된 개발자를 대상으로 작성되었습니다.
  • 이 Codelab은 모바일 과정의 텍스트 분류 시작하기 아직 이전 활동을 완료하지 않으셨다면 지금 중지하시기 바랍니다.

실습 내용

  • Google Colab을 사용하여 TensorFlow Lite Model Maker를 설치하는 방법
  • 클라우드 서버에서 기기로 데이터를 다운로드하는 방법
  • 데이터 로더 사용 방법
  • 모델 빌드 방법

준비물

2 TensorFlow Lite Model Maker 설치

Colab을 엽니다. 노트북의 첫 번째 셀에 다음과 같이 TensorFLow Lite Model Maker가 설치됩니다.

!pip install -q tflite-model-maker

완료되면 다음 셀로 이동합니다.

3. 코드 가져오기

다음 셀에는 노트북의 코드에서 사용해야 하는 여러 가져오기가 있습니다.

import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

또한 Model Maker를 사용하기 위한 요구사항인 TensorFlow 2.x를 실행 중인지 확인합니다.

4. 데이터 다운로드

그런 다음 Cloud 서버에서 기기로 데이터를 다운로드하고 data_file가 로컬 파일을 가리키도록 설정합니다.

data_file = tf.keras.utils.get_file(fname='comment-spam.csv',
  origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv',
  extract=False)

Model Maker는 이와 같은 간단한 CSV 파일로 모델을 학습시킬 수 있습니다. 텍스트를 저장할 열과 라벨을 보존하기만 하면 됩니다. Codelab의 뒷부분에서 그 방법을 알아봅니다.

5 사전 학습된 임베딩

일반적으로 Model Maker를 사용할 때는 모델을 처음부터 빌드하지 않습니다. 필요에 따라 맞춤설정한 기존 모델을 사용합니다.

이와 같은 언어 모델의 경우 선행 학습된 임베딩 사용이 포함됩니다. 임베딩의 기본은 단어들이 숫자로 이루어져 있으며, 전체 자료에서 각 단어가 숫자로 변환된다는 것입니다. 임베딩은 단어의 '방향'을 설정하여 단어의 감정을 확인하는 데 사용되는 벡터입니다. 예를 들어 댓글 스팸 메시지에 자주 사용되는 단어는 벡터가 비슷한 방향을 가리키고 벡터가 반대 방향을 가리키게 됩니다.

선행 학습된 임베딩을 사용하면 이미 대량의 텍스트에서 감정을 학습한 코퍼스 또는 컬렉션으로 시작할 수 있습니다. 이렇게 하면 0부터 시작하는 것보다 훨씬 빠른 해결 방법을 얻을 수 있습니다.

Model Maker는 사용할 수 있는 몇 가지 선행 학습된 임베딩을 제공하지만 가장 간단하고 빠르게 시작하는 방법은 average_word_vec입니다.

코드는 다음과 같습니다.

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

num_words 매개변수

모델에서 사용할 단어 수도 지정합니다.

'많을수록 좋습니다'라고 생각할 수 있지만 일반적으로 각 단어가 사용되는 빈도에 따라 알맞은 숫자가 있습니다. 전체 자료에서 모든 단어를 사용하면 모델이 한 번만 사용되는 단어의 학습 및 방향을 설계하도록 할 수 있습니다. 텍스트 코퍼스에서 많은 단어가 한두 번만 사용되는 것을 발견할 수 있습니다. 또한 텍스트에 사용한 감정은 전반적인 감정에 미미한 영향을 미치지 않으므로 일반적으로 모델에 사용하지 않아도 됩니다. num_words 매개변수를 사용하여 원하는 단어 수에 맞게 모델을 조정할 수 있습니다.

여기서 작은 숫자는 더 작고 빠른 모델을 제공할 수 있지만, 더 적은 단어를 인식하기 때문에 정확도가 떨어질 수 있습니다. 여기서 숫자가 클수록 모델이 더 크고 느려집니다. 최고의 위치를 찾는 것이 핵심입니다!

wordvec_dim 매개변수

wordved_dim 매개변수는 각 단어의 벡터에 사용할 차원의 수입니다. 연구에 따르면 결정된 단어는 단어 수의 네 번째 루트입니다. 예를 들어 단어 2,000개를 사용하는 경우 처음에는 7로 시작하는 것이 좋습니다. 사용하는 단어 수를 변경하는 경우에도 이를 변경할 수 있습니다.

seq_len 매개변수

모델은 입력 값과 관련하여 일반적으로 매우 엄격합니다. 언어 모델의 경우 언어 모델은 특정 정적 길이에 해당하는 문장을 분류할 수 있습니다. 이는 seq_len 매개변수 또는 시퀀스 길이에 따라 결정됩니다.

단어를 숫자 (또는 토큰)로 전환하면 문장이 이러한 토큰의 시퀀스가 됩니다. 이 경우 20개의 토큰이 있는 문장을 분류하고 인식하도록 모델이 학습합니다 (이 경우). 문장이 이보다 길면 잘립니다. 더 짧으면 패딩됩니다. 코퍼스에 사용할 전용 <PAD> 토큰이 코퍼스에 표시됩니다.

6. 데이터 로더 사용

이전에 CSV 파일을 다운로드한 경우 이제 데이터 로더를 사용하여 모델이 인식할 수 있는 학습 데이터로 변환할 차례입니다.

data = DataLoader.from_csv(
    filename=data_file,
    text_column='commenttext',
    label_column='spam',
    model_spec=spec,
    delimiter=',',
    shuffle=True,
    is_training=True)

train_data, test_data = data.split(0.9)

편집기에서 CSV 파일을 열면 각 행에 2개의 값이 있으며 파일의 첫 번째 줄에 텍스트가 기술되어 있습니다. 일반적으로 각 항목은 열로 간주됩니다.

첫 번째 열의 설명자는 commenttext이고 각 줄의 첫 번째 항목은 주석 텍스트인 것을 확인할 수 있습니다. 마찬가지로 두 번째 열의 설명자는 spam이며 각 행의 두 번째 항목은 True 또는 False,로 표시되어 텍스트가 댓글 스팸으로 간주되는지 나타냅니다. 다른 속성은 이전에 만든 model_spec를 구분 문자와 함께 설정합니다. 이 경우 파일은 쉼표로 구분되므로 쉼표입니다. 이 데이터를 모델 학습에 사용하므로 is_TrainingTrue로 설정됩니다.

모델 테스트를 위해 데이터의 일부를 보류하는 것이 좋습니다. 90% 는 학습용, 나머지 10% 는 테스트/평가용 이를 위해 테스트 데이터가 데이터 세트의 '하위' 10% 가 아니라 무작위로 선택되어 있는지 확인하려고 하므로 데이터를 로드할 때 무작위로 shuffle=True를 사용합니다.

7 모델 빌드

다음 셀은 모델을 빌드하기 위한 것으로 한 줄의 코드입니다.

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
                               validation_data=test_data)

이렇게 하면 Model Maker를 사용하여 Text Classifier 모델을 만들고, 사용할 학습 데이터(4단계에서 설정), 모델 사양(4단계에서 설정), 에포크(이 경우)를 지정합니다. 50일

머신러닝의 기본 원칙은 패턴 일치의 한 형태입니다. 처음에는 단어에 대해 선행 학습된 가중치를 로드한 후 함께 그룹화했을 때 스팸을 표시하고 그렇지 않을 단어를 예측하여 그룹화하려고 시도합니다. 처음에는 모델이 시작만 50:50에 가까워질 가능성이 높습니다.

b94b00f0b155db3d.png

그런 다음 테스트 결과를 측정하고 최적화 코드를 실행하여 예측을 조정한 후 다시 시도합니다. 에포크입니다. 따라서 epochs=50을 지정하면 '루프'가 50번 진행됩니다.

85f1d21c0b64d654.png

50세대가 되면 모델이 훨씬 더 높은 정확도로 보고됩니다. 이 경우 99%가 표시됩니다.

오른쪽에 유효성 검사 정확성 수치가 표시됩니다. 이는 일반적으로 모델이'본 적이 없는' 데이터를 분류하는 방법을 나타내기 때문에 학습 정확성보다 약간 낮습니다. 이전에 설정한 10% 테스트 데이터를 사용합니다.

5be7967ec70e4302.png

8 모델 내보내기

학습이 완료되면 모델을 내보낼 수 있습니다.

TensorFlow는 자체 형식으로 모델을 학습시키며, 모바일 앱에서 사용하려면 TFLITE 형식으로 변환해야 합니다. Model Maker는 이러한 이러한 복잡성을 자동으로 처리합니다.

디렉터리를 지정하여 모델을 내보내면 됩니다.

model.export(export_dir='/mm_spam')

이 디렉터리에는 model.tflite 파일이 있습니다. 다운로드 이는 다음 Codelab에서 필요하므로 Android 앱에 추가합니다.

iOS 고려사항

방금 내보낸 .tflite 모델은 Android에 적합합니다. 모델에 관한 메타데이터가 삽입되어 있고 Android 스튜디오가 메타데이터를 읽을 수 있기 때문입니다.

이 메타데이터는 모델이 단어를 인식할 때 단어를 나타내는 토큰의 사전을 포함하므로 매우 중요합니다. 단어가 토큰으로 바뀌는 것을 배웠을 때 이러한 토큰이 감정을 나타내는 벡터로 주어집니다. 모바일 앱에서 이러한 토큰을 알아야 합니다. 예를 들어 'dog'가 42로 토큰화되어 있고 사용자가 'dog'를 문장에 입력하는 경우 앱에서 'dog'를 42로 변환해야 모델이 이를 이해할 수 있습니다. Android 개발자의 경우 더 쉽게 사용할 수 있는 'TensorFlow Lite 작업 라이브러리'가 있지만 iOS에서는 어휘를 처리해야 하므로 단어를 사용할 수 있어야 합니다. Model Maker는 export_format 매개변수를 지정하여 자동으로 내보낼 수 있습니다. 따라서 모델의 라벨과 단어를 가져오려면 다음을 사용할 수 있습니다.

model.export(export_dir='/mm_spam/',
             export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

9. 축하합니다

이 Codelab에서는 모델을 빌드하고 내보내는 Python 코드를 살펴보았습니다. 끝에 .tflite 파일이 생성됩니다.

다음 Codelab에서는 이 모델을 사용하여 스팸 댓글 분류를 시작할 수 있도록 Android 앱을 수정하는 방법을 알아봅니다.