IBM사의 클라우드 서비스 중에 하나인 블루믹스를 소개한 적이 있습니다. 그 중에 이용할 수 있는 서비스 중에 하나가 인공지능 왓슨이라고 설명드렸습니다. 왓슨 API에 대해 짧막하게나마 소개한 적이 있었는데 오늘은 그 중에서 Natural Language Classifier에 대해 얘기하려고 합니다. 


Natural Language Classifier란? 

이것을 직역하면 '자연어 분류기' 정도가 됩니다. 자연어란 우리가 일상적으로 사용하는 언어입니다. 예를 들어 '안녕하세요.'라는 말은 우리가 '인사'라는 의도로 받아들입니다. 모든 자연어에는 의도가 있습니다. '눈물이 난다'라고 슬픈 감정 표현을 할 수도 있고, '이것 좀 도와줘'라고 우리는 누군가에게 부탁하는 의도로 말을 건네기도 합니다. 


Natural Language Classifier는 이런 자연어들에 대해서 분류를 할 수 있는 API입니다. SNS에 있는 문장들을 갖고 분류를 할 수 있을 겁니다. '오늘은 뭔가 우울해.'라고 누군가의 트위터로 문장을 보냈다면 그 문장은 '우울함'이라고 하는 감정 상태로 분류를 해볼 수 있습니다. 






지금부터 API는 이름이 긴 관계로 줄여서 Natural Language Classifier를 줄여서 NLC 내지는 '자연어 분류기'라고 하겠습니다. 

NLC는 자연어 분류를 할 수 있는 왓슨 API 중에 하나로서 이 API를 사용할 때 가장 중요한 것은 분류기가 분류할 수 있도록 먼저 학습시켜야 한다는 것입니다. 선행학습을 시켜놓고 NLC가 잘 분류하는지 테스트를 하면서 잘 분류를 하지 못하면 선행학습시킬 데이터를 더 많이 집어넣든가 잘 분류화해서 학습시키는 것이지요. 


간략한 사용단계를 나타내면 다음과 같습니다. 

1. 사용자가 학습을 시킨다. 

2. 사용자는 학습을 시킨 후 NLC에게 짧은 텍스트를 던진다. 

3. NLC는 학습한 데이터를 바탕으로 짧은 자연어 텍스트를 분류한다. 

단, 이때 NLC가 반환하는 분류는 0~1의 신뢰도를 갖는다. 

4. 사용자는 NLC가 반환한 분류의 신뢰도로 어떤 분류가 적합한지 판단한다. 





실제로 이것을 구현하기 위해서는 몇 단계가 필요합니다. 

1. IBM 블루믹스 계정을 만듭니다. IBM은 30일간은 무료로 사용할 수 있는 블루믹스 평가판을 제공합니다. 


2. 생성한 블루믹스 계정으로 로그인한 후에 Watson 카테고리에서 Natural Language classifier 서비스를 생성합니다. 


3. Natural Language Classifier를 만들면 해당 서비스의 '서비스 신임 정보'가 생깁니다. 해당 서비스를 사용할 수 있도록 허가하는 username과 password를 부여받는데 그것을 사용해서 서비스를 생성해줍니다.


4. '자연어 분류기'를 만들 준비가 다 되었다면, 학습시킬 데이터를 준비하고 Classifier를 만듭니다. 


5. 트레이닝을 마친 Classifier에게 직접 짧은 자연어 텍스트를 던져봅니다. 

*API를 제공하는 플랫폼 : Node, Java, Python을 위한 API를 제공합니다. 



자연어 분류기가 제공하는 메소드 5가지(여기서는 Java)

1.  createClassifier 

classifier를 생성하는 단계입니다. 분류기를 생성할 때 3가지를 반드시 파라미터로 넣어주어야 합니다. 

- name : 여러분이 분류기에게 부여하고 싶은 이름입니다. 

- languge : 왓슨 NLC가 제공하는 자연어 중에 여러분이 학습시키고자 하는 언어를 적어줍니다. 

언어는 약어로 넣어야 하며 현재 제공하는 언어는 영어, 아랍어, 프랑스어, 독일어, 이태리어, 포르투갈어, 스페인어입니다. 

- 파일 : 아래 데이터 학습에 관한 부분에 자세히 적어놓았습니다. 


2.  getClassifiers 

여러분이 생성한 모든 classifier를 볼 수 있는 API로서 파라미터는 필요하지 않습니다. 


3.  getClassifier 

