네이버 클라우드 플랫폼(NCP)
네이버 클라우드 플랫폼 (NCP)

들어가기

네이버 클라우드 플랫폼 (이하 NCP)에서는 여러 가지 유용한 기능을 제공하고 있는데 이 중에서는 무료로 사용할 수 있는 서비스도 있다.

대표적인 것이 바로 AI.NAVER API인데 호출량에 따라 어느 정도까지는 무료로 제공하고 있기 때문에 간단한 분석에 유용하게 사용할 수 있다. (그리고 가격도 저렴한 편이다)

이 중에서 네이버 클로바 감정분석 API는 월 1,000건까지는 무료로 사용할 수 있는데 이 포스팅에서는 감정분석 API를 활용하여 결과값을 가져오는 것까지를 다루고 있다. 결과값을 활용하여 문장 내 긍정/부정 하이라이트를 엑셀로 구현하는 것은 다음 포스팅에서 다룰 예정이다.

네이버 클라우드 플랫폼(NCP)

우선 NCP로 이동하여 회원가입을 해야 한다
https://www.ncloud.com/

회원가입은 본인이 가지고 있는 네이버 아이디를 사용하여 쉽게 할 수 있고 원한다면 별도의 이메일 주소 등으로 사용이 가능하다.

결제수단 등록, API 사용 신청

NCP에서 API를 사용하기 위해서는 우선 결제수단을 등록해야 한다.
결제 수단은 신용/체크카드로만 가능하고 월 사용량을 계산하여 자동으로 결제되는 방식이다.

결제수단을 등록했다면 오른쪽 상단 “콘솔”이라는 버튼을 누른 뒤 좌측의 “Services” 메뉴로 이동한다.

그리고 AI·NAVER API를 누른 뒤 다음과 같은 순서로 진행한다.

  1. Application 등록 클릭
  2. Application 이름: 원하는 이름으로 아무거나, 영문으로 작성
  3. Clova Sentiment 클릭하여 선택
  4. 하단 Web 서비스 URL 항목에 http://localhost 입력 후 “추가” 버튼 클릭
    (우리는 파이썬으로 사용할 예정이므로 로컬호스트를 입력해준다)
  5. 저장

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개의 댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다