AI 또는 풀스택 개발에 어려움을 겪고 계신가요? 맞춤형 조언, 기술 통합 등 유니티 전문가가 도와드리겠습니다. 다음 연락처로 문의하세요. [email protected].

자연어 처리 클라우드의 텍스트 요약 API를 사용하여 Google 문서 도구에 텍스트 요약기를 추가하세요.

Article by Rafał Rybnik, 소프트웨어 개발 책임자 인스티튜트 바다 여론조사 기관

작가든, 데이터 과학자이든, 업무를 완수하기 위해 자료를 훑어보는 사람이든, 긴 텍스트를 읽고 긴 텍스트를 읽으며 정보의 부스러기를 골라내는 일은 상당히 피곤할 수 있습니다. 이러한 작업 요소를 자동화하면 작업의 이러한 요소를 자동화하면 창의적인 측면에 집중할 수 있습니다.

텍스트 요약
달리 명시되지 않는 한, 기사의 모든 사진은 저자가 직접 촬영한 것입니다.

텍스트 요약

텍스트 요약은 방대한 텍스트에서 핵심 정보 요소를 추출하는 기술입니다. 수동 텍스트 요약은 어렵고 시간이 많이 걸리는 작업이기 때문에 자연어 처리와 머신 러닝 알고리즘이 자동화하는 데 널리 사용되고 있습니다.

시중에는 라이브러리 형태로든 최종 사용자를 위한 기성 도구 형태로든 기성 솔루션이 나와 있습니다.

이 기사에서는 데이터 과학에 대한 고급 지식이 필요하지 않은 자체 맞춤형 솔루션을 준비합니다.

NLP Cloud

NLP Cloud는 머신 러닝 모델을 사용하여 텍스트 처리를 위한 여러 API를 제공하는 서비스입니다. 이 중 하나는 텍스트 요약기로, 간단한 구현 측면에서 유망해 보입니다.

NLP Cloud에서 제공하는 요약기는 추상적이기 때문에 새로운 문장이 생성될 수 있으며 정보 잡음비가 낮은 부분은 제거될 수 있습니다.

예를 들어 보겠습니다:

텍스트 요약 API

텍스트 블록을 전달하면 모델이 요약을 반환합니다. 하지만 콘솔에서 작업하는 것은 그리 편리하지 않습니다. 따라서 Google 문서 도구에서 선택한 텍스트 조각을 이런 식으로 요약하도록 만들어 보겠습니다.

Google 문서 도구 확장

저희의 목표는 Google 문서도구 내에서 텍스트 요약이 자동으로 이루어지도록 편리한 메뉴를 만드는 것입니다.

앱 스크립트 프로젝트 구조

이것이 우리 프로젝트의 구조입니다. 앱 스크립트를 사용하여 NLP 클라우드 API와 통신하는 함수를 트리거하는 버튼으로 GUI를 확장한 다음 아래에 결과를 삽입합니다.

메뉴용 애드온을 준비하는 것부터 시작하겠습니다.

메뉴 만들기

Google 앱스 스크립트를 사용하여 Google 문서 도구에 사용자 지정 기능을 추가하는 것은 매우 쉽습니다. 새로운 메뉴, 대화상자, 사이드바로 사용자 인터페이스를 맞춤 설정할 수 있습니다. 스크립트를 만들려면 Google 문서를 연 후 도구 -> 스크립트 편집기를 선택합니다.

이 함수에는 모든 인터페이스 요소가 추가되어야 합니다: onOpen. 문서를 연 후 실행되며 메뉴를 추가할 수 있습니다.

function onOpen() {
    var ui = DocumentApp.getUi();
    
    ui.createMenu('Text Summarizer')
        .addItem('Summarize selection', 'summarizeSelection')
        .addToUi();
    }
    
    function summarizeSelection() {
    // summarization function
}

스크립트를 저장하고 문서를 새로 고치면 새 메뉴 요소인 '텍스트 요약기'를 찾을 수 있습니다.

Google 문서 도구 메뉴

선택한 텍스트를 가져온 다음 다음 함수를 구현해야 합니다: summarizeSelection.

선택 받기

까다로운 부분은 현재 선택된 텍스트를 가져와 함수에 전달하는 것입니다. 이 함수 덕분에 가능합니다: getSelection.

DocumentApp.getActiveDocument().getSelection();

However, this function returns not only highlighted part of the documents, but a whole paragraph in which selections resides. That’s why we create more complex getSelectedText function:

function getSelectedText() {
var document = DocumentApp.getActiveDocument();
var body = document.getBody();
var text = "";

var selection = document.getSelection();
var parent = false;
var insertPoint 

if (selection) {
    var elements = selection.getRangeElements();

    if(elements[0].isPartial()) {
    text = elements[0].getElement().asText().getText();
    text = text.substring(elements[0].getStartOffset(),elements[0].getEndOffsetInclusive()+1)
        parent = elements[0].getElement().getParent();
    } else {
    text = elements.map( function(element) {
        parent = element.getElement().getParent();
        return element.getElement().asText().getText(); 
    });
    }
    // Logger.log(text);
    if (parent) {
    insertPoint = body.getChildIndex(parent);
    }
}
return [text, insertPoint];
}

