aws comprehend
는 aws에서 제공하는 텍스트 분석 서비스입니다. comprehend에서는 엔티티(용어) 인식 / 감정 분석 / 언어 분석 / 구문 분석 등의 기능을 제공합니다. 저는 이번에 일기에서 감정을 추출해서 색으로 기록하는 프로젝트를 하게 되었는데요, 감정을 추출하기 위해서 aws comprehend를 사용하기로 했습니다.
사실 언어를 분석해주는 기능은 클로바에서도 제공합니다. 심지어 한국어에 최적화된 감정 분석을 해준다는 장점 때문에 Clova를 써야할지, aws comprehend를 써야 할지 고민이 되었습니다. 결론적으로 편의성과 확장성이라는 이유 때문에 aws comprehend를 사용하기로 했습니다.
1) 편의성
Clova Sentiment의 경우 api를 호출해서 감정을 분석할 수 있습니다. 이를 위해서 따로 키를 발급받는 등의 절차가 필요합니다. 반면 Aws Comprehend의 경우 sdk를 지원하기 때문에 aws의 python sdk인 boto3
를 import 하기만 해도 감정 분석을 사용할 수 있었습니다.
2) 확장성
Clova Sentiment는 두가지 기능을 제공합니다. 감정 분석과, 감정이 많이 나타난 문장을 추출하는 기능입니다. 반면 Aws Comprehend는 감정 분석 뿐 아니라 용어 인식, 구문 분석 등 더 다양한 기능을 제공했습니다. 추후 '사용자가 일주일간 가장 많이 사용한 단어'등의 통계를 내는 등 기능이 확장될 수 있으므로 Aws Comprehend를 사용하기로 했습니다.
aws에서는 aws의 서비스를 쉽게 사용할 수 있도록 sdk를 제공하는데요, 이를 이용하면 아주 간단하게 Comprehend의 함수를 호출할 수 있습니다. 이 글에서는 python의 aws sdk인 boto3
를 사용하는 예시를 보여드리겠습니다. boto3로 comprehend를 사용하는 문법은 공식 문서를 참고하시면 됩니다. (참고 : 예시 코드 깃허브, 공식 문서)
우선, boto3를 import 해주고 comprehend 객체를 만들어줍니다.
import boto3
comprehend = boto3.client('comprehend')
위의 깃허브 코드 예시를 참고하여 comprehend의 함수를 호출합니다.
# 용어 추출
entities = comprehend.detect_entities(Text = text, LanguageCode = lang_code)
# 핵심 구절 추출
phrases = comprehend.detect_key_phrases(Text = text, LanguageCode = lang_code)
# 감정 분석
sentiment = comprehend.detect_sentiment(Text = text, LanguageCode = lang_code)
이때, 인자의 이름을 생략하면 아래와 같은 에러가 발생합니다.
"errormessage": "detect_entities() only accepts keyword arguments."
e.g. comprehend.detect_sentiment(text, lang_code)
=> 에러
e.g. comprehend.detect_sentiment(Text = text, LanguageCode = lang_code)
=> 정상 작동
import json
import boto3
comprehend = boto3.client('comprehend')
def lambda_handler(event, context):
text = event['inputTranscript']
lang_code = 'ko'
print("용어 추출")
entities = comprehend.detect_entities(Text = text, LanguageCode = lang_code)
print(entities['Entities'])
print("핵심 구절 추출")
phrases = comprehend.detect_key_phrases(Text = text, LanguageCode = lang_code)
print(phrases['KeyPhrases'])
print("감정 분석")
sentiment = comprehend.detect_sentiment(Text = text, LanguageCode = lang_code)
print(sentiment['SentimentScore'])
위 코드가 람다에서 돌아가게 하려면, 정책에 람다 실행 권한인 AWSLambdaBasicExecutionRole
와 comprehend 접근 권한인 ComprehendFullAccess
가 포함되어야 합니다. 두 권한이 포함된 IAM 역할을 생성하고 람다 함수에 해당 역할을 연결해줍니다.
이벤트 JSON - 부정 감정 감지 테스트
{
"inputTranscript": "오늘은 정말 힘든 하루였다. 엄마가 보고싶다."
}
결과 log
용어 추출
[
{
"Score": 0.9514784812927246,
"Type": "DATE",
"Text": "오늘",
"BeginOffset": 0,
"EndOffset": 2
}
]
핵심 구절 추출
[
{
"Score": 0.9993739724159241,
"Text": "오늘",
"BeginOffset": 0,
"EndOffset": 2
},
{
"Score": 0.7809107899665833,
"Text": "힘든 하루",
"BeginOffset": 7,
"EndOffset": 12
},
{
"Score": 0.9997801184654236,
"Text": "엄마",
"BeginOffset": 16,
"EndOffset": 18
}
]
감정 분석
{
"Positive": 0.022698456421494484,
"Negative": 0.9068351984024048,
"Neutral": 0.0702165737748146,
"Mixed": 0.00024978703004308045
}
이렇게 감정과 단어가 잘 분석되었음을 확인할 수 있습니다. aws는 공식 문서가 정말 잘 정리되어있는 것 같습니다 ㅎㅎ boto3의 공식 문서를 보면 어렵지 않게 다른 aws의 서비스들도 사용할 수 있을 것 같습니다🤗