커스텀 텍스트 분류 모델을 만들고 이 모델로 앱 업데이트

1. 시작하기 전에

이 Codelab에서는 원래 블로그 스팸 댓글 데이터 세트에서 빌드했지만 자체 댓글로 개선한 텍스트 분류 모델을 업데이트하여 데이터에 적합한 모델을 만드는 방법을 알아봅니다.

기본 요건

이 Codelab은 '모바일 텍스트 분류 시작하기' 과정의 일부입니다. 이 개발자 과정의 Codelab은 순차적입니다. 첫 번째 과정을 따르는 동안 작업할 앱과 모델을 이전에 빌드했어야 합니다. 이전 활동을 아직 완료하지 않았다면 지금 중지하고 시작하세요.

  • 기본 메시지 스타일 앱 빌드
  • 댓글 스팸 머신러닝 모델 빌드
  • 스팸 필터링 머신러닝 모델을 사용하도록 앱 업데이트

학습할 내용

  • 모바일 텍스트 분류 시작하기 과정에서 빌드한 텍스트 분류 모델을 업데이트하는 방법
  • 앱에서 가장 일반적인 스팸을 차단하도록 모델을 맞춤설정하는 방법

필요한 항목

  • 이전 활동에서 관찰하고 빌드한 메시지 앱 및 스팸 필터링 모델

2. 텍스트 분류 향상

저장소를 클론하고 TextClassificationStep2에서 앱을 로드하여 코드를 가져올 수 있습니다. TextClassificationOnMobile->Android 경로에서 찾을 수 있습니다.

완료된 코드는 TextClassificationStep3로도 사용할 수 있습니다.

빌드한 메시지 앱을 열고 이 메시지를 시도해보면 스팸 점수가 매우 낮습니다.

f111e21903d6fd1f.png

이와 같은 맞춤법 오류를 사용하면 스팸 필터를 피할 수 있습니다. 메일이 악의적이지 않은 경우 스팸 발송자는 종종 사용자 ID에 링크를 추가합니다 (링크가 있으면 필터가 트리거될 수 있는 메시지 자체 대신).

이 실습에서는 새 데이터로 모델을 업데이트하는 방법을 알아봅니다. 완료한 후 동일한 문장으로 실행하면 아래의 결과가 표시되며 이 메일은 스팸으로 식별됩니다.

c96613a0a4d1fef0.png

3. CSV 파일 수정

원래 모델을 학습시키기 위해 스팸 또는 스팸 아님으로 라벨이 지정된 거의 1, 000개의 댓글이 포함된 CSV (lmblog_comments.csv)로 데이터 세트를 만들었습니다. 텍스트 편집기에서 CSV를 열면 파일을 살펴볼 수 있습니다.

CSV의 구성은 첫 번째 행이 열을 설명하도록 하는 것입니다. 여기에서는 commenttextspam로 라벨이 지정되어 있습니다.

모든 후속 행이 같은 형식을 따릅니다.

64c0128548e1d082.png

오른쪽의 라벨은 스팸에 참이고 스팸이 아닌 경우 false입니다. 이 경우 세 번째 줄은 스팸으로 간주됩니다.

예를 들어 많은 사람이 내 사이트에 온라인 거래 관련 메시지를 스패밍하는 경우 직접 댓글을 추가하려면 사이트 하단에 스팸 댓글의 예를 추가하기만 하면 됩니다. 예를 들면 다음과 같습니다.

online trading can be highly highly effective,true
online trading can be highly effective,true
online trading now,true
online trading here,true
online trading for the win,true

완료한 후 파일을 새 이름 (예: lmblog_comments.csv)으로 저장하면 새 모델을 학습시키는 데 사용할 수 있습니다.

이 Codelab의 나머지 부분에서는 온라인 거래 업데이트와 함께 Google Cloud Storage에서 제공, 수정, 호스팅된 예시를 사용합니다. 자체 데이터 세트를 사용하려면 코드에서 URL을 변경하면 됩니다.

4. 새 데이터로 모델 다시 학습시키기

모델을 다시 학습시키려면 이전 코드 (SpamCommentsModelMaker.ipynb)를 재사용하면서 lmblog_comments_extras.csv이라는 새 CSV 데이터 세트를 가리키면 됩니다. 업데이트된 콘텐츠가 포함된 전체 노트북은 SpamCommentsUpdateModelMaker.ipynb.로 제공됩니다.

