네이버 클라우드 플랫폼(Naver Cloud Platform)을 사용하여 긴 문장 요약하기

VDoring·2022년 6월 2일
0
post-thumbnail


안녕안녕~

Velog에 정말 오랜만에 찾아오게 되었다. 딱히 이유는 없다..

오늘은 일반 글이나, 뉴스 기사를 3문장으로 요약하는 프로그램을 만들어보겠다.

그럼 바로 시작하겠다.


먼저 작동 결과를 보여주겠다.

수많은 문장이, 단 3줄로 요약되었다.

어떤가? 아주 획기적이지 않은가?

네이버 웹사이트에서는 맞춤법검사기, 글자수세기 처럼 이런 요약 기능을 별도로 제공해 주진 않는 것으로 안다. 그리 널리 알려진 API도 아니다. 즉, 조금만 키보드 타이핑하면, 유용하게 사용할 수 있음을 넘어, 이것에 대해 잘 모르는 친구들에게 자랑도 할 수 있단 소리!

분류 기술도 네이버의 수년간 노하우를 기반으로 하기에, 적어도 분류가 잘 안된다고 욕먹진 않을 것이다.


문장 요약 기술은 네이버에서 제공한다. 정확히는 네이버 클라우드 플랫폼(Naver Cloud Platform)의 CLOVA Summary API이다.

아래의 사이트에 들어가면 상세한 내용을 알 수 있다.
https://www.ncloud.com/product/aiService/clovaSummary

사용하려면 회원가입을 해야 한다. 이후 '이용 신청하기'를 눌러 등록 버튼을 누른 후 사용할 서비스를 선택하고 앱 이름을 등록한다.
이름은 그저 구분용에 불과하니 그리 고심 안 해도 된다.

적용이 완료되면 위와 같이 활성화가 된 모습을 볼 수 있다. 사용 횟수는 요금 안 나오게 잘 설정하자. 한 달 한도를 999로 설정하면 비용이 들지 않고 사용할 수 있을 것이다.


설정을 다 했다면, 아래 코드를 붙여넣어보자.

# -*- coding: utf-8 -*-
import requests
import json
import time

print('>> 한방에 끝내는 문장 정리. 핵심 문장을 추출하고, 요약하는 프로그램입니다! <<')
    
def internetCheck():
    url = 'http://www.google.com/'
    timeout = 3

    try:
        r = requests.head(url, timeout=timeout)
        return True
    except requests.ConnectionError:
        return False
    except:
        return False
    

client_id = "client_id"
client_secret = "client_secret"
url="https://naveropenapi.apigw.ntruss.com/text-summary/v1/summarize"
headers = {
    "X-NCP-APIGW-API-KEY-ID": client_id,
    "X-NCP-APIGW-API-KEY": client_secret,
    "Content-Type": "application/json"
}
    
user_sentence_table = {"한글" : 0, "숫자" : 0, "빈칸" : 0}

