Article by Rafał Rybnik, Szoftverfejlesztési vezető a Instytut Badań Pollster
Akár író, akár adattudós, akár csak átfutja a forrásokat, hogy elvégezze a munkáját, az olvasás hosszabb szövegek elolvasása az információmorzsák kiszedése érdekében igen kimerítő lehet. Az ilyen elemek automatizálása lehetővé teszi, hogy a dolgok kreatív oldalára koncentrálhasson.
Hacsak másképp nem szerepel, a cikkben szereplő összes képet a szerző készítette.
A szövegösszefoglalás egy terjedelmes szöveg kulcsfontosságú információs elemeinek kinyerésének technikája. Kézi szöveges összegzés nehéz és időigényes feladat, ezért a természetes nyelvfeldolgozás és a gépi tanulási algoritmusok váltak népszerűvé váltak az automatizálás érdekében.
Vannak kész megoldások a piacon, akár könyvtárak, akár a végfelhasználók számára készült eszközök formájában.
Ebben a cikkben elkészítjük a saját testre szabott megoldásunkat, amely ugyanakkor nem igényel fejlett adattudományi ismereteket.
Az NLP Cloud több API-t kínál a gépi tanulási modellekkel történő szövegfeldolgozáshoz. Ezek egyike a szövegösszefoglaló, amely az egyszerű megvalósítás szempontjából ígéretesnek tűnik.
Az NLP Cloud által biztosított összegző absztraktív, ami azt jelenti, hogy új mondatokat generálhat, és az alacsony információ-zaj arányú részeket eltávolítja.
Lássunk egy példát:
Átadunk egy szövegrészletet, és a modell visszaad egy összefoglalót. A konzolon való működés azonban nem túl kényelmes. Így hát érjük el, hogy a Google Docs így foglalja össze a kiválasztott szövegrészletet.
Célunk egy kényelmes menü létrehozása, hogy a szöveges összefoglaló automatikusan megtörténjen a Google Dokumentumokból.
A projektünk így épül fel. Az Apps Script segítségével kibővítjük a felhasználói felületet egy gombbal, amely az NLP Cloud API-val kommunikáló funkciókat indít, majd beillesztjük az alábbi eredményt.
A menü kiegészítésének elkészítésével kezdjük.
A Google Apps Scripts használatával a Google Dokumentumok egyéni funkciókkal való bővítése meglehetősen egyszerű. A felhasználói felületet új menükkel, párbeszédpanelekkel és oldalsávokkal testre szabhatja. Szkript létrehozásához a Google Dokumentumok megnyitása után válassza az Eszközök -> Szkriptszerkesztő menüpontot.
Az összes interfészelemet ebben a funkcióban kell hozzáadni: onOpen
. A dokumentum megnyitása után fut le, és lehetővé teszi számunkra a menü hozzáadását.
function onOpen() {
var ui = DocumentApp.getUi();
ui.createMenu('Text Summarizer')
.addItem('Summarize selection', 'summarizeSelection')
.addToUi();
}
function summarizeSelection() {
// summarization function
}
A szkript mentése és a Dokumentumok frissítése után új menüelemet kell találnia "Szövegösszefoglaló".
Meg kell szereznünk a kiválasztott szöveget, majd a következő függvényt kell végrehajtanunk: summarizeSelection
.
A trükkös rész az aktuálisan kiválasztott szöveg megszerzése és átadása a függvényeknek. Ez lehetséges ennek a függvénynek köszönhetően: 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];
}
A funkció egyszerűen a teljes bekezdést veszi, és a kiválasztott részre vágja le. Visszaadja a bekezdés indexét is, hogy tudja, hova kell beilleszteni az összefoglalót.
Most küldjük el a szöveget az API-nak, és elemezzük az eredményt.
A következő szolgáltatást fogjuk használni az API-kérések közvetlen elvégzéséhez: UrlFetch
. A Szövegösszefoglaló API-kérelemhez tokenen keresztül történő engedélyezés szükséges. Ahhoz, hogy megkapd, regisztrálj az nlpcloud.com oldalon (az ingyenes csomag is megteszi).
A kért API nyers JSON-választ ad vissza egy kérésre.
Ne feledje, hogy a szkript által feldolgozott összes szöveget külső API-nak küldi.
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!');
}
}
A funkció teszteléséhez csak jelölje ki a szövegrészletet a Dokumentumokban, és válassza a Dokumentumok menüből a Szövegösszegzés -> Kiválasztás összegzése parancsot.
Egy pillanatnyi feldolgozás után egy felugró ablakban megjelenik az eredmény, amelyet akár ki is másolhat.
Végül pedig közvetlenül a dokumentumba illeszthetünk egy API által generált összefoglalót. A könnyebb megkülönböztetés érdekében vastag betűvel szedjük ki az összefoglaló szövegét. Ezért a következő függvény a kiválasztott szöveg bekezdésindexét is visszaadja: getSelectedText
.
Így pontosan tudjuk, hogy az Apps Scriptnek hova kell beillesztenie az új szöveget.
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!');
}
}
Teszteljük a végleges változatot:
A Google Dokumentumok funkcióit külső API-kra alapozva kibővítő alkalmazás létrehozása érdekes alternatívája a kényelmetlen munkafolyamatok automatizálására szolgáló nagy rendszerek építésének. Ráadásul az egyes komponensek az igényektől és a speciális készségektől függően helyettesíthetők. Megoldásunk például kibővíthető érzelemérzékeléssel vagy szövegosztályozással (az NLP Cloudban is elérhető). Saját API-t vagy egyszerű függvényeket is készíthet közvetlenül az Apps Scriptben.
Köszönjük, hogy elolvasta. Remélem, legalább annyira élveztétek az olvasást, mint amennyire én élveztem, hogy ezt megírtam nektek.