Article by Rafał Rybnik, Tarkvaraarenduse juht Instytut Badań Pollster
Olenemata sellest, kas olete kirjanik, andmeteadlane või lihtsalt sirvite allikaid, et tööd teha, lugedes pikemate tekstide lugemine võib olla üsna kurnav. Selliste elementide automatiseerimine teie töö automatiseerimine võimaldab teil keskenduda loomingulisele poolele.

Kui ei ole märgitud teisiti, on kõik artiklis olevad pildid autori tehtud.
Teksti kokkuvõtete tegemine on tehnika, mille abil eraldatakse mahukast tekstist peamised informatiivsed elemendid. Käsitsi tekstide kokkuvõtete tegemine on keeruline ja aeganõudev ülesanne, mistõttu loomulikku keeletöötlust ja masinõppe algoritme hakati kasutama populaarseks, et seda automatiseerida.
Turul on olemas valmislahendused, kas siis raamatukogude või lõppkasutajatele mõeldud valmis tööriistade kujul.
Selles artiklis koostame oma kohandatud lahenduse, mis ei nõua samal ajal arenenud teadmisi andmetöötlusest.
NLP Cloud pakub mitmeid APIsid teksti töötlemiseks masinõppe mudelite abil. Üks neist on teksti kokkuvõtte tegija, mis tundub lihtsa rakendamise poolest paljutõotav.
NLP Cloudi pakutav kokkuvõtte tegija on abstraktsiooniline, mis tähendab, et võidakse genereerida uusi lauseid ja eemaldada madala infomüra suhtega osad.
Näitena võib tuua ühe näite:

Me edastame tekstiploki ja mudel tagastab kokkuvõtte. Kuid konsooliga töötamine ei ole väga mugav. Seega paneme Google Docs'i valitud tekstifragmenti niimoodi kokku võtma.
Meie eesmärk on luua mugav menüü, et teksti kokkuvõtete tegemine toimuks automaatselt Google Docsist.

Nii on meie projekt üles ehitatud. Kasutades Apps Script, laiendame graafilist kasutajaliidest nupuga, mis käivitab funktsioonid, mis suhtlevad NLP Cloud API-ga ja seejärel sisestavad allpool oleva tulemuse.
Alustame menüü lisandi ettevalmistamisega.
Google Apps Scripts'i kasutamine Google Docs'ile kohandatud funktsioonide lisamiseks on üsna lihtne. Kasutajaliidest saab kohandada uute menüüde, dialoogibokside ja külgribade abil. Skripti loomiseks valige pärast Google Docs'i avamist Tools -> Script editor.
Selles funktsioonis tuleks lisada kõik liidese elemendid: onOpen. See käivitatakse pärast dokumendi avamist ja võimaldab meil lisada menüü.
function onOpen() {
var ui = DocumentApp.getUi();
ui.createMenu('Text Summarizer')
.addItem('Summarize selection', 'summarizeSelection')
.addToUi();
}
function summarizeSelection() {
// summarization function
}
Pärast skripti salvestamist ja Dokumendi uuendamist peaksite leidma uue menüüelemendi "Teksti kokkuvõtte".

Me peame saama valitud teksti ja seejärel rakendama järgmise funktsiooni: summarizeSelection.
Keeruline osa on hetkel valitud teksti saamine ja selle edastamine funktsioonidele. See on võimalik tänu sellele funktsioonile: 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];
}
Funktsioon võtab lihtsalt kogu lõigu ja kärbib selle ainult valitud fragmendini. Samuti tagastab see lõigu indeksi, et te teaksite, kuhu kokkuvõte sisestada.
Nüüd saadame teksti API-le ja analüüsime tulemust.
Kasutame järgmist teenust, et teha otse API päringuid: UrlFetch. Teksti kokkuvõtte API taotlus nõuab autoriseerimist sümboli kaudu. Selle saamiseks registreerige end aadressil nlpcloud.com (tasuta pakett piisab).
Taotletav API tagastab taotluse kohta töötlemata JSON-vastuse.
Pea meeles, et kogu selle skripti poolt töödeldud tekst saadetakse välisele API-le.
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!');
}
}
Funktsionaalsuse testimiseks valige lihtsalt tekstifragment Dokumendis ja valige Dokumendi menüüst Teksti kokkuvõtete tegemine -> Valiku kokkuvõtete tegemine.
Pärast hetke kestnud töötlemist peaks teile ilmuma hüpikaken, kus kuvatakse tulemus, mille saate isegi kopeerida.

Lõpuks saame sisestada API loodud kokkuvõtte otse dokumenti. Eristamise hõlbustamiseks on kokkuvõtte tekst rasvases kirjas. Seepärast tagastab järgmine funktsioon ka valitud teksti lõikeindeksi: getSelectedText.
Nii teame täpselt, kuhu Apps Script peab uue teksti sisestama.
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!');
}
}
Katsetame lõplikku versiooni:
Google Docs'i funktsionaalsust laiendava rakenduse ehitamine väliste APIde põhjal on huvitav alternatiiv suurte süsteemide ehitamisele, et automatiseerida ebamugavaid tööetappe. Lisaks saab üksikuid komponente asendada, sõltuvalt vajadustest ja konkreetsetest oskustest. Näiteks saab meie lahendust laiendada emotsioonide tuvastamise või teksti klassifitseerimisega (saadaval ka NLP Cloudis). Samuti saate koostada oma API või lihtsad funktsioonid otse Apps Scriptis.

Tänan teid lugemise eest. Loodan, et teile meeldis lugeda sama palju kui mulle meeldis seda teile kirjutada.