Worstel je met AI of full-stack ontwikkeling? Onze experts staan klaar om je te begeleiden: advies op maat, technische integratie en meer. Neem contact op met [email protected].

Voeg een tekstsamenvatter toe aan Google Docs met behulp van Natural Language Processing Cloud's Text Summarization API

Article by Rafał Rybnik, Hoofd software ontwikkeling bij Instytut Badań Pollster

Of je nu schrijver bent, datawetenschapper of gewoon bronnen doorbladert om je werk af te krijgen, het lezen van lange teksten om er kruimels informatie uit te pikken kan behoorlijk vermoeiend zijn. Het automatiseren van dergelijke elementen van van uw werk kunt u zich richten op de creatieve kant van de zaak.

Samenvatten van tekst
Tenzij anders vermeld, zijn alle foto's in het artikel van de auteur.

Samenvatten van tekst

Tekstsamenvatting is de techniek waarbij de belangrijkste informatieve elementen uit een omvangrijke tekst worden gehaald. Manueel samenvatten van tekst is een moeilijke en tijdrovende taak, dus Natural Language Processing en machine learning algoritmen werden populair om het te automatiseren.

Er zijn kant-en-klare oplossingen op de markt, hetzij in de vorm van bibliotheken, hetzij in de vorm van kant-en-klare instrumenten voor eindgebruikers.

In dit artikel zullen we onze eigen op maat gemaakte oplossing voorbereiden, die tegelijkertijd geen geavanceerde kennis van data science vereist.

NLP Cloud

NLP Cloud is een aanbieder van meerdere API's voor tekstverwerking met behulp van modellen voor machinaal leren. Een daarvan is de text summarizer, die er veelbelovend uitziet in termen van eenvoudige implementatie.

De samenvatter die door NLP Cloud wordt geleverd is abstract, wat betekent dat nieuwe zinnen kunnen worden gegenereerd en delen met een lage informatie-ruisverhouding worden verwijderd.

Laten we een voorbeeld bekijken:

Tekst Samenvatten API

We geven een blok tekst door, en het model geeft een samenvatting. Maar werken in een console is niet erg handig. Dus laten we Google Docs het geselecteerde tekstfragment op deze manier samenvatten.

Google Documenten uitbreiden

Ons doel is om een handig menu te maken zodat het samenvatten van tekst automatisch gebeurt vanuit Google Docs.

Apps Script Project Structuur

Dit is hoe ons project is opgebouwd. Met behulp van Apps Script, zullen we de GUI uitbreiden met een knop die functies zal triggeren die communiceren met de NLP Cloud API en vervolgens het onderstaande resultaat invoegen.

We zullen beginnen met een toevoeging voor het menu.

Menu maken

Het gebruik van Google Apps Scripts om aangepaste functionaliteiten aan Google Documenten toe te voegen is vrij eenvoudig. U kunt de gebruikersinterface aanpassen met nieuwe menu's, dialoogvensters en zijbalken. Om een script te maken, selecteert u na het openen van Google Documenten Tools -> Script editor.

Alle interface-elementen moeten in deze functie worden toegevoegd: onOpen. Het wordt uitgevoerd na het openen van het document en stelt ons in staat het menu toe te voegen.

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

Na het opslaan van het script en het vernieuwen van Docs, zou u een nieuw menu-element "Text Summarizer" moeten vinden.

Google Docs Menu

We moeten de geselecteerde tekst krijgen en dan de volgende functie implementeren: summarizeSelection.

Selectie krijgen

Het lastige deel is het verkrijgen van de huidige geselecteerde tekst en het doorgeven daarvan aan functies. Dat is mogelijk dankzij deze functie: 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];
}

De functie neemt gewoon de hele paragraaf en kort hem in tot alleen het geselecteerde fragment. Ze geeft ook de index van de alinea terug, zodat je weet waar je de samenvatting moet invoegen.

Laten we nu de tekst naar de API sturen en het resultaat analyseren.

Externe API's

We zullen de volgende service gebruiken om rechtstreeks API verzoeken te doen: UrlFetch. Tekstsamenvatting API verzoek vereist autorisatie via token. Om het te krijgen, meld je aan bij nlpcloud.com (het gratis plan is prima).

De API die wordt opgevraagd geeft een onbewerkt JSON antwoord op een verzoek.

Onthoud dat alle tekst die door dit script wordt verwerkt, naar een externe API wordt gestuurd.

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

}

Om de functionaliteit te testen, selecteert u een tekstfragment in Documenten en kiest u Tekstsamenvatting -> Selectie samenvatten uit het menu Documenten.

Na een ogenblik van verwerking, zou u een pop-up moeten zien met het resultaat, dat u zelfs kunt kopiëren.

Genereren van tekstsamenvatting

Schrijven van antwoord op document

Tenslotte kunnen we een API-gegenereerde samenvatting direct in het document invoegen. Om het onderscheid te vergemakkelijken, moet de tekst van de samenvatting vet worden gemaakt. Daarom geeft de volgende functie ook de paragraaf index van de geselecteerde tekst terug: getSelectedText.

Op deze manier weten we precies waar we Apps Script moeten vertellen de nieuwe tekst in te voegen.

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

Laten we de definitieve versie testen:

Takeaways

Het bouwen van een toepassing die de functionaliteit van Google Docs uitbreidt op basis van externe API's is een interessant alternatief voor het bouwen van grote systemen om lastige werkstappen te automatiseren. Bovendien kunnen individuele componenten worden vervangen, afhankelijk van de behoeften en specifieke vaardigheden. Onze oplossing kan bijvoorbeeld worden uitgebreid met emotiedetectie of tekstclassificatie (ook beschikbaar in NLP Cloud). U kunt ook uw eigen API of eenvoudige functies direct in Apps Script voorbereiden.

Papieren vliegtuig

Dank u voor het lezen. Ik hoop dat u het net zo leuk vond om te lezen als ik het vond om dit voor u te schrijven.