Szövegösszefoglaló hozzáadása a Google Dokumentumokhoz a Natural Language Processing Cloud szövegösszefoglaló API segítségével

Article by Rafał Rybnik, Szoftverfejlesztési vezető a Instytut Badań Pollster

Akár író, akár adattudós, akár csak átfutja a forrásokat, hogy elvégezze a munkáját, az olvasás hosszabb szövegek elolvasása az információmorzsák kiszedése érdekében igen kimerítő lehet. Az ilyen elemek automatizálása lehetővé teszi, hogy a dolgok kreatív oldalára koncentrálhasson.

Szöveges összegzés
Hacsak másképp nem szerepel, a cikkben szereplő összes képet a szerző készítette.

Szöveges összegzés

A szövegösszefoglalás egy terjedelmes szöveg kulcsfontosságú információs elemeinek kinyerésének technikája. Kézi szöveges összegzés nehéz és időigényes feladat, ezért a természetes nyelvfeldolgozás és a gépi tanulási algoritmusok váltak népszerűvé váltak az automatizálás érdekében.

Vannak kész megoldások a piacon, akár könyvtárak, akár a végfelhasználók számára készült eszközök formájában.

Ebben a cikkben elkészítjük a saját testre szabott megoldásunkat, amely ugyanakkor nem igényel fejlett adattudományi ismereteket.

NLP Cloud

Az NLP Cloud több API-t kínál a gépi tanulási modellekkel történő szövegfeldolgozáshoz. Ezek egyike a szövegösszefoglaló, amely az egyszerű megvalósítás szempontjából ígéretesnek tűnik.

Az NLP Cloud által biztosított összegző absztraktív, ami azt jelenti, hogy új mondatokat generálhat, és az alacsony információ-zaj arányú részeket eltávolítja.

Lássunk egy példát:

Szövegösszefoglaló API

Átadunk egy szövegrészletet, és a modell visszaad egy összefoglalót. A konzolon való működés azonban nem túl kényelmes. Így hát érjük el, hogy a Google Docs így foglalja össze a kiválasztott szövegrészletet.

A Google Dokumentumok bővítése

Célunk egy kényelmes menü létrehozása, hogy a szöveges összefoglaló automatikusan megtörténjen a Google Dokumentumokból.

Apps Script projektstruktúra

A projektünk így épül fel. Az Apps Script segítségével kibővítjük a felhasználói felületet egy gombbal, amely az NLP Cloud API-val kommunikáló funkciókat indít, majd beillesztjük az alábbi eredményt.

A menü kiegészítésének elkészítésével kezdjük.

Menü készítése

A Google Apps Scripts használatával a Google Dokumentumok egyéni funkciókkal való bővítése meglehetősen egyszerű. A felhasználói felületet új menükkel, párbeszédpanelekkel és oldalsávokkal testre szabhatja. Szkript létrehozásához a Google Dokumentumok megnyitása után válassza az Eszközök -> Szkriptszerkesztő menüpontot.

Az összes interfészelemet ebben a funkcióban kell hozzáadni: onOpen. A dokumentum megnyitása után fut le, és lehetővé teszi számunkra a menü hozzáadását.

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

A szkript mentése és a Dokumentumok frissítése után új menüelemet kell találnia "Szövegösszefoglaló".

Google Dokumentumok menü

Meg kell szereznünk a kiválasztott szöveget, majd a következő függvényt kell végrehajtanunk: summarizeSelection.

Válogatás beszerzése

A trükkös rész az aktuálisan kiválasztott szöveg megszerzése és átadása a függvényeknek. Ez lehetséges ennek a függvénynek köszönhetően: 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];
}

A funkció egyszerűen a teljes bekezdést veszi, és a kiválasztott részre vágja le. Visszaadja a bekezdés indexét is, hogy tudja, hova kell beilleszteni az összefoglalót.

Most küldjük el a szöveget az API-nak, és elemezzük az eredményt.

Külső API-k

A következő szolgáltatást fogjuk használni az API-kérések közvetlen elvégzéséhez: UrlFetch. A Szövegösszefoglaló API-kérelemhez tokenen keresztül történő engedélyezés szükséges. Ahhoz, hogy megkapd, regisztrálj az nlpcloud.com oldalon (az ingyenes csomag is megteszi).

A kért API nyers JSON-választ ad vissza egy kérésre.

Ne feledje, hogy a szkript által feldolgozott összes szöveget külső API-nak küldi.

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!');
    }

}

A funkció teszteléséhez csak jelölje ki a szövegrészletet a Dokumentumokban, és válassza a Dokumentumok menüből a Szövegösszegzés -> Kiválasztás összegzése parancsot.

Egy pillanatnyi feldolgozás után egy felugró ablakban megjelenik az eredmény, amelyet akár ki is másolhat.

Szöveges összefoglaló generálása

Válasz írása a dokumentumra

Végül pedig közvetlenül a dokumentumba illeszthetünk egy API által generált összefoglalót. A könnyebb megkülönböztetés érdekében vastag betűvel szedjük ki az összefoglaló szövegét. Ezért a következő függvény a kiválasztott szöveg bekezdésindexét is visszaadja: getSelectedText.

Így pontosan tudjuk, hogy az Apps Scriptnek hova kell beillesztenie az új szöveget.

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!');
    }
    
}

Teszteljük a végleges változatot:

Takeaways

A Google Dokumentumok funkcióit külső API-kra alapozva kibővítő alkalmazás létrehozása érdekes alternatívája a kényelmetlen munkafolyamatok automatizálására szolgáló nagy rendszerek építésének. Ráadásul az egyes komponensek az igényektől és a speciális készségektől függően helyettesíthetők. Megoldásunk például kibővíthető érzelemérzékeléssel vagy szövegosztályozással (az NLP Cloudban is elérhető). Saját API-t vagy egyszerű függvényeket is készíthet közvetlenül az Apps Scriptben.

Papír repülőgép

Köszönjük, hogy elolvasta. Remélem, legalább annyira élveztétek az olvasást, mint amennyire én élveztem, hogy ezt megírtam nektek.