Article by Rafał Rybnik, Ohjelmistokehityksen päällikkö Instytut Badań Pollster
Olitpa sitten kirjoittaja, datatieteilijä tai vain selaamassa lähteitä saadaksesi työnsä tehtyä, lukemisen pidempien tekstien lukeminen ja tiedonmurujen poimiminen voi olla melko uuvuttavaa. Tällaisten elementtien automatisointi työsi automatisointi antaa sinulle mahdollisuuden keskittyä asioiden luovaan puoleen.

Ellei toisin mainita, kaikki artikkelin kuvat ovat kirjoittajan ottamia.
Tekstin tiivistäminen on tekniikka, jolla poimitaan keskeiset informaatioelementit laajasta tekstistä. Manuaalinen tekstin tiivistäminen on vaikea ja aikaa vievä tehtävä, joten luonnollisen kielen prosessoinnista ja koneoppimisalgoritmeista on tullut suosittuja sen automatisoimiseksi.
Markkinoilla on valmiita ratkaisuja, joko kirjastojen tai loppukäyttäjille tarkoitettujen valmiiden työkalujen muodossa.
Tässä artikkelissa valmistelemme oman räätälöidyn ratkaisun, joka ei kuitenkaan vaadi edistynyttä tietämystä datatieteestä.
NLP Cloud tarjoaa useita sovellusrajapintoja tekstinkäsittelyyn koneoppimismallien avulla. Yksi näistä on tekstin tiivistelmäohjelma, joka vaikuttaa lupaavalta yksinkertaisen toteutuksen kannalta.
NLP Cloudin tarjoama tiivistelmäohjelma on abstrahoiva, mikä tarkoittaa, että uusia lauseita saatetaan luoda ja osat, joissa on alhainen informaatio-kohinasuhde, poistetaan.
Katsotaanpa esimerkki:

Annamme tekstilohkon, ja malli palauttaa yhteenvedon. Konsolissa toimiminen ei kuitenkaan ole kovin kätevää. Laitetaan siis Google Docs tekemään yhteenveto valitusta tekstinpätkästä tällä tavalla.
Tavoitteenamme on luoda kätevä valikko, jonka avulla tekstin tiivistäminen tapahtuu automaattisesti Google Docsissa.

Hankkeemme on jäsennelty näin. Käyttämällä Apps Script -ohjelmaa laajennamme graafista käyttöliittymää painikkeella, joka käynnistää toiminnot, jotka kommunikoivat NLP Cloud API:n kanssa ja lisäävät sitten alla olevan tuloksen.
Aloitamme valmistelemalla lisäosan valikkoon.
Google Apps Scripts -skriptien käyttäminen mukautettujen toimintojen lisäämiseen Google Docsiin on melko helppoa. Voit muokata käyttöliittymää uusilla valikoilla, valintaikkunoilla ja sivupalkkeilla. Voit luoda skriptin avaamalla Google Docsin ja valitsemalla Työkalut -> Skriptieditori.
Kaikki käyttöliittymäelementit olisi lisättävä tähän toimintoon: onOpen. Se suoritetaan asiakirjan avaamisen jälkeen, ja sen avulla voimme lisätä valikon.
function onOpen() {
var ui = DocumentApp.getUi();
ui.createMenu('Text Summarizer')
.addItem('Summarize selection', 'summarizeSelection')
.addToUi();
}
function summarizeSelection() {
// summarization function
}
Kun olet tallentanut komentosarjan ja päivittänyt Docsin, sinun pitäisi löytää uusi valikkokohta "Text Summarizer".

Meidän on saatava valittu teksti ja toteutettava sitten seuraava toiminto: summarizeSelection.
Hankala osa on saada tällä hetkellä valittu teksti ja siirtää se funktioihin. Se on mahdollista tämän funktion ansiosta: 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];
}
Funktio yksinkertaisesti ottaa koko kappaleen ja leikkaa sen vain valitun katkelman kohdalle. Se palauttaa myös kappaleen indeksin, jotta tiedät, mihin kohtaan tiivistelmä lisätään.
Nyt lähetetään teksti API:lle ja analysoidaan tulos.
Käytämme seuraavaa palvelua API-pyyntöjen tekemiseen suoraan: UrlFetch. Tekstin tiivistämisen API-pyyntö vaatii valtuutuksen tunnuksen avulla. Saat sen rekisteröitymällä osoitteessa nlpcloud.com (ilmaispaketti riittää mainiosti).
Pyynnön kohteena oleva sovellusliittymä palauttaa raa'an JSON-vastauksen pyyntöön.
Muista, että kaikki tämän skriptin käsittelemä teksti lähetetään ulkoiseen API:han.
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!');
}
}
Voit testata toiminnallisuutta valitsemalla tekstikappaleen Docsissa ja valitsemalla Docs-valikosta Tekstin tiivistäminen -> Tiivistä valinta.
Hetken käsittelyn jälkeen sinun pitäisi nähdä ponnahdusikkuna, jossa näkyy tulos, jonka voit jopa kopioida.

Lopuksi voimme lisätä API:n tuottaman yhteenvedon suoraan asiakirjaan. Erottamisen helpottamiseksi lihavoi tiivistelmän teksti. Siksi seuraava funktio palauttaa myös valitun tekstin kappaleen indeksin: getSelectedText.
Näin tiedämme tarkalleen, mihin kohtaan Apps Scriptin on lisättävä uusi teksti.
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!');
}
}
Testataan lopullista versiota:
Sovelluksen rakentaminen, joka laajentaa Google Docsin toimintoja ulkoisten sovellusliittymien avulla, on mielenkiintoinen vaihtoehto suurten järjestelmien rakentamiselle hankalien työvaiheiden automatisoimiseksi. Lisäksi yksittäisiä komponentteja voidaan korvata tarpeiden ja erityisosaamisen mukaan. Ratkaisuamme voidaan esimerkiksi laajentaa tunteiden tunnistuksella tai tekstiluokittelulla (saatavilla myös NLP Cloudissa). Voit myös laatia oman API:n tai yksinkertaisia toimintoja suoraan Apps Scriptissä.

Kiitos lukemisesta. Toivottavasti nautitte lukemisesta yhtä paljon kuin minä nautin tämän kirjoittamisesta teille.