while True:
    print('\n====================================================================================================================')
    print('\n\n요약할 문장을 입력하세요 >')
    print('한 번에 2000자까지 입력 가능합니다. 아래에 문장을 직접 쓰거나, 붙여넣으세요.')
    print('[!] 붙여넣기 시 문장이 완전히 이어져야 합니다. 붙여넣기 전, Enter키를 사용한 부분을 제거해주세요. [!]\n')
    user_sentence = str(input('문장입력: '))
    user_sentence_table["한글"] = 0
    user_sentence_table["숫자"] = 0
    user_sentence_table["빈칸"] = 0
    for i in user_sentence:
        if (i.isalpha()):
            user_sentence_table["한글"] += 1
        elif (i.isdigit()):
            user_sentence_table["숫자"] += 1
        elif (i.isspace()):
            user_sentence_table["빈칸"] += 1
    print('> 문자 수: ', end='', flush=True)
    print(user_sentence_table["한글"] + user_sentence_table["숫자"] + user_sentence_table["빈칸"])
    if 2000 <= user_sentence_table["한글"] + user_sentence_table["숫자"] + user_sentence_table["빈칸"]:
        print('> 입력한 문장이 2000자 이상입니다. 다시 입력하세요.\n\n\n')
        time.sleep(0.5)
        continue
    
    print('\n\n\n요약 타입을 설정하세요 >')
    print('일반 문서 요약 = \'0\'을 입력.\n뉴스 요약 = \'1\'을 입력.\n')
    user_model_select = str(input('숫자입력: '))
    if user_model_select == "0":
        user_model = str("general")
    elif user_model_select == "1":
        user_model = str("news")
    else:
        print('> 올바른 입력이 아닙니다. 처음으로 돌아갑니다.\n\n\n')
        time.sleep(0.5)
        continue
    
    print('\n\n\n어투를 설정하세요 >')
    print('원문의 어투 유지 = \'0\'을 입력.\n해요체(~요.)로 바꾸기 = \'1\'을 입력.\n정중체(~다.)로 바꾸기 = \'2\'를 입력.\n명사형 종결체(~함.)로 바꾸기 = \'3\'을 입력.\n')
    user_tone_select = str(input('숫자입력: '))
    if user_tone_select == "0":
        user_tone = int(0)
    elif user_tone_select == "1":
        user_tone = int(1)
    elif user_tone_select == "2":
        user_tone = int(2)
    elif user_tone_select == "3":
        user_tone = int(3)
    else:
        print('> 올바른 입력이 아닙니다. 처음으로 돌아갑니다.\n\n\n')
        time.sleep(0.5)
        continue
    
    print('\n\n\n요약된 문장의 수를 설정하세요 >')
    print('몇 문장으로 요약하고 싶나요? 아래에 숫자를 입력하세요.\nex) 3 입력시 3문장으로 요약됩니다.\n')
    user_summary_count = int(input('숫자입력: '))
    if user_summary_count <= 0:
        print('> 요약 문장 수가 너무 적습니다. 처음으로 돌아갑니다.\n\n\n')
        time.sleep(0.5)
        continue
    
    data = {
        "document": {
            "content": user_sentence
        },
        "option": {
        "language": "ko",
        "model": user_model,
        "tone": user_tone,
        "summaryCount": user_summary_count
        }
    }
    
    if internetCheck() == False:
        print('\n\n\n\n> 기능 서버와 연결하기 위해 인터넷 연결이 필요해요. 연결이 되면 작업을 진행할게요. 기다리고 있을게요!')
        while True:
            if internetCheck() == True:
                break;
            time.sleep(1)
    
    print('\n\n\n\n>> 작업 중입니다...', end='', flush=True)
    res = requests.post(url, data=json.dumps(data), headers=headers)
    if(res.status_code == 200):
        res_sentence = res.text[11:]
        res_sentence = res_sentence.replace('\\n', ' ')
        res_sentence = res_sentence.replace('\\', '')
        res_sentence = res_sentence.replace('}', '')
        
        print(' 완료되었습니다!\n\n\n★ 요약된 문장 ★\n')
        print(res_sentence)
        print('\n\n\n')
    else:
        print("\n\n\n> 어머, 오류가 발생했어요! 한글 문장 입력한 것 맞죠? 먼저 문장 길이를 더 줄여보세요. 그래도 안된다면 인터넷 연결 오류거나, 기능 서버가 작업을 많이 해 지쳐서 그럴거에요.\n일단 처음으로 돌아갈게요!\n\n\n")
        time.sleep(0.5)
        continue

client_id = "client_id"
client_secret = "client_secret"
부분은 본인의 것을 집어넣도록 하자. 여기에서 볼 수 있다.

요청에 필요한 Object가 뭐가 있는지 볼려면, 아래 사이트를 참조하자.
https://api.ncloud-docs.com/docs/ai-naver-clovasummary
https://api.ncloud-docs.com/docs/ai-naver-clovasummary-api


도움이 되었는가? 그렇다면 하트를 눌러달라.

그럼 다음에도 유용한 정보로 찾아오겠다. 안녕!

profile
< Beginners Heart >

0개의 댓글