正在为人工智能或全栈开发而苦恼?我们的专家将为您提供指导:量身定制的建议、技术整合等。联系我们 [email protected].

使用自然语言处理云的文本总结API将文本总结器添加到谷歌文档中

Article by Rafał Rybnik, 软件开发主管,在 巴丹民意调查所

无论你是作家、数据科学家还是只是为了完成工作而粗略浏览资料,阅读较长的文本以摘取信息的碎屑是相当累人的。 阅读较长的文本以摘取信息的碎屑可能会相当累人。自动处理这些内容 让你可以专注于事情的创造性方面。

文本归纳
除非另有说明,文章中的所有图片均由作者提供。

文本归纳

文本摘要是提取大量文本的关键信息元素的技术。手动 文本总结是一项困难且耗时的任务,因此自然语言处理和机器学习算法开始流行,以实现自动化。 因此,自然语言处理和机器学习算法开始流行,以使其自动化。

市场上有现成的解决方案,无论是以库的形式还是为终端用户提供的现成工具。

在这篇文章中,我们将准备自己的定制解决方案,同时不需要数据科学的高级知识。

NLP Cloud

NLP Cloud是一个使用机器学习模型进行文本处理的多个API供应商。其中一个是文本总结器,它在简单的实施方面看起来很有前途。

NLP Cloud提供的总结器是抽象的,这意味着可能会产生新的句子,并将信息噪声比低的部分删除。

让我们看一个例子。

文本总结API

我们传递一个文本块,模型会返回一个摘要。但在控制台中操作不是很方便。所以,让我们让Google Docs用这种方式来总结所选的文本片段。

扩展谷歌文档

我们的目标是创建一个方便的菜单,以便在谷歌文档中自动进行文本总结。

应用程序脚本项目结构

这就是我们项目的结构。使用Apps Script,我们将用一个按钮来扩展GUI,该按钮将触发与NLP Cloud API通信的函数,然后插入下面的结果。

我们将首先为菜单准备一个附加项目。

制作菜单

使用谷歌应用程序脚本向谷歌文档添加自定义功能是相当容易的。你可以用新的菜单、对话框和侧边栏来定制用户界面。要创建一个脚本,在打开Google Docs后,选择工具->脚本编辑器。

所有的界面元素都应该被添加到这个函数中。 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

我们将使用以下服务来直接进行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!');
    }

}

要测试这个功能,只需在文件中选择一个文本片段,然后从文件菜单中选择文本总结->总结选择。

经过一段时间的处理,你应该看到一个弹出的结果,你甚至可以复制它。

文本摘要生成

撰写对文件的回应

最后,我们可以在文件中直接插入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!');
    }
    
}

让我们测试一下最终版本。

经验之谈

构建一个基于外部API扩展Google Docs功能的应用程序,是一个有趣的替代方案,可用于构建大型系统以实现不方便的工作步骤自动化。此外,根据需要和具体技能,个别组件可以被替换。例如,我们的解决方案可以通过情感检测或文本分类(也可在NLP云中使用)进行扩展。你也可以直接在Apps Script中准备你自己的API或简单的功能。

纸飞机

谢谢你的阅读。我希望你喜欢阅读,就像我喜欢为你写这个一样。