Article by Rafał Rybnik, Vedoucí vývoje softwaru ve společnosti Instytut Badań Pollster
Ať už jste spisovatel, datový vědec, nebo jen procházíte zdroje, abyste měli hotovou práci, čtení je pro vás důležité. delší texty a vybírat z nich drobky informací může být docela vyčerpávající. Automatizace takových prvků práce vám umožní soustředit se na kreativní stránku věci.

Pokud není uvedeno jinak, všechny obrázky v článku jsou od autora.
Shrnutí textu je technika extrakce klíčových informačních prvků z rozsáhlého textu. Manuální je obtížný a časově náročný úkol, proto se zpracování přirozeného jazyka a algoritmy strojového učení staly základem pro shrnutí textu. populární pro její automatizaci.
Na trhu existují hotová řešení, ať už ve formě knihoven nebo hotových nástrojů pro koncové uživatele.
V tomto článku si připravíme vlastní řešení na míru, které zároveň nevyžaduje pokročilé znalosti datové vědy.
NLP Cloud je poskytovatelem několika rozhraní API pro zpracování textu pomocí modelů strojového učení. Jedním z nich je textový sumarizátor, který vypadá slibně z hlediska jednoduché implementace.
Souhrnovač poskytovaný službou NLP Cloud je abstraktní, což znamená, že mohou být generovány nové věty a části s nízkým poměrem informace k šumu jsou odstraněny.
Podívejme se na příklad:

Předáme blok textu a model vrátí shrnutí. Práce v konzole však není příliš pohodlná. Přimějme tedy aplikaci Dokumenty Google, aby vybraný fragment textu shrnula tímto způsobem.
Naším cílem je vytvořit pohodlnou nabídku, aby shrnutí textu probíhalo automaticky z Dokumentů Google.

Takto je strukturován náš projekt. Pomocí Apps Scriptu rozšíříme grafické uživatelské rozhraní o tlačítko, které spustí funkce komunikující s rozhraním NLP Cloud API, a poté vložíme níže uvedený výsledek.
Začneme přípravou doplňku pro menu.
Použití skriptů Google Apps k přidání vlastních funkcí do Dokumentů Google je poměrně snadné. Uživatelské rozhraní můžete přizpůsobit pomocí nových nabídek, dialogových oken a postranních panelů. Chcete-li vytvořit skript, po otevření Dokumentů Google vyberte Nástroje -> Editor skriptů.
V této funkci by měly být přidány všechny prvky rozhraní: onOpen. Spustí se po otevření dokumentu a umožní nám přidat nabídku.
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í Dokumentů byste měli najít nový prvek nabídky "Text Summarizer".

Musíme získat vybraný text a poté implementovat následující funkci: summarizeSelection.
Složitější je získat aktuálně vybraný text a předat ho funkcím. To je možné díky této funkci: 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];
}
Funkce jednoduše vezme celý odstavec a zkrátí jej na vybraný fragment. Vrátí také index odstavce, abyste věděli, kam vložit shrnutí.
Nyní odešleme text do rozhraní API a analyzujme výsledek.
K přímému zadávání požadavků API použijeme následující službu: UrlFetch. Požadavek na API pro shrnutí textu vyžaduje autorizaci pomocí tokenu. Chcete-li jej získat, zaregistrujte se na adrese nlpcloud.com (stačí bezplatný tarif).
Požadované rozhraní API vrací nezpracovanou odpověď JSON na požadavek.
Nezapomeňte, že veškerý text zpracovávaný tímto skriptem je odesílán do externího rozhraní 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!');
}
}
Chcete-li tuto funkci vyzkoušet, stačí v Dokumentech vybrat fragment textu a v nabídce Dokumenty zvolit možnost Shrnutí textu -> Shrnout výběr.
Po chvíli zpracování by se mělo zobrazit vyskakovací okno s výsledkem, který můžete i zkopírovat.

Nakonec můžeme přímo do dokumentu vložit shrnutí vygenerované rozhraním API. Pro snadnější rozlišení text shrnutí zvýrazněte tučným písmem. Proto následující funkce vrací také index odstavce vybraného textu: getSelectedText.
Tímto způsobem přesně víme, kam máme skriptu Apps Script říci, aby nový text vložil.
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čnou verzi:
Vytvoření aplikace, která rozšiřuje funkce Dokumentů Google na základě externích rozhraní API, je zajímavou alternativou k budování rozsáhlých systémů pro automatizaci nepohodlných pracovních kroků. Jednotlivé komponenty lze navíc nahradit v závislosti na potřebách a specifických dovednostech. Naše řešení lze například rozšířit o detekci emocí nebo klasifikaci textu (rovněž dostupné v NLP Cloud). Můžete si také připravit vlastní rozhraní API nebo jednoduché funkce přímo v aplikaci Apps Script.

Děkujeme za přečtení. Doufám, že jste si čtení užili stejně jako já, když jsem pro vás tuto knihu psal.