Aggiungere un riassumitore di testo a Google Docs usando l'API di sintesi del testo di Natural Language Processing Cloud

Article by Rafał Rybnik, Capo dello sviluppo del software presso Istituto Badań Pollster

Che tu sia uno scrittore, uno scienziato di dati o che tu stia semplicemente scremando le fonti per portare a termine un lavoro, leggere testi più lunghi per strappare briciole di informazioni può essere piuttosto estenuante. Automatizzare questi elementi del del tuo lavoro ti permette di concentrarti sul lato creativo delle cose.

Riassunto del testo
Salvo indicazione contraria, tutte le foto dell'articolo sono dell'autore.

Riassunto del testo

Il riassunto del testo è la tecnica di estrazione degli elementi informativi chiave di un testo voluminoso. Manuale manuale è un compito difficile e dispendioso in termini di tempo, quindi l'elaborazione del linguaggio naturale e gli algoritmi di apprendimento automatico sono diventati popolari per automatizzarlo.

Ci sono soluzioni pronte sul mercato, sia sotto forma di librerie che di strumenti pronti per gli utenti finali.

In questo articolo, prepareremo la nostra soluzione su misura, che allo stesso tempo non richiede conoscenze avanzate di scienza dei dati.

NLP Cloud

NLP Cloud è un fornitore di molteplici API per l'elaborazione del testo utilizzando modelli di apprendimento automatico. Uno di questi è il riassumitore di testo, che sembra promettente in termini di semplice implementazione.

Il riassumitore fornito da NLP Cloud è astrattivo, il che significa che nuove frasi potrebbero essere generate e le parti con un basso rapporto informazione-rumore vengono rimosse.

Vediamo un esempio:

API di sintesi del testo

Passiamo un blocco di testo e il modello restituisce un riassunto. Ma operare in una console non è molto comodo. Quindi, facciamo in modo che Google Docs riassuma il frammento di testo selezionato in questo modo.

Estendere Google Docs

Il nostro obiettivo è quello di creare un menu conveniente in modo che il riassunto del testo avvenga automaticamente dall'interno di Google Docs.

Struttura del progetto Apps Script

Ecco come è strutturato il nostro progetto. Utilizzando Apps Script, estenderemo la GUI con un pulsante che attiverà funzioni che comunicano con l'API NLP Cloud e poi inseriranno il risultato qui sotto.

Inizieremo preparando un'aggiunta al menu.

Fare il menu

Usare Google Apps Scripts per aggiungere funzionalità personalizzate a Google Docs è abbastanza facile. È possibile personalizzare l'interfaccia utente con nuovi menu, finestre di dialogo e barre laterali. Per creare uno script, dopo aver aperto Google Docs, selezionare Tools -> Script editor.

Tutti gli elementi dell'interfaccia devono essere aggiunti in questa funzione: onOpen. Viene eseguito dopo l'apertura del documento e ci permette di aggiungere il menu.

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

Dopo aver salvato lo script e rinfrescato Docs, dovreste trovare un nuovo elemento del menu "Text Summarizer".

Menu Google Docs

Dobbiamo ottenere il testo selezionato e poi implementare la seguente funzione: summarizeSelection.

Ottenere la selezione

La parte difficile è ottenere il testo attualmente selezionato e passarlo alle funzioni. È possibile grazie a questa funzione: 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];
}

La funzione prende semplicemente l'intero paragrafo e lo riduce al solo frammento selezionato. Restituisce anche l'indice del paragrafo in modo da sapere dove inserire il riassunto.

Ora, inviamo il testo all'API e analizziamo il risultato.

API esterne

Useremo il seguente servizio per fare richieste API direttamente: UrlFetch. La richiesta di Text Summarization API richiede un'autorizzazione tramite token. Per ottenerlo, iscriviti a nlpcloud.com (il piano gratuito andrà bene).

L'API richiesta restituisce una risposta JSON grezza per una richiesta.

Ricordate che tutto il testo elaborato da questo script viene inviato all'API esterna.

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

}

Per testare la funzionalità, basta selezionare un frammento di testo in Docs e scegliere Text Summarization -> Summarize selection dal menu Docs.

Dopo un attimo di elaborazione, dovreste vedere un pop-up con il risultato, che potete anche copiare.

Generazione di un riassunto del testo

Risposta scritta al documento

Infine, possiamo inserire un riassunto generato dall'API direttamente nel documento. Per facilitare la distinzione, mettiamo in grassetto il testo del riassunto. Ecco perché la seguente funzione restituisce anche l'indice del paragrafo del testo selezionato: getSelectedText.

In questo modo sappiamo esattamente dove dire a Apps Script di inserire il nuovo testo.

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

Testiamo la versione finale:

Takeaways

Costruire un'applicazione che estende le funzionalità di Google Docs sulla base di API esterne è un'alternativa interessante alla costruzione di grandi sistemi per automatizzare scomode fasi di lavoro. Inoltre, i singoli componenti possono essere sostituiti, a seconda delle esigenze e delle competenze specifiche. Per esempio, la nostra soluzione può essere estesa con il rilevamento delle emozioni o la classificazione del testo (disponibile anche in NLP Cloud). È anche possibile preparare le proprie API o semplici funzioni direttamente in Apps Script.

Piano di carta

Grazie per aver letto. Spero che vi sia piaciuto leggere tanto quanto a me è piaciuto scrivere questo per voi.