Article by Rafał Rybnik, Programmatūras izstrādes vadītājs Instytut Badań Pollster
Neatkarīgi no tā, vai esat rakstnieks, datu zinātnieks vai vienkārši šķirstāt avotus, lai paveiktu darbu. garāku tekstu lasīšana, lai izvilinātu no tiem informācijas druskas, var būt diezgan nogurdinoša. Šādu elementu automatizēšana darba automatizēšana ļauj jums koncentrēties uz radošo pusi.

Ja vien nav norādīts citādi, visu rakstā iekļauto attēlu autors ir autors.
Teksta apkopošana ir metode, ar kuras palīdzību no apjomīga teksta tiek izvilkti galvenie informācijas elementi. Rokasgrāmata teksta apkopošana ir sarežģīts un laikietilpīgs uzdevums, tāpēc dabiskās valodas apstrāde un mašīnmācīšanās algoritmi kļuva populāri, lai to automatizētu.
Tirgū ir pieejami gatavi risinājumi - gan bibliotēkas, gan gatavi rīki galalietotājiem.
Šajā rakstā mēs sagatavosim savu pielāgotu risinājumu, kas tajā pašā laikā neprasa padziļinātas zināšanas datu zinātnē.
NLP Cloud ir vairāku API nodrošinātājs teksta apstrādei, izmantojot mašīnmācīšanās modeļus. Viens no tiem ir teksta kopsavilkuma meklētājs, kas izskatās daudzsološs vienkāršas ieviešanas ziņā.
NLP Cloud piedāvātais apkopojums ir abstrakts, kas nozīmē, ka var tikt ģenerēti jauni teikumi un daļas ar zemu informācijas un trokšņa attiecību tiek izņemtas.
Aplūkosim piemēru:

Mēs nododam teksta bloku, un modelis atgriež kopsavilkumu. Taču darbs konsoles režīmā nav īpaši ērts. Tāpēc liksim Google Docs apkopot atlasīto teksta fragmentu šādā veidā.
Mūsu mērķis ir izveidot ērtu izvēlni, lai teksta kopsavilkuma izveide notiktu automātiski no Google dokumentiem.

Šāda ir mūsu projekta struktūra. Izmantojot Apps Script, mēs paplašināsim GUI ar pogu, kas iedarbinās funkcijas, kuras sazināsies ar NLP Cloud API un pēc tam ievietos tālāk redzamo rezultātu.
Mēs sāksim ar izvēlnes papildinājuma sagatavošanu.
Izmantojot Google Apps skriptus, ir diezgan vienkārši pievienot Google dokumentiem pielāgotas funkcijas. Varat pielāgot lietotāja saskarni ar jaunām izvēlnēm, dialoglodziņiem un sānjoslām. Lai izveidotu skriptu, pēc Google Docs atvēršanas izvēlieties Rīki -> Skriptu redaktors.
Šajā funkcijā jāpievieno visi saskarnes elementi: onOpen. Tā tiek palaista pēc dokumenta atvēršanas un ļauj mums pievienot izvēlni.
function onOpen() {
var ui = DocumentApp.getUi();
ui.createMenu('Text Summarizer')
.addItem('Summarize selection', 'summarizeSelection')
.addToUi();
}
function summarizeSelection() {
// summarization function
}
Pēc skripta saglabāšanas un Dokumentu atsvaidzināšanas jāatrod jauns izvēlnes elements "Teksta apkopotājs".

Mums ir jāsaņem atlasītais teksts un pēc tam jāimplementē šāda funkcija: summarizeSelection.
Sarežģītākais ir iegūt pašlaik atlasīto tekstu un nodot to funkcijām. Tas ir iespējams, pateicoties šai funkcijai: 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 vienkārši izmanto visu rindkopu un saīsina to līdz izvēlētajam fragmentam. Tā atgriež arī rindkopu indeksu, lai jūs zinātu, kur ievietot kopsavilkumu.
Tagad nosūtīsim tekstu API un analizēsim rezultātu.
Lai tieši veiktu API pieprasījumus, izmantosim šādu pakalpojumu: UrlFetch. Teksta apkopošanas API pieprasījumam nepieciešama autorizācija, izmantojot token. Lai to saņemtu, reģistrējieties vietnē nlpcloud.com (bezmaksas plāns būs piemērots).
Pieprasītā API atgriež neapstrādātu JSON atbildi uz pieprasījumu.
Atcerieties, ka viss šī skripta apstrādātais teksts tiek nosūtīts uz ārējo 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!');
}
}
Lai pārbaudītu funkcionalitāti, vienkārši atlasiet teksta fragmentu dokumentos un izvēlnē Dokumenti izvēlnē izvēlieties Dokumentu kopsavilkums -> Apkopojiet atlasi.
Pēc apstrādes brīža parādīsies uznirstošais logs ar rezultātu, kuru varat pat kopēt.

Visbeidzot, mēs varam ievietot API ģenerētu kopsavilkumu tieši dokumentā. Atšķirības atvieglošanai kopsavilkuma tekstu pasvītrosiet. Tāpēc turpmāk minētā funkcija atgriež arī atlasītā teksta rindkopu indeksu: getSelectedText.
Tādējādi mēs precīzi zinām, kurā vietā lietotnei Apps Script jānorāda, lai tā ievieto jauno tekstu.
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!');
}
}
Izmēģināsim galīgo versiju:
Interesanta alternatīva lielu sistēmu izveidei, lai automatizētu neērtus darba soļus, ir izveidot lietojumprogrammu, kas paplašina Google Docs funkcionalitāti, pamatojoties uz ārējām API. Turklāt atkarībā no vajadzībām un specifiskām prasmēm var aizstāt atsevišķas sastāvdaļas. Piemēram, mūsu risinājumu var paplašināt ar emociju noteikšanu vai teksta klasifikāciju (pieejama arī NLP Cloud). Varat arī sagatavot savu API vai vienkāršas funkcijas tieši Apps Script.

Paldies, ka izlasījāt. Es ceru, ka jums patika lasīt tikpat labi, cik man patika to rakstīt jums.