Article by Rafał Rybnik, 软件开发主管,在 巴丹民意调查所
无论你是作家、数据科学家还是只是为了完成工作而粗略浏览资料,阅读较长的文本以摘取信息的碎屑是相当累人的。 阅读较长的文本以摘取信息的碎屑可能会相当累人。自动处理这些内容 让你可以专注于事情的创造性方面。

除非另有说明,文章中的所有图片均由作者提供。
文本摘要是提取大量文本的关键信息元素的技术。手动 文本总结是一项困难且耗时的任务,因此自然语言处理和机器学习算法开始流行,以实现自动化。 因此,自然语言处理和机器学习算法开始流行,以使其自动化。
市场上有现成的解决方案,无论是以库的形式还是为终端用户提供的现成工具。
在这篇文章中,我们将准备自己的定制解决方案,同时不需要数据科学的高级知识。
NLP Cloud是一个使用机器学习模型进行文本处理的多个API供应商。其中一个是文本总结器,它在简单的实施方面看起来很有前途。
NLP Cloud提供的总结器是抽象的,这意味着可能会产生新的句子,并将信息噪声比低的部分删除。
让我们看一个例子。

我们传递一个文本块,模型会返回一个摘要。但在控制台中操作不是很方便。所以,让我们让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请求。 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或简单的功能。

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