이 함수는 전체 단락을 가져와서 선택한 부분만 잘라냅니다. 또한 단락의 색인도 반환하므로 요약을 삽입할 위치를 알 수 있습니다.

이제 API로 텍스트를 전송하고 결과를 구문 분석해 보겠습니다.

외부 API

다음 서비스를 사용하여 API를 직접 요청할 수 있습니다: UrlFetch. 텍스트 요약 API를 요청하려면 토큰을 통한 인증이 필요합니다. 토큰을 받으려면 nlpcloud.com에서 가입하세요(무료 요금제로도 충분합니다).

요청되는 API는 요청에 대한 원시 JSON 응답을 반환합니다.

이 스크립트에서 처리되는 모든 텍스트는 외부 API로 전송된다는 점을 기억하세요.

function summarizeSelection() {
    var document = DocumentApp.getActiveDocument();
    var selectedText = getSelectedText();
    var text = selectedText[0];
    var insertPoint = selectedText[1];

    if (text) {
        DocumentApp.getUi().alert(text);
        var url = 'https://api.nlpcloud.io/v1/bart-large-cnn/summarization';

        var response = UrlFetchApp.fetch(
        url, 
        {
            'method': 'POST',
            'contentType': 'application/json',
            'headers':{
            'Authorization': 'Token c714fb961e7f6ef1336ab7f501f4d842f2dc2380'
            },
            'payload': JSON.stringify({"text":text}),
            'muteHttpExceptions': true
        }
        );

        try {
        summary_text = JSON.parse(response.getContentText())['summary_text'];
        DocumentApp.getUi().alert(summary_text);

        } catch (e) {
        DocumentApp.getUi().alert('Something went wrong 🙁');
        }

    } else {
        DocumentApp.getUi().alert('You must select some text!');
    }

}

기능을 테스트하려면 문서에서 텍스트 조각을 선택하고 문서 메뉴에서 텍스트 요약 -> 선택 항목 요약하기를 선택하면 됩니다.

잠시 후 처리 결과가 포함된 팝업이 표시되며 복사할 수도 있습니다.

텍스트 요약 생성

문서에 대한 응답 작성

마지막으로 API로 생성된 요약을 문서에 직접 삽입할 수 있습니다. 쉽게 구분할 수 있도록 요약의 텍스트를 굵게 표시합니다. 다음 함수가 선택한 텍스트의 단락 색인도 반환하는 이유도 바로 이 때문입니다: getSelectedText.

이렇게 하면 앱 스크립트에 새 텍스트를 삽입하도록 지시할 위치를 정확히 알 수 있습니다.

function summarizeSelection() {
    var document = DocumentApp.getActiveDocument();
    var selectedText = getSelectedText();
    var text = selectedText[0];
    var insertPoint = selectedText[1];
    
    if (text) {
        DocumentApp.getUi().alert(text);
        var url = 'https://api.nlpcloud.io/v1/bart-large-cnn/summarization';
    
        var response = UrlFetchApp.fetch(
        url, 
        {
            'method': 'POST',
            'contentType': 'application/json',
            'headers':{
            'Authorization': 'Token c714fb961e7f6ef1336ab7f501f4d842f2dc2380'
            },
            'payload': JSON.stringify({"text":text}),
            'muteHttpExceptions': true
        }
        );
    
        try {
        summary_text = JSON.parse(response.getContentText())['summary_text'];
        DocumentApp.getUi().alert(summary_text);
    
        } catch (e) {
        DocumentApp.getUi().alert('Something went wrong 🙁');
        }
        //////////////
        var body = document.getBody();
        var summaryParagraph = body.insertParagraph(insertPoint+1, summary_text);
        summaryParagraph.setBold(true);
        //////////////
    } else {
        DocumentApp.getUi().alert('You must select some text!');
    }
    
}

최종 버전을 테스트해 보겠습니다:

테이크아웃

외부 API를 기반으로 Google 문서도구 기능을 확장하는 애플리케이션을 구축하는 것은 불편한 작업 단계를 자동화하기 위해 대규모 시스템을 구축하는 대신 흥미로운 대안이 될 수 있습니다. 또한 필요와 특정 기술에 따라 개별 구성 요소를 교체할 수 있습니다. 예를 들어, 감정 감지 또는 텍스트 분류(NLP 클라우드에서도 사용 가능)로 솔루션을 확장할 수 있습니다. 또한 앱 스크립트에서 직접 자체 API 또는 간단한 기능을 준비할 수도 있습니다.

종이 비행기

읽어주셔서 감사합니다. 제가 이 글을 쓰면서 즐거웠던 만큼 여러분도 즐겁게 읽으셨기를 바랍니다.