WiseN

텍스트 자연어 처리 서비스 - Amazon Comprehend 소개

Blog thumbnail


시작하며


안녕하세요. GS네오텍 임성균입니다.

Re:invent 2019 이후 AI/ML 포스팅의 첫번째 SaaS형 서비스인 Amazon Comprehend로 다시 돌아왔습니다.

문화체육관광부에서는 독서문화진흥 계획으로 23년까지 국민 연평균 독서량을 8.3권(2017년 기준)에서 12.0권으로 늘리겠다는 계획을 밝혔습니다. 여러분은 얼마나 많은 독서를 하고 계신가요? 혹시 바쁘시다면 더더욱 읽기가 쉽지 않을 것입니다. 

시작하기에 앞서 서두에 말씀드린내용을 토대로 Amazon Comprehend를 사용하게 되면 텍스트에 대한 핵심 구문과 장소, 사람, 브랜드 또는 이벤트를 추출할 수 있습니다. 바쁜 현대인에게 ‘용건만 간단히!!’ 기능이 될 수 있을 것 같은 기분이 듭니다.

이번 포스팅은 Amazon Comprehed에 대한 기본적인 기능과 꾸준히 업데이트 된 소개합니다. 바로 시작하겠습니다.

 

  

Amazon Comprehend 주요 업데이트 소식!


1. AmazonComprehend 한국어 지원

"2019년 11월 7일 이후 한국어 포함 중국어(번체), 중국어(간체), 힌디어. 일본어 및 아랍어 등 6가지 새로운 추가함으로서, 기존 영어, 프랑스어, 독일어, 이탈리아어, 포르투갈 및 스페인어와 함께 총 12개 언어를 지원합니다."

 

2. Amazon Comprehend 서울 리전 출시

" 2020년 1월 13일부터 서울 리전을 포함해서 도쿄 및 뭄바이 리전에서 사용 가능합니다."

 

 

Amazon Comprehend는 뭘까요?


▨ Amazon Comprehend 기능 소개

‘Comprehend’라는 단어는 '(충분히)이해하다’라는 뜻을 가지고 있습니다. 그런 의미로 기계학습을 사용하여 텍스트 안에 의미를 찾아내고 통찰을 얻는 자연어 처리(NLP) 서비스입니다. 자연어 처리(NLP)란 스마트하고 유용한 방식으로 컴퓨터가 텍스트 정보를 분석하고 이해하며 의미를 도출하는 방법의 하나입니다. NLP를 활용하여 중요한 구절, 감성, 구분뿐 아니라 브랜드, 날짜, 위치 사람 등 주요 엔터티와 텍스트의 언어를 추출할 수 있습니다. 결국! 텍스트 정보를 기반으로 정보를 분석하여 주요 정보를 추출하는 과정을 지원해주는 서비스라고 생각하시면 됩니다.

그렇다면 Amazon Comprehend에서 가장 일반적인 사용 사례는 무엇일까요?

일반적으로 사용하는 사례는 전화, 이메일, 소셜 미디어 및 기타 온라인 채널을 통해 받은 피드백을 기반으로 고객의 감성이 긍정적인지, 중립적인지, 부정적인지 또는 여러 감성이 혼합되어 있는지 판단할 수도 있고 문서 집합을 분석하고 주제별 자동 정리를 도와줄 수 있습니다. 이 밖에도 검색엔진이 핵심문구, 엔터티 및 감성을 인덱싱하도록 지원함으로써 더 나은 검색 환경을 제공할 수 있습니다.


▨ Amazon Comprehend 알고리즘

사실 SaaS 형태의 서비스는 그대로 쓰면 되겠지만!! 간단하게 자연어 처리(NLP) 알고리즘 히스토리를 알고 가면 더욱 가까워지는 느낌이 들 거 같습니다. SaaS 형태인 Amazon Comprehend의 알고리즘은 '이것'이라고 할 수는 없지만 최신의 트렌드에 맞추어 발전하고 있을 것입니다. 그렇기 때문에 자연어 처리 기술이 어떻게 발전해 왔는지, 흐름을 파악하시면 좋을 듯합니다.

