티스토리 뷰

반응형

 

 

 

이전 포스팅에서는 MLTextClassifier과 metadata를 포함한 MLModel 파일을 로컬에 저장했었습니다.

MLTextClassifier로 MLModel 로컬저장하기 ▼

 

iOS 자연어처리, MLTextClassifier로 MLModel 로컬저장

이전 포스팅 MLDataTable로 MLTextClassifier 생성하기 ▼ iOS ML 자연어처리, MLDataTable로 MLTextClassifier 생성 이전 포스팅 iOS ML 자연어처리, json파일로 MLDataTable 생성하기 ▼ iOS ML 자연어처리, jso..

0urtrees.tistory.com

 

 

이번 포스팅에서는 로컬에 저장한 MLModel 파일을 사용해서 iOS앱 내에 NLModel로 불러와서 실제로 사용해보도록 하겠습니다. NLModel을 이용해서 입력한 문자열에 대한 자연어처리 결과를 출력하는 프로젝트를 구현하게 됩니다.

NLModel 사용에 앞서, iOS 프로젝트를 생성 후 UI 레이아웃을 배치해보겠습니다. 

 


NLModel 사용을 위한 iOS 프로젝트 생성하기

 

 

 

Xcode를 실행 후, command + shift + N 으로 프로젝트 생성창을 띄웁니다. 이후에 iOS > Single View App 을 선택해서 iOS 프로젝트를 생성합니다. 

 

 

 

 

이름을 Review Sentiment Analyzer로, User Interface는 SwiftUI가 아닌 Storyboard를 선택, next버튼을 눌러서 프로젝트를 생성합니다.

 

 

 

 

이제 Review Sentiment Classifier라는 iOS 프로젝트가 생성되었습니다. 이어서 Sentiment Classifier 프로젝트에 NLModel을 생성 후 사용하기 전, UI 레이아웃을 배치해보겠습니다. 

 

 


Review Sentiment Classifier 프로젝트
UI 레이아웃 배치하기

 

 

네비게이션바의 제목을 추가하기 위해 ViewController의 InterfaceBuilder > AttributeInspector > Top Bar를 Translucent Navigation Bar로 설정 후, 하단의 Title에 설정하고자 하는 타이틀을 설정해줍니다. 

 

 

 

 

Command + Shift + L 을 통해 UI 목록창을 띄운 후, UIButton, UITextView, UILabel을 각각 1개씩 Storyboard 상의 ViewController에 배치해줍니다. 이후에 각 UI의 크기와 위치를 적절하게 조절해줍니다. 

제가 설정한 제약값 정보는 아래의 이미지를 확인하시면 됩니다. 

 

 


■ UIButton 제약값 설정 상태 (Size Inspector)

 

 

 

■ UITextView 제약값 설정 상태 (Size Inspector)

 

 

 

■ UILabel 제약값 설정 상태 (Size Inspector)

 

 

 

 


 

 

InterfaceBuilder에서 구성한 UI를 ViewController 클래스파일과 연결하기위해 ViewController 클래스파일에도 코드를 작성합니다. 

13 ~ 15행) 3줄에 UIButton, UITextView, UILabel UI에 대한 IBOutlet 변수를 선언해줍니다. 코드를 선언 후, InterfaceBuilder에서 해당 코드를 UI와 연결시켜주는 작업이 필요합니다.

 

 

 

 

다시 InterfaceBuilder로 돌아와서 ViewController 상단의 노란 동그라미 버튼을 우측클릭하면 위 이미지의 우측과 같은 연결상태 창이 띄워집니다.

여기에서 resetButton, resultLabel, sentimentTextView 세개 항목 우측의 동그라미 버튼을 누른 뒤 드래그하여 각각 맞는 UI와 연결을 해줍니다. 이렇게 NLModel 사용 전, UI 레이아웃 배치가 완료되었습니다. 

 

 


MLModel파일 추가 후 NLModel 생성하기

 

 

이전 포스팅에서 로컬에 저장했던 MLModel 파일을 추가합니다. 파일을 File Navigator의 파일목록에 드래그해서 MLModel파일을 추가합니다.

 

 

 

 