1개의 classifier를 가져와 status 정보를 확인하는 용도의 API라고 볼 수 있습니다. status 정보는 Available과 Training이 있으며 Available 상태가 되어야 해당 classifier를 이용할 수 있게 됩니다. Traning은 분류기가 여러분이 생성할 때 업로드한 csv파일을 학습하는 트레이닝 상태를 의미하므로 Available이 될 때까지 기다리시길 바랍니다. Available까지는 짧게는 5~10분 정도가 걸리며 길면 30분까지도 걸릴 수 있습니다. 


4.  deleteClassifier 

classifier id를 파라미터로 넘겨 삭제하고자 하는 classifier를 삭제할 수 있습니다. 


5.  classify 

앞서 생성한 classifier에게 짧은 자연어 문장을 넘겨 분류하도록 할 수 있습니다. 이 때 파라미터는 내가 호출하고자 하는 classifier id와 입력할 자연어 텍스트 2가지 입니다. 



데이터 학습 방법

자연어 분류기를 트레이닝시킬 데이터는 일정한 형태를 갖고 있습니다. 우선 파일은 csv로 만들어야 하며, csv파일을 만들 때 주의사항은 반드시 파일 인코딩이 UTF-8이어야 합니다.


학습시킬 자연어는 CSV파일 한 줄에 다음과 같은 형태로 써줘야 합니다. 

한 줄을 레코드라고 하는데 1개의 레코드는 '문장'과 '분류(class)'를 ',(콤마)'로 구분해서 작성합니다. 


예시) notebook_dt.csv파일이 있다고 가정합니다.

해상도가 참 좋습니다,해상도

디자인이 예쁘고 화질이 좋네요,디자인,해상도

크기가 너무 크지 않고 적절합니다,크기


위에서 예로 든 파일의 첫번째 레코드는 '해상도가 참 좋습니다'라는 문장과 '해상도'라고 하는 분류로 나누어져 있습니다. 자연어 분류기에게 이런 문장에 대해서는 해상도라는 분류를 부여하겠다고 한 것입니다. 그리고 분류는 여러 개를 부여할 수 있습니다. 


두번째 레코드는 '디자인과 화질'에 대한 언급이 있었고 이것은 나눌 수 없는 2개가 분류하기 힘든 고유의 분류라고 볼 수 있습니다. 따라서 그에 대해 '디자인'과 '해상도'라고 하는 제 나름의 기준을 갖고 분류를 부여한 것입니다. 


자연어 분류기를 학습시키는 방법은 크게 2가지가 있습니다. 블루믹스에서 제공하는 Tool을 사용하거나 아니면 직접 csv파일을 만들어서 파일 업로드를 하는 방법입니다. 



더 나은 자연어 분류를 위한 조언 

- 레코드의 텍스트 입력시 되도록 60단어 미만으로 제한하길 권하고 있습니다.

- 1개의 텍스트와 1개의 클래스만을 갖는 레코드를 만들 경우 해당 클래스에 대한 레코드를 5-10개 정도를 학습시킵니다.

- 텍스트가 모호하다고 판단되는 경우 1개의 클래스로 구분짓는 것은 부족할 수 있습니다. 

- 1개의 텍스트가 3개 이상의 클래스를 갖으며, 클래스가 계층을 가질 경우 단말 모드를 클래스로 할 것입니다. 


왓슨에서 제공하는 자연어 분류기는 백지상태라고 보시면 됩니다. 단순히 IBM은 API만을 제공하는 것이고, 분류는 우리가 학습시킨 데이터를 바탕으로 이루어지기 때문에 제일 중요한 것은 데이터를 어떻게 분류화시켜서 학습시킬 것인가입니다. 특히 자연어 중에서도 한국어 부분은 공식적으로 아직까지 API상으로 공식적으로 지원하고 있는 상태는 아니지만, 한국어 역시 어느 정도는 분류가 가능합니다. 영어의 경우는 정확도가 매우 높습니다. 



마무리

한창 인공지능과 제4차산업혁명에 대한 관심이 뜨겁습니다. 이 분야에 대해 관심이 많은 개발자분들에게 왓슨 API가운데 종류가 무엇이 있고 어떤 기능들을 하는지에 대해 조금이나마 도움이 되길 바랍니다. 또한 개발자가 아닌 다른 분들에게도 인공지능 서비스에 대한 관심이 있는 개발자가 아닌 분들에게도 간략하게 나마 소개할 수 있는 글이었길 바랍니다.






  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기