말씀드린 부분은 자연어 처리가 크게 발전한 방향이니 반드시 이것이 맞는다고 하실 수는 없지만 참고하시면 좋을듯 합니다. 현재까지도 계속해서 알고리즘 분석과 연구가 활발히 진행되고 있으니, "지금의 알고리즘이 최고다!"라는 생각은 해주지 않았으면 좋겠습니다(아래 그림과 같이 언급된 알고리즘 이외에도 아주 많은 알고리즘이 있습니다).

 

먼저 자연 언어 처리는 인간이 사용하는 언어 분석과 표현을 컴퓨터로 하여금 자동화하여 계산하기 위한 기법이며, 컴퓨터의 발전으로 인해 파싱, 품사 태깅에서 부터 번역, 질의 응답에까지 다양한 과업을 모두 수행할 수 있도록 발전하였습니다. 간단한 통계 기반의 자연어 처리 기법부터 목적에 맞는 기법별 알고리즘이 등장하여 자동화된 피쳐 엔지니어링부터 피쳐 학습, 원하고자 하는 결과까지 얻을 수 있습니다. 

예를 들어 최근 연구 기법 중 감정 분석(Sentiment analysis) 기술을 살펴보면, 머신러닝 알고리즘을 이용하여 문잭의 편향성(polarity)을 바탕으로 제시된 문자에서 긍정, 부정 등 감정을 분류하는 기술을 소개합니다. 최근 감정분석에 사용되는 알고리즘은 Sentiment Analysis Alogrithms며 두 가지 주요 감정 분석 방법(Rule-based approach​, Automatic Sentiment Analysis)을 가지고 있습니다. 

먼저 Rule-based approach는 식별할 구문에 대해 명확하게 정의가 되어 있는 알고리즘을 기반으로 합니다. 주관, 의견 주제를 식별하는 것에 사용하며 동작 방식은 단어 목록 중 하나는 긍정적인 것만 포함하고 다른 하나는 부정적인 것을 포함합니다. 이때 알고리즘은 텍스트를 살펴보고 기준과 일치하는 단어를 찾습니다. 그 이후 알고리즘은 텍스트에서 어떤 유형의 단어가 더 많이 사용되는지 계산합니다. 더 긍정적인 단어가 있다면, 텍스트는 긍정적인 것으로 간주합니다. Rule-based approach 장점은 문맥을 고려하지 않기 때문에 메시지의 톤이 일정하여 고객 지원에 유용할 수 있습니다. 반대로 유연성과 정밀도가 부족하다는 단점을 가지고 있습니다. 

두 번째는 메시지의 요점 등을 파악하기 위한 기계학습 방식인 Automatic Sentiment Analysis 기술입니다. 기계학습으로 인해 정밀도(Precision​)와 정확도(Accuracy​)가 획기적으로 높아지며, 수많은 문장을 한꺼번에 처리할 수 있는 장점을 가지고 있습니다. 실제로 사용되는 분류 알고리즘은 Linear Regression, Naive Bayes, Support Vector Machines, RNN derivatives LSTM and GRU 등이 있으며 데이터 분석을 위해 Supervised Machine Learning 분류과 UnSupervised Machine Learning을 사용합니다. 상황별 세부적인 알고리즘이 달라지고 세분화 되기 때문에 이러한 발전된 알고리즘의 히스토리를 이해한다면 더욱 맞춤형 서비스를 사용할 수 있지 않을까 기대됩니다. 

 

 

Amazon Comprehend 시작하기(Demo)


