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 Документов выберите Инструменты -> Редактор сценариев.
Все элементы интерфейса должны быть добавлены в этой функции: 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 и выберите в меню Docs пункт Text Summarization -> Summarize selection.
Через некоторое время после обработки вы должны увидеть всплывающее окно с результатом, который вы можете даже скопировать.

Наконец, мы можем вставить резюме, сгенерированное 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.

Спасибо, что прочитали. Я надеюсь, что вы получили такое же удовольствие от чтения, как и я от написания этой книги для вас.