Lägg till en sammanfattare i Google Docs med hjälp av Natural Language Processing Clouds API för sammanfattning av text.

Article by Rafał Rybnik, Chef för mjukvaruutveckling på Instytut Badań Pollster

Oavsett om du är författare, datavetare eller bara skummar igenom källor för att få ett jobb gjort, är det viktigt att läsa längre texter för att plocka ut smulor av information kan vara ganska ansträngande. Att automatisera sådana delar av ditt arbete gör att du kan fokusera på den kreativa sidan av saker och ting.

Sammanfattning av text
Om inget annat anges är alla bilder i artikeln tagna av författaren.

Sammanfattning av text

Sammanfattning av text är en teknik för att extrahera viktiga informationselement ur en omfattande text. Manuell är en svår och tidskrävande uppgift, så algoritmer för bearbetning av naturligt språk och maskininlärning har blivit populära för att automatisera den.

Det finns färdiga lösningar på marknaden, antingen i form av bibliotek eller färdiga verktyg för slutanvändare.

I den här artikeln förbereder vi vår egen skräddarsydda lösning, som samtidigt inte kräver avancerade kunskaper i datavetenskap.

NLP Cloud

NLP Cloud är en leverantör av flera API:er för textbehandling med hjälp av modeller för maskininlärning. En av dessa är textresumén, som ser lovande ut när det gäller enkel implementering.

Den sammanfattare som tillhandahålls av NLP Cloud är abstrakt, vilket innebär att nya meningar kan skapas och att delar med lågt förhållande mellan information och brus tas bort.

Låt oss se ett exempel:

API för sammanfattning av text

Vi skickar ett textblock och modellen returnerar en sammanfattning. Men det är inte särskilt bekvämt att arbeta i en konsol. Så låt oss få Google Docs att sammanfatta det valda textfragmentet på det här sättet.

Utöka Google Dokument

Vårt mål är att skapa en bekväm meny så att textresuméer kan göras automatiskt från Google Dokument.

Projektstruktur för Apps Script

Så här är vårt projekt uppbyggt. Med Apps Script kommer vi att utöka GUI med en knapp som aktiverar funktioner som kommunicerar med NLP Cloud API och sedan infogar resultatet nedan.

Vi börjar med att förbereda ett tillägg till menyn.

Gör en meny

Det är ganska enkelt att använda Google Apps Scripts för att lägga till anpassade funktioner i Google Dokument. Du kan anpassa användargränssnittet med nya menyer, dialogrutor och sidofält. Om du vill skapa ett skript väljer du Verktyg -> Skriptredigerare efter att du öppnat Google Docs.

Alla gränssnittselement ska läggas till i denna funktion: onOpen. Den körs efter att dokumentet har öppnats och gör det möjligt att lägga till menyn.

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

När du har sparat skriptet och uppdaterat Docs bör du hitta ett nytt menyalement "Text Summarizer".

Google Docs-menyn

Vi måste hämta den markerade texten och sedan implementera följande funktion: summarizeSelection.

Få ett urval

Det svåra är att få fram den markerade texten och skicka den till funktioner. Det är möjligt tack vare den här funktionen: 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];
}

Funktionen tar helt enkelt hela stycket och skär ner det till bara det valda fragmentet. Den returnerar också indexet för stycket så att du vet var du ska infoga sammanfattningen.

Nu skickar vi texten till API:et och analyserar resultatet.

Externa API:er

Vi använder följande tjänst för att göra API-förfrågningar direkt: UrlFetch. API-förfrågan för textresuméer kräver auktorisering genom token. För att få den, registrera dig på nlpcloud.com (den kostnadsfria planen räcker bra).

API:et som begärs returnerar ett rått JSON-svar för en begäran.

Kom ihåg att all text som behandlas av detta skript skickas till ett externt 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!');
    }

}

För att testa funktionaliteten kan du bara välja ett textfragment i Docs och välja Text Summarization -> Summarize selection från Docs-menyn.

Efter en stund av bearbetning bör du se en popup-fönsterruta med resultatet, som du även kan kopiera.

Generering av en sammanfattning av texten

Skriva ett svar på ett dokument

Slutligen kan vi infoga en API-genererad sammanfattning direkt i dokumentet. För att det ska bli lättare att skilja på dem, är texten i sammanfattningen fetstilad. Därför returnerar följande funktion även paragrafindexet för den markerade texten: getSelectedText.

På så sätt vet vi exakt var Apps Script ska infoga den nya texten.

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

Låt oss testa den slutliga versionen:

Ta med dig

Att bygga en applikation som utökar Google Docs funktionalitet baserat på externa API:er är ett intressant alternativ till att bygga stora system för att automatisera obekväma arbetsmoment. Dessutom kan enskilda komponenter bytas ut, beroende på behov och specifik kompetens. Vår lösning kan till exempel utökas med känslodetektering eller textklassificering (finns även i NLP Cloud). Du kan också förbereda ditt eget API eller enkla funktioner direkt i Apps Script.

Pappersplan

Tack för att du läste. Jag hoppas att du tyckte om att läsa lika mycket som jag tyckte om att skriva det här för dig.