딱딱하신 글 읽기에 너무 고생많으셨습니다. 원래 목표인 Amazon Comprehend를 잘쓰는 방법을 목표로 오셨다면 두 가지 방식을 한번씩 실습하신다면 서비스에 대한 상당한 이해도를 가지실 것 같습니다. 실습은 두가지 방식으로 준비하였습니다. 첫번째는 SaaS 형태의 서비스를 AWS Console을 이용하여 경험하는 방법과 간단한 시나리오를 통해 구현하는 방법을 실습할 예정입니다. 시나리오 진행 시 따라오실 수 있도록 최대한 자세히 적어보도록 하겠습니다. 

 

▨ 간편하게 AWS Console 이용하기

사실 AWS Console은 너무 쉽습니다! Console 화면에서 Amazon Comprehend를 찾으셔서 들어가시기만 하면 됩니다. 실습 과정은 다음의 과정을 따라하시면 됩니다.

실행순서 : AWS Management Console → Services →​ Amazon Comprehend →​ Real-time analysis →​ input text →​ Analyze​

 

 

분석하기 위한 모드는 Built-in Type과 Custom Type이 있습니다. Built-in Type은 위 이미지처럼 AWS에서 제공되는 모델을 통해 실시간으로 insight를 보여주는 방식입니다. Custom Type은 사용자가 직접 학습데이터와 모델을 통해 분류기를 만드는 것입니다. 

 

Custom Type의 경우 학습할 데이터를 Amazon Simple Storage Service(Amazon S3) 버킷에 저장해야 합니다. 버킷에는 Amazon Comprehend 액세스를 허용하는 AWS Identity and Access Management (IAM) Amazon Comprehend 읽기 권한이 있어야합니다.​ 'CreateDocumentClassifier​' 작업을 통해 Training job을 시작합니다.

 

분류를 위한 Training은 한 언어로만 가능하며 여러개를 혼합하여 사용할 수는 없습니다. Amazon Comprehend에 Custom 분류를 요청하게되면 'DescribeDocumentClassifier​' 작업을 사용하여 요청 진행률을 모니터링 할 수 있습니다. Status 필드가 'Trained' 이면 Custum Type을 사용하실 수 있습니다(참고: 학습데이터는 csv파일이여야 하며, 적어도 클래스당 10 Document를 가지고 있어야 합니다).

 

 ▨ Amazon Comprehend을 이용하여 실시간 Twitter 분석하기

 

 두 번째 Demo는 트위터에서 발생하는 Sentiment와 Entitity를 Serverless 환경에서 머신러닝 솔루션인 Amazon Comprehend로 분석하는 시나리오입니다. 위 그림을 보면 트위터 API를 이용하여 Amazon Kinesis Streams에 데이터를 스트림 함과 동시에 서버리스 환경에서 각종 서비스를 실행시켜줄 AWS Lambda, AWS Comprehend로 분석된 데이터를 다시 Amazon Simple Storage Service(Amazon S3)에 넣어 줍니다. 추가적으로 분석된 데이터를 시각화 하기 위해 Amazon Athena와 Amazon Quicksight를 이용합니다. 이번 Demo는 Amazon Comprehend 분석에 대한 포스팅이기 때문에 추가적인 부분은 시간에 따라 실습에서 제외하셔도 무방합니다.

 

⚙︎ 실습 환경 설정

1. 서비스를 구성할 수 있는 권한이 있는 AWS 계정 설정
2. 트위터 계정(Twitter Developer App 권한 사용)
3. Python 환경설정
      Linux 명령어: " Sudo pip install tweepy boto3 aws cli "

 

먼저, Twitter Developer에서 API를 사용할 수 있는 권한이 있어야 합니다. API를 받아 4개의 정보(Consumer Key, Consumer Secret, Access Token, Access Token Secret)를 얻어야 합니다. 트위터에서 제공된 연결방법(Link)을 참조하여 API 정보를 받습니다.

 두 번째 단계는 Kinesis Data Stream을 통한 데이터 수집하기 위한 단계입니다. AWS Management Console에서 Amazon Kinesis Stream을 입력한 뒤 'Get started'를 합니다. 아래 그림을 참조하여 Kinesis Stream Name을 설정 한뒤 프로세스를 시작합니다(이 때 Twitter API Python 코드에 Kinesis Stream Name이 설정되니 기억해두시기 바랍니다).

 

