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

Якщо не вказано інше, всі фотографії в статті належать автору.
Реферування тексту - техніка вилучення ключових інформаційних елементів об'ємного тексту. Ручне реферування тексту є складним і трудомістким завданням, тому для його автоматизації стали популярними алгоритми обробки природної мови і машинного навчання. популярними для її автоматизації.
На ринку є готові рішення, чи то у вигляді бібліотек, чи то у вигляді готових інструментів для кінцевих користувачів.
У цій статті ми підготуємо власне індивідуальне рішення, яке в той же час не потребує поглиблених знань з науки про дані.
NLP Cloud є постачальником декількох API для обробки тексту з використанням моделей машинного навчання. Одним з таких є текстовий суматор, який виглядає перспективним з точки зору простоти реалізації.
Підсумовувач, що надається NLP Cloud, є абстрактним, що означає, що можуть генеруватися нові речення та видалятися частини з низьким співвідношенням інформація/шум.
Розглянемо приклад:

Ми передаємо блок тексту, а модель повертає резюме. Але працювати в консолі не дуже зручно. Отже, змусимо Google Docs узагальнити виділений фрагмент тексту таким чином.
Наша мета - створити зручне меню, щоб узагальнення тексту відбувалося автоматично з Google Документів.

Ось так побудований наш проект. Використовуючи Apps Script, ми розширимо графічний інтерфейс кнопкою, яка буде запускати функції, що взаємодіють з NLP Cloud API, а потім вставимо результат нижче.
Почнемо з підготовки доповнення до меню.
Використовувати скрипти Google Apps для додавання користувацьких функцій до Документів Google досить просто. Ви можете налаштувати інтерфейс користувача за допомогою нових меню, діалогових вікон і бічних панелей. Щоб створити скрипт, після відкриття Документів Google виберіть Інструменти -> Редактор скриптів.
Всі елементи інтерфейсу повинні бути додані в цю функцію: onOpen. Він запускається після відкриття документа і дозволяє додати меню.
function onOpen() {
var ui = DocumentApp.getUi();
ui.createMenu('Text Summarizer')
.addItem('Summarize selection', 'summarizeSelection')
.addToUi();
}
function summarizeSelection() {
// summarization function
}
Після збереження скрипту та оновлення документів, ви повинні знайти новий пункт меню "Підсумовувач тексту".

Ми повинні отримати виділений текст, а потім реалізувати наступну функцію: 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 Text Summarization вимагає авторизації за допомогою токена. Для його отримання необхідно зареєструватися на 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!');
}
}
Щоб перевірити функціонал, достатньо виділити фрагмент тексту в Документах і вибрати в меню Документів пункт Підсумовування тексту -> Підсумувати виділення.
Після миті обробки ви побачите спливаюче вікно з результатом, який можна навіть скопіювати.

Нарешті, ми можемо вставити резюме, згенероване за допомогою 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 Документів на основі зовнішніх API, є цікавою альтернативою побудові великих систем для автоматизації незручних етапів роботи. Більше того, окремі компоненти можуть бути замінені в залежності від потреб та специфічних навичок. Наприклад, наше рішення можна розширити розпізнаванням емоцій або класифікацією тексту (також доступно в NLP Cloud). Ви також можете підготувати власний API або прості функції безпосередньо в Apps Script.

Дякую, що прочитали. Сподіваюся, Вам сподобалося читати так само, як і мені було приємно писати це для Вас.