MLModel이 추가된다면, 정상적으로 파일목록에 해당 MLModel이 추가되는 것을 확인할 수 있습니다. 위와 같이 파일목록에 ReviewClassifier.mlmodel이 추가되었습니다.

 

 


NLModel 사용 전 UI 이벤트 구현하기

 

 

ViewController 로드 단계의 설정을 해보겠습니다. 먼저 우상단의 resetButton을 눌렀을 때 텍스트뷰의 텍스트 초기화를 하도록하는 액션메서드를 설정해보겠습니다. 

19 ~ 20행) resetButton의 addTarget을 통해서 액션메서드를 등록해줍니다. 터치 후 떼었을때 이벤트를 감지하도록 .touchUpInside 옵션을 설정해줍니다.

24 ~ 27행) resetButtonPressed(_:) 메서드를 구현합니다. 터치발생 시, 텍스트뷰를 초기화하고, 초기화버튼을 비활성화 처리하도록 설정합니다.

 

 

 

 

sentimentTextView의 텍스트 변경을 감지하기 위해 텍스트뷰 델리게이트를 self로 설정해줍니다. 

 

 

 

 

이후 ViewController 블록 하단에 extension을 구현해줍니다. 텍스트뷰 입력이 들어왔을때 입력된 텍스트의 적용여부 판단을 위해 shouldChangeTextIn 델리게이트 메서드를 추가합니다.

 

 


MLModel 파일로 NLModel 생성 후 댓글분석하기

 

 

NLModel을 생성해서 사용하기 위해 NaturalLanguage 프레임워크를 import해줍니다.

 

 

 

 

18 ~ 23행) NaturalLanguage Framework를 import 후, NLModel, sentimentClassifier를 생성합니다. NLModel 생성과정에서 try를 사용해야 합니다. try?를 사용해서 NLModel을 생성합니다.

NLModel 생성은 단순한 작업이 아니기에, 실제 사용할 때, 해당 변수가 로드되도록 lazy var로 선언했습니다.
try?로 NLModel생성을 시도 후 만약 NLModel을 정상적으로 생성하지 못할 경우, sentimentClassifier는 nil을 갖게 됩니다.

 

 

 

 

41 ~ 59행) 앞서 구현했던 textView delegate메서드, shouldChangeTextIn 메서드를 추가로 구현합니다. 만약 텍스트가 존재하고, "\n"값이 입력될 경우(엔터가 입력 될 경우) NLModel, sentimentClassifier를 사용해서 현재 텍스트뷰에 적용된 텍스트에 대한 자연어처리 분석을 실행합니다.

이후 NLModel의 분석결과에 따라 resultLabel은 "positive text", "nagative text", "unrecognized text"를 표출하게 됩니다.

61행) 문자열 입력이 발생 될 때, 키보드가 지속적으로 띄워지도록 textView.becomeFirstResponder()를 추가했습니다. 

 

 


이제 UI 레이아웃 배치, 이벤트 구현, NLModel 생성 및 적용까지 모든 과정을 마쳤습니다. 이제 Command + R로 Simulator내에서 앱을 실행 하고, 입력한 문자열에 대한 분석결과가 제대로 표출되는지 확인해보겠습니다. 

실행 및 분석결과 예시는 아래 영상을 참고하시면 됩니다. 

 

NLModel 활용예시 영상 ▼
- 아마존 댓글 데이터로 학습된 NLModel로 문자열에 대한 성격(긍정 / 부정) 분석결과 출력

iOS NLModel로 댓글성향 분석하기 예제 시연영상

 

 

지금까지 NLModel을 사용해서 실제로 입력한 문자열에 대한 NLModel 분석결과를 출력하는 예제를 활용해봤습니다.

현재 포스팅에서 생성 후 사용한 NLModel은 아마존 사이트의 영문 댓글들에 대한 학습만 이루어져있어 영어 이외의 언어에 대한 자연어 텍스트 분석은 못하는 한계가 있습니다.

이러한 단점을 보완하기 위해 주 타겟 언어에 대한 데이터셋을 추가로 학습시켜서 보다 신뢰성있는 NLModel(Natural Language Model)을 생성하고, 사용할 수 있을 것 같습니다. 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함