Article by Rafał Rybnik, Επικεφαλής ανάπτυξης λογισμικού στην Instytut Badań Pollster
Είτε είστε συγγραφέας, είτε επιστήμονας δεδομένων είτε απλά ξεφυλλίζετε πηγές για να κάνετε μια δουλειά, η ανάγνωση μεγαλύτερα κείμενα για να ξετρυπώσετε τα ψίχουλα των πληροφοριών μπορεί να είναι αρκετά εξαντλητική. Η αυτοματοποίηση τέτοιων στοιχείων της της εργασίας σας σας επιτρέπει να επικεντρωθείτε στη δημιουργική πλευρά των πραγμάτων.

Εκτός αν αναφέρεται διαφορετικά, όλες οι φωτογραφίες στο άρθρο είναι του συγγραφέα.
Η περίληψη κειμένου είναι η τεχνική εξαγωγής των βασικών πληροφοριακών στοιχείων ενός ογκώδους κειμένου. Χειροκίνητη περίληψη κειμένου είναι μια δύσκολη και χρονοβόρα εργασία, οπότε η επεξεργασία φυσικής γλώσσας και οι αλγόριθμοι μηχανικής μάθησης έγιναν δημοφιλείς για την αυτοματοποίησή της.
Υπάρχουν έτοιμες λύσεις στην αγορά, είτε με τη μορφή βιβλιοθηκών είτε με τη μορφή έτοιμων εργαλείων για τους τελικούς χρήστες.
Σε αυτό το άρθρο, θα ετοιμάσουμε τη δική μας προσαρμοσμένη λύση, η οποία ταυτόχρονα δεν απαιτεί προχωρημένες γνώσεις επιστήμης δεδομένων.
Το NLP Cloud είναι πάροχος πολλαπλών API για την επεξεργασία κειμένου με χρήση μοντέλων μηχανικής μάθησης. Ένα από αυτά είναι ο συνοψιστής κειμένου, ο οποίος φαίνεται πολλά υποσχόμενος από την άποψη της απλής υλοποίησης.
Ο συνοψιστής που παρέχεται από το NLP Cloud είναι αφαιρετικός, πράγμα που σημαίνει ότι μπορεί να δημιουργηθούν νέες προτάσεις και να αφαιρεθούν τμήματα με χαμηλή αναλογία πληροφορίας-θορύβου.
Ας δούμε ένα παράδειγμα:

Περνάμε ένα μπλοκ κειμένου και το μοντέλο επιστρέφει μια περίληψη. Αλλά η λειτουργία σε μια κονσόλα δεν είναι πολύ βολική. Ας κάνουμε λοιπόν το Google Docs να συνοψίζει το επιλεγμένο τμήμα κειμένου με αυτόν τον τρόπο.
Στόχος μας είναι να δημιουργήσουμε ένα βολικό μενού, ώστε η περίληψη κειμένου να γίνεται αυτόματα μέσα από τα Έγγραφα Google.

Έτσι είναι δομημένο το έργο μας. Χρησιμοποιώντας το Apps Script, θα επεκτείνουμε το GUI με ένα κουμπί που θα ενεργοποιεί συναρτήσεις που επικοινωνούν με το NLP Cloud API και στη συνέχεια θα εισάγουμε το παρακάτω αποτέλεσμα.
Θα ξεκινήσουμε με την προετοιμασία μιας προσθήκης για το μενού.
Η χρήση των Google Apps Scripts για την προσθήκη προσαρμοσμένων λειτουργιών στα Έγγραφα Google είναι αρκετά εύκολη. Μπορείτε να προσαρμόσετε τη διεπαφή χρήστη με νέα μενού, πλαίσια διαλόγου και πλευρικές γραμμές. Για να δημιουργήσετε ένα σενάριο, αφού ανοίξετε τα Έγγραφα Google, επιλέξτε Εργαλεία -> Επεξεργαστής σεναρίων.
Όλα τα στοιχεία διασύνδεσης θα πρέπει να προστεθούν σε αυτή τη λειτουργία: onOpen. Εκτελείται μετά το άνοιγμα του εγγράφου και μας επιτρέπει να προσθέσουμε το μενού.
function onOpen() {
var ui = DocumentApp.getUi();
ui.createMenu('Text Summarizer')
.addItem('Summarize selection', 'summarizeSelection')
.addToUi();
}
function summarizeSelection() {
// summarization function
}
Μετά την αποθήκευση του σεναρίου και την ανανέωση των εγγράφων, θα πρέπει να βρείτε το νέο στοιχείο μενού "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!');
}
}
Για να δοκιμάσετε τη λειτουργικότητα, απλώς επιλέξτε ένα τμήμα κειμένου στα Έγγραφα και επιλέξτε 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.

Σας ευχαριστώ για την ανάγνωση. Ελπίζω να σας άρεσε να διαβάζετε όσο μου άρεσε να το γράφω αυτό για εσάς.