Article by Rafał Rybnik, Vodja razvoja programske opreme v Instytut Badań Pollster
Ne glede na to, ali ste pisec, podatkovni znanstvenik ali le prebirate vire, da bi opravili delo, branje daljših besedil, da bi izluščili drobce informacij, je lahko precej naporno. Avtomatizacija takšnih elementov dela vam omogoča, da se osredotočite na ustvarjalno plat stvari.

Če ni navedeno drugače, so vse slike v članku avtorjeve.
Povzemanje besedila je tehnika izločanja ključnih informacijskih elementov iz obsežnega besedila. Ročno zato so postali algoritmi strojnega učenja in obdelave naravnega jezika zahtevno in časovno potratno opravilo. priljubljeni za njeno avtomatizacijo.
Na trgu so na voljo pripravljene rešitve v obliki knjižnic ali pripravljenih orodij za končne uporabnike.
V tem članku bomo pripravili lastno prilagojeno rešitev, ki hkrati ne zahteva naprednega znanja podatkovne znanosti.
NLP Cloud je ponudnik več vmesnikov API za obdelavo besedila z modeli strojnega učenja. Eden od teh je povzetek besedila, ki je videti obetaven z vidika preproste izvedbe.
Povzetek, ki ga zagotavlja NLP Cloud, je abstrakten, kar pomeni, da se lahko ustvarijo novi stavki in odstranijo deli z nizkim razmerjem med informacijami in šumom.
Oglejmo si primer:

Predamo blok besedila, model pa vrne povzetek. Vendar delovanje v konzoli ni preveč priročno. Zato poskrbimo, da Google Dokumenti povzamejo izbrani del besedila na ta način.
Naš cilj je ustvariti priročen meni, s katerim bo povzemanje besedila potekalo samodejno v Googlovih dokumentih.

Tako je strukturiran naš projekt. Z uporabo programa Apps Script bomo grafični vmesnik razširili z gumbom, ki bo sprožil funkcije, ki komunicirajo z vmesnikom API NLP Cloud, in nato vstavili spodnji rezultat.
Začeli bomo s pripravo dodatka za meni.
Uporaba skript Google Apps za dodajanje funkcij po meri v dokumente Google Docs je precej preprosta. Uporabniški vmesnik lahko prilagodite z novimi meniji, pogovornimi okni in stranskimi vrsticami. Če želite ustvariti skript, po odprtju programa Google Dokumenti izberite Orodja -> Urejevalnik skript.
V tej funkciji je treba dodati vse elemente vmesnika: onOpen. Zažene se po odprtju dokumenta in nam omogoča dodajanje menija.
function onOpen() {
var ui = DocumentApp.getUi();
ui.createMenu('Text Summarizer')
.addItem('Summarize selection', 'summarizeSelection')
.addToUi();
}
function summarizeSelection() {
// summarization function
}
Po shranjevanju skripte in osvežitvi Dokumentov morate najti nov element menija "Povzetek besedila".

Pridobiti moramo izbrano besedilo in nato implementirati naslednjo funkcijo: summarizeSelection.
Težavno je pridobiti trenutno izbrano besedilo in ga posredovati funkcijam. To je mogoče zahvaljujoč tej funkciji: 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];
}
Funkcija preprosto vzame celoten odstavek in ga skrči na izbrani del. Vrne tudi indeks odstavka, tako da veste, kam vstaviti povzetek.
Zdaj pošljite besedilo API-ju in razčlenite rezultat.
Za neposredno izvajanje zahtevkov API bomo uporabili naslednjo storitev: UrlFetch. Zahteva API za povzemanje besedila zahteva avtorizacijo z žetonom. Če ga želite pridobiti, se prijavite na nlpcloud.com (brezplačni načrt je povsem ustrezen).
Zahtevani API vrne neobdelan odgovor JSON za zahtevo.
Ne pozabite, da se vsa besedila, ki jih ta skripta obdeluje, pošljejo v zunanji 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!');
}
}
Če želite preizkusiti to funkcijo, v Dokumentih izberite odlomek besedila in v meniju Dokumenti izberite Povzetek besedila -> Povzeti izbor.
Po nekaj trenutkih obdelave se prikaže pojavno okno z rezultatom, ki ga lahko tudi kopirate.

Nazadnje lahko povzetek, ki ga ustvari API, vstavimo neposredno v dokument. Za lažje razlikovanje besedilo povzetka krepko označite. Zato naslednja funkcija vrne tudi indeks odstavka izbranega besedila: getSelectedText.
Tako bomo natančno vedeli, kam naj program Apps Script vstavi novo besedilo.
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!');
}
}
Preizkusimo končno različico:
Gradnja aplikacije, ki razširja funkcionalnost Googlovih dokumentov na podlagi zunanjih vmesnikov API, je zanimiva alternativa gradnji velikih sistemov za avtomatizacijo neprijetnih delovnih korakov. Poleg tega lahko posamezne komponente zamenjate glede na potrebe in specifična znanja. Na primer, našo rešitev je mogoče razširiti z zaznavanjem čustev ali razvrščanjem besedil (na voljo tudi v oblaku NLP Cloud). Pripravite lahko tudi lasten API ali preproste funkcije neposredno v aplikaciji Apps Script.

Hvala za branje. Upam, da ste uživali v branju, tako kot sem jaz uživala v pisanju za vas.