들어가기
네이버 클라우드 플랫폼 (이하 NCP)에서는 여러 가지 유용한 기능을 제공하고 있는데 이 중에서는 무료로 사용할 수 있는 서비스도 있다.
대표적인 것이 바로 AI.NAVER API인데 호출량에 따라 어느 정도까지는 무료로 제공하고 있기 때문에 간단한 분석에 유용하게 사용할 수 있다. (그리고 가격도 저렴한 편이다)
이 중에서 네이버 클로바 감정분석 API는 월 1,000건까지는 무료로 사용할 수 있는데 이 포스팅에서는 감정분석 API를 활용하여 결과값을 가져오는 것까지를 다루고 있다. 결과값을 활용하여 문장 내 긍정/부정 하이라이트를 엑셀로 구현하는 것은 다음 포스팅에서 다룰 예정이다.
네이버 클라우드 플랫폼(NCP)
우선 NCP로 이동하여 회원가입을 해야 한다
https://www.ncloud.com/
회원가입은 본인이 가지고 있는 네이버 아이디를 사용하여 쉽게 할 수 있고 원한다면 별도의 이메일 주소 등으로 사용이 가능하다.
결제수단 등록, API 사용 신청
NCP에서 API를 사용하기 위해서는 우선 결제수단을 등록해야 한다.
결제 수단은 신용/체크카드로만 가능하고 월 사용량을 계산하여 자동으로 결제되는 방식이다.
결제수단을 등록했다면 오른쪽 상단 “콘솔”이라는 버튼을 누른 뒤 좌측의 “Services” 메뉴로 이동한다.
그리고 AI·NAVER API를 누른 뒤 다음과 같은 순서로 진행한다.
- Application 등록 클릭
- Application 이름: 원하는 이름으로 아무거나, 영문으로 작성
- Clova Sentiment 클릭하여 선택
- 하단 Web 서비스 URL 항목에 http://localhost 입력 후 “추가” 버튼 클릭
(우리는 파이썬으로 사용할 예정이므로 로컬호스트를 입력해준다) - 저장
API 키 확인
AI·NAVER API 화면으로 돌아오면 내가 만든 Application 이름이 보이고
“인증정보”라는 버튼이 보인다.
“인증정보”를 눌러보면 API사용에 필요한 “Client-ID”와 “Client-Secret”을 확인할 수 있다.
파이썬에서 호출
참고로 아래 코드는 df라는 Pandas 데이터 프레임 내에 ‘text’라는 열에 감정 분석이 필요한 문장을 넣어두었고 for문에 의해 하나씩 순차적으로 감정분석이 실시된 후 결과값은 df 데이터 프레임의 ‘result’ 열에 저장되도록 한 것이다.
for문이 돌 때마다 1초씩 쉬도록 했는데 이는 API에서 안정적으로 응답을 받기 위해 텀을 둔 것이다.
#클로바 API를 활용하여 감정분석 실시
import sys
import requests
import json
import time
import pandas as pd
for i in range(len(df['text'])):
client_id = "X-NCP-APIGW-API-KEY-ID"
client_secret = "X-NCP-APIGW-API-KEY"
url="https://naveropenapi.apigw.ntruss.com/sentiment-analysis/v1/analyze"
#API ID와 Secret 입력
headers = {
"X-NCP-APIGW-API-KEY-ID": "여기에 Client ID 입력",
"X-NCP-APIGW-API-KEY": "여기에 Client Secret 입력",
"Content-Type": "application/json"
}
#API로 확인할 문장
content = df['text'][i]
data = {
"content": content
}
print(json.dumps(data, indent=4, sort_keys=True))
#API로 통신한 뒤 응답 내용 저장
response = requests.post(url, data=json.dumps(data), headers=headers)
rescode = response.status_code
#정상 호출인 경우 응답내용을 표시
if(rescode == 200):
print (response.text)
else:
print("Error : " + response.text)
#응답을 새로 만들어둔 result 열에 저장
df.loc[i, "result"] = response.text
time.sleep(1)
감정분석 API 제한사항
일단 1,000글자가 넘는 문장은 API에서 결과값을 받을 수 없다.
너무 긴 문장을 API로 보내면 바로 에러가 나오면서 1,000자가 넘어 결과를 받아올 수 없다는 메시지가 뜬다
결과값
type(df.loc[0, “result”])로 결과값을 확인해보면 str타입이다.
일부러 결과값을 str 타입으로 받았는데 엑셀로 결과값을 일단 저장해두기 위해서이다. 향후에 결과값을 활용하기 위해서는 dict 타입으로 결과값을 변경하여 사용해야 한다.
#결과값 dict 타입으로 변경하기
for i in range(len(df['result'])):
df['result'][i] = json.loads(df['result'][i])
결과값(dict)형태 예시
결과값의 예시는 다음과 같다.
{
"document": {
"sentiment": "negative",
"confidence": {
"neutral": 0.14525136640572725,
"positive": 0.00186876227013191,
"negative": 0.8528798713241407
}
},
"sentences": [
{
"content": "싸늘하다.",
"offset": 0,
"length": 5,
"sentiment": "negative",
"confidence": {
"negative": 0.9961358904838562,
"positive": 0.0036366574931889772,
"neutral": 0.0002274021098855883
},
"highlights": [
{
"offset": 0,
"length": 4
}
]
},
{
"content": " 가슴에 비수가 날아와 꽂힌다.",
"offset": 5,
"length": 17,
"sentiment": "negative",
"confidence": {
"negative": 0.927976131439209,
"positive": 0.07131962478160858,
"neutral": 0.0007042606011964381
},
"highlights": [
{
"offset": 1,
"length": 15
}
]
}
]
}
전체 문장이 있고 각 문장 중에 감정분석에 유효한 영향을 준 문장의 경우 별도로 긍정인지 부정인지, 중립인지 표시해준다. 또한 highlights할 문장의 offset 위치와 length 길이를 표시해준다.
마치며
다음 포스팅에서는 이러한 API결과값을 활용하여 긍정/부정 문장을 색깔로 칠한 뒤 엑셀로 내보내는 방법을 다루어볼 예정이다.
0개의 댓글