Google Colab에 액세스할 수 있는 경우 여기에서 직접 실행할 수 있습니다. 또는 저장소에서 코드를 가져와 선택한 노트북 환경에서 실행할 수 있습니다.

업데이트된 코드는 다음과 같습니다.

training_data = tf.keras.utils.get_file(fname='comments-spam-extras.csv',   
          origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/
                  lmblog_comments_extras.csv', 
          extract=False)

학습할 때 모델이 여전히 높은 수준의 정확도로 학습되는 것을 확인할 수 있습니다.

8886033d1f8161c.png

노트북을 살펴보고 모델, 어휘,라벨 파일을 다운로드합니다. 다음 단계에서는 Android에서 이를 통합합니다.

5. Android 앱 업데이트

  1. Android 스튜디오에서 앱을 열고 프로젝트 탐색기 상단에서 Android가 선택되어 있는지 확인합니다.
  2. 이전 버전의 모델 파일에서 라벨, 모델, 어휘가 포함된 assets 파일을 찾습니다.

91116524e9016ed4.png

  1. 애셋 폴더를 마우스 오른쪽 버튼으로 클릭합니다.
  2. 메뉴에서 운영체제의 파일 관리자로 폴더를 여는 옵션을 선택합니다. (그림처럼 Mac의 Finder에서 표시. Windows에서는 탐색기에서 표시, Linux에서는 파일에서 열기 또는 이와 유사합니다.)

25f63f9629657e85.png

  1. 그러면 운영체제의 파일 관리자에서 모델, 어휘, 라벨이 포함된 디렉터리가 열립니다. 이전 단계에서 만든 항목을 여기에 복사합니다.

앱에서 코드를 변경하지 않아도 됩니다. 실행해 보면 위와 같이 모델이 '온라인 거래'를 감지하도록 개선되어 있는 것과 같은 결과를 볼 수 있습니다. 사용할 수 있습니다.

완성된 버전의 코드는 저장소에서 TextClassificationStep3으로 제공됩니다.

6. iOS 앱 업데이트

저장소를 클론하고 TextClassificationStep2에서 앱을 로드하여 코드를 가져올 수 있습니다. TextClassificationOnMobile->Android 경로에서 찾을 수 있습니다.

완료된 코드는 TextClassificationStep3로도 사용할 수 있습니다.

이전 Codelab을 완료했다면 기본 모델에서 작동하는 TextClassificationStep2의 iOS 버전이 생성됩니다. 기존 버전에서 시작하려면 저장소에서 해당 버전을 가져오세요. 댓글 스팸 데이터에 대해 학습된 첫 번째 모델로도 작동하며 다음과 같은 결과가 표시될 수 있습니다.

553b845565b5b822.png

새 모델을 사용하도록 앱을 업데이트하는 것은 매우 간단합니다. 가장 쉬운 방법은 파일 탐색기로 이동하여 model.tflite, vocab, labels.txt의 새 버전을 다운로드하여 프로젝트 디렉터리에 복사하는 것입니다.

이렇게 하면 앱이 새 모델과 호환되므로 직접 사용해 볼 수 있습니다. 다음은 같은 문장을 새 모델을 사용한 예입니다.

9031ec260b1857a3.png

7. 축하합니다

작업이 끝났습니다. 새로운 데이터로 모델을 재학습시키고 Android 앱과 iOS 앱 모두에 추가하여 새 코드를 작성하지 않고도 모델의 기능을 업데이트할 수 있었습니다.

다음 단계

이 모델은 1, 000개 데이터 항목만으로 학습된 장난감에 불과합니다.

자연어 처리를 알아보면서 더 큰 데이터 세트로 작업해야 할 수 있습니다. 또한 지속적 학습 파이프라인을 설정할 수도 있습니다. 그러면 새 데이터가 들어오고 스팸으로 신고되면 백엔드에서 자동으로 모델을 다시 학습시킨 다음 Firebase Model Hosting을 사용하여 해당 모델을 배포할 수 있습니다.

모델을 복사하여 애셋으로 붙여넣고, 다시 컴파일하고, 재배포하지 않고도 업데이트된 모델을 원활하게 사용할 수 있습니다. 또한 예를 들어 현재 0.8 대신 Firebase 원격 구성을 사용하여 스팸 전송 임곗값을 관리할 수 있습니다.

많은 가능성이 있으며 이 과정의 향후 Codelab에서 살펴보겠습니다.