현재 사용하고 계시는 실습 PC에 twitter_to_kinesis.py(Link)를 이용하여 실행합니다. 코드를 링크를 통해 다운로드 받고 Consumer Key, Consumer Secret, Access Token, Access Token Secret​, Kinesis Stream Name의 정보를 수정합니다. 실행코드는 파일이 있는 위치에서 다음의 명령어를 입력합니다. Streaming이 잘되는지 확인을 하기 위해서는 Amazon Kinesis Stream Dashboard를 통해 만들었던 Data Streams를 클릭하고 Monitoring에서 Get Records가 집계되고 있는지 확인하시면 됩니다.​

" Python 실행명령어 : python ./twitter_to_kinesis.py "

세번째 단계는 AWS Lambda 설정 부분과 S3 버킷 생성입니다. S3의 버킷 생성은 'Bucket name', Kinesis와 같은 Region 설정 하시면 됩니다(Bucket name은 Lambda code에 설정위해 기억 필요). 분석된 데이터를 넣어 둘 S3 bucket이 생성되었고, 네번째 단계인 Amazon Comprehend API를 이용하는 AWS Lambda 설정 단계에 대해 알아보겠습니다. AWS Management Console에서 AWS Lambda를 설정한 뒤 해당 리전에 'Create a function' 합니다. Lambda Fuction의 정보는 다음과 같습니다:​

Author from scratch
Function Name: twitter_analyzer
Runtime: Python 2.7​
Permisions → Role: Create new role from templates → Role name: lab-twitter-analyzer-lambda-role​

Lambda Fuction을 만드셔다면 Fuction Code(Link)를 작성해야 합니다. 다운로드 받은 코드는 BUCKET_NAME을 설정한 S3 Bucket Name으로 설정해줍니다. 실제 Twitter로 Streaming된 데이터를 분석하는 Amazon Comprehend 코드가 구현되어 있으며, 분석한 결과를 다시 S3의 JSON 포맷으로 넣어주는 코드입니다.

Lambda를 설정하였으니 Lambda의 권한! IAM Role을 설정해야 진정하게 Lambda를 실행할 수 있습니다. IAM Role 설정방법은 다음과 같습니다.

Console에서 IAM Role → 왼쪽 탭에 Roles → 'lab-twitter-analyzer-lambda-role' Click → Attach policy합니다. Attach policy ​할 목록인 3가지(AmazonS3FullAccess, AmazonKinesisReadOnlyAccess, ComprehendReadOnly)를 설정해줍니다. 

권한까지 완벽하게 주어졌으니 이젠 Lambda 트리거를 걸어보도록 하겠습니다. 위 그림과 같이 만들어준 Lambda에 Designer로 +Add trigger 를 등록해줍니다. Kinesis stream은 설정된 Kinesis name으로 Batch size는 10으로 설정하여 Add 버튼을 클릭합니다. 마지막으로 트리거 구성이 완료되면 'Enabled' 클릭한 뒤 저장합니다.

트리거가 활성되어 Lamda 기능이 Kinesis 레코드를 처리하기 시작할 겁니다. 위 분석된 그림과 같이 CloudWatch나 Monitoring 탭에서 기능을 호출하여 모니터링 할 수도 있고, 지금까지 잘 설정되었다면 S3버킷에도 분석된 데이터 실제로 존재하는 것을 확인하실 수 있습니다.

실습의 마지막 단계입니다. 바로 시각화 단계입니다. S3에 저장된 데이터를 활용하기 위해 QuickSight는 Athena를 사용하여 쿼리를 실행합니다. 쿼리를 대신 설정해주는 부분이 바로 AWS Glue입니다. 저희는 Glue로 트위터의 Sentiment와 그 밖에 데이터를 만드는 테이블을 만들어 보겠습니다. 다음 단계를 따라오시면 됩니다.

