Article by Rafał Rybnik, Șef de dezvoltare software la Instytut Badań Pollster
Fie că sunteți scriitor, cercetător de date sau doar parcurgeți sursele pentru a face o treabă, cititul texte mai lungi pentru a smulge firimituri de informații poate fi destul de obositoare. Automatizarea unor astfel de elemente de munca dvs. vă permite să vă concentrați pe partea creativă a lucrurilor.

Cu excepția cazului în care se specifică altfel, toate fotografiile din articol sunt ale autorului.
Rezumatul textului este tehnica de extragere a elementelor informaționale cheie dintr-un text voluminos. Manual rezumarea manuală a textului este o sarcină dificilă și costisitoare în timp, astfel încât algoritmii de procesare a limbajului natural și de învățare automată au devenit populare pentru a o automatiza.
Pe piață există soluții gata făcute, fie sub formă de biblioteci, fie sub formă de instrumente gata făcute pentru utilizatorii finali.
În acest articol, vom pregăti propria noastră soluție personalizată, care, în același timp, nu necesită cunoștințe avansate de știință a datelor.
NLP Cloud este un furnizor de mai multe API-uri pentru procesarea textului cu ajutorul modelelor de învățare automată. Una dintre acestea este rezumatorul de text, care pare promițătoare în ceea ce privește implementarea simplă.
Rezumatorul furnizat de NLP Cloud este abstractiv, ceea ce înseamnă că pot fi generate propoziții noi și că părțile cu un raport informație-zgomot scăzut sunt eliminate.
Să vedem un exemplu:

Trecem un bloc de text, iar modelul returnează un rezumat. Dar operarea într-o consolă nu este foarte convenabilă. Așadar, haideți să facem ca Google Docs să rezume fragmentul de text selectat în acest mod.
Scopul nostru este de a crea un meniu convenabil pentru ca rezumarea textului să se facă automat din Google Docs.

Iată cum este structurat proiectul nostru. Folosind Apps Script, vom extinde interfața grafică cu un buton care va declanșa funcții care comunică cu NLP Cloud API și apoi va insera rezultatul de mai jos.
Vom începe prin a pregăti un add-on pentru meniu.
Utilizarea scripturilor Google Apps pentru a adăuga funcționalități personalizate la Google Docs este destul de ușoară. Puteți personaliza interfața utilizatorului cu noi meniuri, casete de dialog și bare laterale. Pentru a crea un script, după ce deschideți Google Docs, selectați Tools -> Script editor.
Toate elementele de interfață trebuie adăugate în această funcție: onOpen. Se execută după deschiderea documentului și ne permite să adăugăm meniul.
function onOpen() {
var ui = DocumentApp.getUi();
ui.createMenu('Text Summarizer')
.addItem('Summarize selection', 'summarizeSelection')
.addToUi();
}
function summarizeSelection() {
// summarization function
}
După salvarea scriptului și reîmprospătarea Docs, ar trebui să găsiți un nou element de meniu "Text Summarizer".

Trebuie să obținem textul selectat și apoi să implementăm următoarea funcție: summarizeSelection.
Partea complicată este obținerea textului selectat în prezent și transmiterea acestuia către funcții. Acest lucru este posibil datorită acestei funcții: 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];
}
Funcția ia pur și simplu întregul paragraf și îl reduce doar la fragmentul selectat. De asemenea, returnează indexul paragrafului, astfel încât să știți unde să inserați rezumatul.
Acum, să trimitem textul către API și să analizăm rezultatul.
Vom folosi următorul serviciu pentru a face cereri API direct: UrlFetch. Solicitarea API de rezumare a textului necesită autorizare prin token. Pentru a o obține, înregistrați-vă la nlpcloud.com (planul gratuit este suficient).
API-ul solicitat returnează un răspuns JSON brut pentru o cerere.
Nu uitați că toate textele procesate de acest script sunt trimise către API extern.
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!');
}
}
Pentru a testa funcționalitatea, selectați un fragment de text în Docs și alegeți Text Summarization -> Summarize selection din meniul Docs.
După un moment de procesare, ar trebui să vedeți un pop-up cu rezultatul, pe care îl puteți chiar copia.

În cele din urmă, putem insera un rezumat generat de API direct în document. Pentru a facilita distincția, textul rezumatului este în bold. De aceea, funcția următoare returnează și indicele paragrafului din textul selectat: getSelectedText.
În acest fel, știm exact unde trebuie să îi spunem lui Apps Script să insereze noul text.
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!');
}
}
Să testăm versiunea finală:
Construirea unei aplicații care extinde funcționalitatea Google Docs pe baza unor API-uri externe este o alternativă interesantă la construirea unor sisteme mari pentru a automatiza etape de lucru incomode. În plus, componentele individuale pot fi înlocuite, în funcție de nevoi și de competențele specifice. De exemplu, soluția noastră poate fi extinsă cu detectarea emoțiilor sau clasificarea textului (disponibilă și în NLP Cloud). De asemenea, vă puteți pregăti propriul API sau funcții simple direct în Apps Script.

Vă mulțumim că ați citit. Sper că v-ați bucurat să citiți la fel de mult pe cât m-am bucurat eu să scriu asta pentru voi.