Article by Rafał Rybnik, Ръководител на отдела за разработка на софтуер в Instytut Badań Pollster
Независимо дали сте писател, специалист по данни или просто преглеждате източници, за да си свършите работата, четенето по-дълги текстове, за да изтръгнете трохи информация, може да бъде доста изтощително. Автоматизирането на такива елементи от работата ви позволява да се съсредоточите върху творческата страна на нещата.

Освен ако не е посочено друго, всички снимки в статията са на автора.
Обобщаването на текст е техника за извличане на ключови информационни елементи от обемен текст. Ръчно обобщаването на текстове е трудна и времеемка задача, така че алгоритмите за обработка на естествен език и машинно обучение станаха популярни, за да я автоматизират.
На пазара има готови решения под формата на библиотеки или готови инструменти за крайни потребители.
В тази статия ще подготвим наше собствено решение, което в същото време не изисква напреднали познания в областта на науката за данните.
NLP Cloud е доставчик на множество приложни програмни интерфейси (API) за обработка на текст с помощта на модели за машинно обучение. Един от тях е обобщителят на текст, който изглежда обещаващ от гледна точка на простото изпълнение.
Обобщителят, предоставен от NLP Cloud, е абстрактен, което означава, че могат да се генерират нови изречения и да се премахват части с ниско съотношение информация-шум.
Нека видим един пример:

Предаваме блок от текст, а моделът връща резюме. Но работата в конзола не е много удобна. Затова нека накараме Google Docs да обобщи избрания фрагмент от текста по този начин.
Нашата цел е да създадем удобно меню, което да позволява автоматичното обобщаване на текст от Google Docs.

Ето как е структуриран нашият проект. С помощта на Apps Script ще разширим графичния потребителски интерфейс с бутон, който ще задейства функции, комуникиращи с NLP Cloud API, и след това ще вмъкнем резултата по-долу.
Ще започнем с подготовката на добавка към менюто.
Използването на скриптове на Google Apps за добавяне на персонализирани функционалности към Google Docs е сравнително лесно. Можете да персонализирате потребителския интерфейс с нови менюта, диалогови прозорци и странични ленти. За да създадете скрипт, след като отворите Google Docs, изберете Инструменти -> Редактор на скриптове.
Всички елементи на интерфейса трябва да бъдат добавени в тази функция: onOpen. Тя се стартира след отваряне на документа и ни позволява да добавим менюто.
function onOpen() {
var ui = DocumentApp.getUi();
ui.createMenu('Text Summarizer')
.addItem('Summarize selection', 'summarizeSelection')
.addToUi();
}
function summarizeSelection() {
// summarization function
}
След като запазите скрипта и обновите Docs, трябва да откриете нов елемент от менюто "Text Summarizer".

Трябва да получим избрания текст и след това да приложим следната функция: summarizeSelection.
Трудната част е получаването на текущо избрания текст и предаването му на функциите. Това е възможно благодарение на тази функция: 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];
}
Функцията просто взема целия параграф и го съкращава само до избрания фрагмент. Тя връща и индекса на параграфа, за да знаете къде да вмъкнете резюмето.
Сега нека изпратим текста към API и да анализираме резултата.
Ще използваме следната услуга, за да правим директно заявки към API: UrlFetch. Заявката за API за обобщаване на текст изисква оторизация чрез токен. За да го получите, регистрирайте се на nlpcloud.com (безплатният план е напълно достатъчен).
Заявеният API връща необработен JSON отговор за заявката.
Не забравяйте, че всички текстове, обработвани от този скрипт, се изпращат към външен 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!');
}
}
За да тествате функционалността, просто изберете фрагмент от текст в Docs и изберете Text Summarization -> Summarize selection от менюто Docs.
След известно време на обработка трябва да се появи изскачащ прозорец с резултата, който можете дори да копирате.

И накрая, можем да вмъкнем резюме, генерирано от API, директно в документа. За по-лесно разграничаване удебелете текста на резюмето. Ето защо следващата функция връща и индекса на параграфа на избрания текст: getSelectedText.
По този начин ще знаем къде точно да кажем на Apps Script да вмъкне новия текст.
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!');
}
}
Нека тестваме окончателната версия:
Изграждането на приложение, което разширява функционалността на Google Docs въз основа на външни API, е интересна алтернатива на изграждането на големи системи за автоматизиране на неудобни работни стъпки. Освен това отделните компоненти могат да бъдат заменени в зависимост от нуждите и специфичните умения. Например нашето решение може да бъде разширено с разпознаване на емоции или класификация на текстове (налично и в NLP Cloud). Можете също така да подготвите свой собствен API или прости функции директно в Apps Script.

Благодарим ви, че четете. Надявам се, че четенето ви е доставило удоволствие, както и писането на този текст за вас.