Console을 통해 AWS Glue 접속하여 Databases에서 Add database로 클릭합니다. Database Name은 Analyzed_twitter로 만듭니다. 만들어진 Database에서 Crawlers를 이용하여 Add crawler 합니다. Crawler Name은 crawler_twitter, S3의 Include path는 아까 만들어준 S3 경로(s3://bucket-name)로 지정해줍니다. IAM 설정도 마찬가지로 Create an IAM role과 Glue-twitter-analyzer로 만들어 줍니다. 다음은 Database name을 클릭해준뒤 설정을 마무리해주시면 됩니다. 바로 Run crawler 클릭 고고!(Crawler의 경우 column의 Tweet_data_를 timestamp로 식별하지 않으므로 Edit → schema → 설정할 Column과 TIMESTAMP type을 업데이트 해줍니다)​

Athena Console로 이동하여 생성된 데이터베이스를 선택하고 다음의 쿼리를 실행하게 되면 이제 QuickSight를 사용하여 분석된 트윗에 대한 분석 및 시각화를 실행할 준비가 되셨습니다!​

" 쿼리문 : SELECT sentiment, count(*) AS NumberOfTweets FROM sentiment GROUP BY sentiment "

이제 시각화의 마무리!! QuickSight가 남았는데요. 먼저 QuickSight account를 설정해줍니다(설정시 비용이 발생함을 미리 말씀드립니다). QuickSight 접근을 하기 위해 S3 버킷의 권한을 주도록 하겠습니다. IAM role에서 aws-quick-service-role을 클릭한 뒤 Attach policy가 아닌 Add inline policy로 권한을 주도록 합니다. 설정에 대한 파라미터 지정은 다음과 같습니다.

Service: S3
Actions: List, Read
Resource: Add ARN S3 bucket name
Object: Any​

Policy를 만들고 나면 접근 권한이 생기신겁니다. 이제 QuickSight로 다시 돌아가 데이터를 Import 하고 설정해보도록 하겠습니다. 시각화 하는 과정은 간략히 다음설정을 따라오시면 됩니다:)

Manage Data → Now data set →​ Athena를 클릭한 뒤 엔티티 이름에 해당하는 Create data source → Name과 entites 설정 →​​ Edit/Preview data →​ 상단에 Add data →​ sentiment 클릭 → 관계(분홍색) 클릭​ 후 entites의 tweet_id, sentiment의 tweet_id로 FUll join type 설정 → Apply →​ 조인되어 중복된 tweet_date, tweet_text, tweet_id는 선택을 헤제 →​ Save&visualize​

 

실습 결과화면 출력 단계입니다. 원하시는 Metic을 구성하여 insight로 그래프를 만듭니다.

 

실습을 따라오시느라 수고많으셨습니다. SaaS 형태의 서비스를 실행하기 위해 여러가지 서비스를 이용하여 구성해보았습니다. 구성하셨던 실습 환경이 모두 데이터를 분석하기 위한 것이니 이번시간은 Amazon Comprehend의 기능에 집중하여 보시면 좋을듯 합니다. 

 

 

 ​마치며


Amazon Comprehend의 과금도 역시 On-Demand 형식으로 월별로 처리되는 텍스트의 양에 따라 요금이 부과됩니다. 텍스트 분석에 따라 자연어처리, 주제모델링, 사용자 지정 Comprehend로 나누어 과금이 됩니다. 유닛당 요금에 대해서는 AWS 공식홈페이지를 통해 보다 더 자세한 요금체계를 확인하실 수 있습니다!

COVID-19로 인해 많은 분들이 고생하실 것 같습니다. 건강 유념하시고 이만 블로그를 마치겠습니다.

긴 글 읽어주셔 감사합니다 .