Añadir un resumidor de texto a Google Docs mediante la API de resumen de texto de NLP Cloud

Article by Rafał Rybnik, Jefe de Desarrollo de Software en Instytut Badań Pollster

Tanto si eres escritor, científico de datos o simplemente hojeas las fuentes para hacer un trabajo, leer leer textos largos para sacar migajas de información puede ser bastante agotador. La automatización de estos elementos de de su trabajo le permite centrarse en el lado creativo de las cosas.

Resumir el texto
A menos que se indique lo contrario, todas las fotos del artículo son del autor.

Resumir el texto

El resumen de textos es la técnica de extracción de los elementos informativos clave de un texto voluminoso. Manualmente manual es una tarea difícil y que requiere mucho tiempo, por lo que el NLP y los algoritmos de aprendizaje automático se para automatizarla.

En el mercado hay soluciones ya preparadas, ya sea en forma de bibliotecas o de herramientas preparadas para los usuarios finales.

En este artículo, prepararemos nuestra propia solución a medida, que al mismo tiempo no requiere conocimientos avanzados de ciencia de datos.

NLP Cloud

NLP Cloud es un proveedor de múltiples API para el procesamiento de textos mediante modelos de aprendizaje automático. Una de ellas es el resumidor de texto, que parece prometedor en términos de implementación sencilla.

El resumidor proporcionado por NLP Cloud es abstractivo, lo que significa que pueden generarse nuevas frases y que se eliminan las partes con baja relación información-ruido.

Veamos un ejemplo:

API de resumen de texto

Pasamos un bloque de texto y el modelo devuelve un resumen. Pero operar en una consola no es muy conveniente. Así que hagamos que Google Docs resuma el fragmento de texto seleccionado de esta manera.

Ampliación de Google Docs

Nuestro objetivo es crear un menú cómodo para que el resumen de texto se realice automáticamente desde Google Docs.

Estructura del Proyecto de Script de Apps

Así es como está estructurado nuestro proyecto. Usando Apps Script, extenderemos la GUI con un botón que activará funciones que se comunican con la API de NLP Cloud y luego insertaremos el resultado a continuación.

Empezaremos preparando un complemento para el menú.

Menú de elaboración

Utilizar los scripts de Google Apps para añadir funcionalidades personalizadas a Google Docs es bastante sencillo. Puedes personalizar la interfaz de usuario con nuevos menús, cuadros de diálogo y barras laterales. Para crear un script, tras abrir Google Docs, selecciona Herramientas -> Editor de scripts.

Todos los elementos de la interfaz deben añadirse en esta función: onOpen. Se ejecuta después de abrir el documento y nos permite añadir el menú.

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

Después de guardar el script y actualizar Docs, debería encontrar el nuevo elemento del menú "Text Summarizer".

Menú de Google Docs

Debemos obtener el texto seleccionado y luego implementar la siguiente función: summarizeSelection.

Obtenga una selección

La parte complicada es obtener el texto seleccionado actualmente y pasarlo a las funciones. Es posible gracias a esta función: 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 función simplemente toma el párrafo completo y lo recorta hasta el fragmento seleccionado. También devuelve el índice del párrafo para que sepas dónde insertar el resumen.

Ahora, enviemos el texto a la API y analicemos el resultado.

APIs externas

Utilizaremos el siguiente servicio para hacer peticiones a la API directamente: UrlFetch. La solicitud de la API de resumen de texto requiere autorización a través de un token. Para conseguirlo, regístrate en nlpcloud.com (el plan gratuito te servirá).

La API solicitada devuelve una respuesta JSON sin procesar para una solicitud.

Recuerde que todo el texto procesado por este script se envía a la API externa.

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

}

Para probar la funcionalidad, simplemente seleccione un fragmento de texto en Docs y elija Resumir texto -> Resumir selección en el menú Docs.

Después de un momento de procesamiento, deberías ver una ventana emergente con el resultado, que incluso puedes copiar.

Generación de resúmenes de texto

Respuesta escrita al documento

Por último, podemos insertar un resumen generado por la API directamente en el documento. Para facilitar la distinción, ponga en negrita el texto del resumen. Por eso, la siguiente función también devuelve el índice del párrafo del texto seleccionado: getSelectedText.

De este modo, sabremos exactamente dónde decirle a Apps Script que inserte el nuevo texto.

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

Probemos la versión final:

Para llevar

Construir una aplicación que amplíe la funcionalidad de Google Docs basándose en APIs externas es una alternativa interesante a la construcción de grandes sistemas para automatizar pasos de trabajo incómodos. Además, los componentes individuales pueden sustituirse en función de las necesidades y de las competencias específicas. Por ejemplo, nuestra solución puede ampliarse con la detección de emociones o la clasificación de textos (también disponible en NLP Cloud). También puede preparar su propia API o funciones simples directamente en Apps Script.

Avión de papel

Gracias por leer. Espero que hayas disfrutado de la lectura tanto como yo he disfrutado escribiendo esto para ti.