Article by Rafał Rybnik, Vedúci oddelenia vývoja softvéru v spoločnosti Instytut Badań Pollster
Či už ste spisovateľ, dátový vedec, alebo len prechádzate zdroje, aby ste mohli dokončiť prácu, čítanie dlhšie texty, aby ste z nich vytiahli drobky informácií, môže byť dosť vyčerpávajúce. Automatizácia takýchto prvkov vašej práce vám umožní sústrediť sa na kreatívnu stránku veci.

Pokiaľ nie je uvedené inak, všetky obrázky v článku sú od autora.
Sumarizácia textu je technika extrakcie kľúčových informačných prvkov rozsiahleho textu. Manuálne je náročná a časovo náročná úloha, preto sa spracovaním prirodzeného jazyka a algoritmami strojového učenia stali populárne na jej automatizáciu.
Na trhu existujú hotové riešenia, či už vo forme knižníc alebo hotových nástrojov pre koncových používateľov.
V tomto článku si pripravíme vlastné riešenie na mieru, ktoré zároveň nevyžaduje pokročilé znalosti dátovej vedy.
NLP Cloud je poskytovateľom viacerých rozhraní API na spracovanie textu pomocou modelov strojového učenia. Jedným z nich je sumarizátor textu, ktorý vyzerá sľubne z hľadiska jednoduchej implementácie.
Sumarizátor poskytovaný službou NLP Cloud je abstraktný, čo znamená, že sa môžu vytvárať nové vety a odstraňovať časti s nízkym pomerom informácií k šumu.
Uveďme si príklad:

Odovzdáme blok textu a model vráti zhrnutie. Práca v konzole však nie je veľmi pohodlná. Preto prinúťme službu Dokumenty Google zhrnúť vybraný fragment textu týmto spôsobom.
Naším cieľom je vytvoriť pohodlnú ponuku, aby sa sumarizácia textu uskutočňovala automaticky z Dokumentov Google.

Takto je štruktúrovaný náš projekt. Pomocou Apps Scriptu rozšírime grafické rozhranie o tlačidlo, ktoré spustí funkcie komunikujúce s rozhraním NLP Cloud API, a potom vložíme výsledok uvedený nižšie.
Začneme prípravou doplnku do ponuky.
Používanie skriptov Google Apps na pridávanie vlastných funkcií do Dokumentov Google je pomerne jednoduché. Používateľské rozhranie môžete prispôsobiť pomocou nových ponúk, dialógových okien a bočných panelov. Ak chcete vytvoriť skript, po otvorení aplikácie Dokumenty Google vyberte položku Nástroje -> Editor skriptov.
V tejto funkcii by sa mali pridať všetky prvky rozhrania: onOpen. Spustí sa po otvorení dokumentu a umožní nám pridať menu.
function onOpen() {
var ui = DocumentApp.getUi();
ui.createMenu('Text Summarizer')
.addItem('Summarize selection', 'summarizeSelection')
.addToUi();
}
function summarizeSelection() {
// summarization function
}
Po uložení skriptu a obnovení Dokumentov by ste mali nájsť nový prvok ponuky "Text Summarizer".

Musíme získať vybraný text a potom implementovať nasledujúcu funkciu: summarizeSelection.
Zložitá časť spočíva v získaní aktuálne vybraného textu a jeho odovzdaní funkciám. To je možné vďaka tejto funkcii: 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];
}
Funkcia jednoducho prevezme celý odsek a skráti ho len na vybraný fragment. Vráti tiež index odseku, aby ste vedeli, kam vložiť zhrnutie.
Teraz odošleme text do rozhrania API a analyzujme výsledok.
Na priame zadávanie požiadaviek API použijeme nasledujúcu službu: UrlFetch. Požiadavka API na sumarizáciu textu vyžaduje autorizáciu prostredníctvom tokenu. Ak ho chcete získať, zaregistrujte sa na stránke nlpcloud.com (bezplatný plán vám bude stačiť).
Požadované rozhranie API vráti nespracovanú odpoveď JSON na požiadavku.
Nezabudnite, že všetky texty spracované týmto skriptom sa odosielajú do externého rozhrania 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!');
}
}
Ak chcete otestovať túto funkciu, stačí vybrať fragment textu v Dokumentoch a z ponuky Dokumenty vybrať položku Sumarizácia textu -> Sumarizovať výber.
Po chvíli spracovania by sa malo zobraziť vyskakovacie okno s výsledkom, ktorý môžete aj skopírovať.

Nakoniec môžeme priamo do dokumentu vložiť zhrnutie vytvorené rozhraním API. Pre ľahšie rozlíšenie text súhrnu zvýraznite tučným písmom. Preto nasledujúca funkcia vracia aj index odseku vybraného textu: getSelectedText.
Takto presne vieme, kam máme v programe Apps Script povedať, aby vložil nový 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!');
}
}
Otestujme konečnú verziu:
Vytvorenie aplikácie, ktorá rozširuje funkcie Dokumentov Google na základe externých rozhraní API, je zaujímavou alternatívou k budovaniu veľkých systémov na automatizáciu nepohodlných pracovných krokov. Jednotlivé komponenty je navyše možné nahradiť v závislosti od potrieb a špecifických zručností. Naše riešenie možno napríklad rozšíriť o detekciu emócií alebo klasifikáciu textu (dostupné aj v službe NLP Cloud). Môžete si tiež pripraviť vlastné API alebo jednoduché funkcie priamo v Apps Script.

Ďakujeme za prečítanie. Dúfam, že ste si čítanie užili rovnako, ako som si ja užila písanie tejto knihy pre vás.