Serveur d'impression

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets – Bien choisir son serveur d impression

Le 14 mars 2020 - 20 minutes de lecture

Dans les articles précédents, nous avons appris à effectuer une classification d'intention avancée, optimisée par BERT, en Python.

Nous avons également appris à remplir automatiquement Google Sheets en Python.

Ne serait-il pas intéressant de pouvoir effectuer notre classification d'intentions directement dans Google Sheets?

C'est exactement ce que nous ferons ici!

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets "width =" 640 "height =" 380 "tailles =" (largeur maximale: 640 px) 100vw, 640px "data-src =" https://cdn.searchenginejournal.com/wp -content / uploads / 2020/03 / intention-googlsheets-5e69509b695b5.gif

Présentation du script Google Apps

Une limitation des fonctions intégrées dans Google Sheets est qu'elle vous limite à un comportement prédéfini.

La bonne nouvelle est que vous pouvez définir des fonctions personnalisées avec un nouveau comportement si vous pouvez les coder vous-même dans Google Apps Script.

Le script Google Apps est basé sur JavaScript et ajoute des fonctionnalités supplémentaires qui permettent d'interagir avec Sheets, Docs et d'autres applications Google.

Nous allons définir une nouvelle fonction personnalisée nommée fetchPrediction qui prendra des mots clés dans les cellules Google Sheet et les exécutera à travers un modèle prédictif BERT pour obtenir l'intention des utilisateurs de recherche.

Voici notre plan d'action:

  • Apprenez à consulter et à mettre à jour les valeurs dans Google Sheets depuis Apps Script.
  • Entraînez-vous à extraire les résultats d'une API et remplissez une feuille avec les valeurs récupérées.
  • Entraînez notre modèle prédictif BERT en utilisant Ludwig d'Uber.
  • Utilisez Ludwig pour alimenter une API que nous pouvons appeler à partir d'Apps Script.
  • Découvrez de nouveaux outils et concepts qui nous aident à connecter les deux services ensemble.

Commençons!

Récupération des données de mots clés à partir de Google Sheets

Il s'agit d'une feuille Google vide avec des mots-clés liés aux codes-barres que nous avons extraits de SEMrush.

Dans notre premier exercice, nous lirons et imprimerons les 10 premiers mots clés de la colonne A.

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets "width =" 2110 "height =" 1058 "tailles =" (largeur maximale: 2110px) 100vw, 2110px "data-srcset =" https://cdn.searchenginejournal.com/wp -content / uploads / 2020/03 / logkeywords-5e69535490860.png 2110w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/logkeywords-5e69535490860-480x241.png 480w, https: // cdn .searchenginejournal.com / wp-content / uploads / 2020/03 / logkeywords-5e69535490860-680x341.png 680w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/logkeywords-5e69535490860-768x385. png 768w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/logkeywords-5e69535490860-1024x513.png 1024w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/ 03 / logkeywords-5e69535490860-1600x802.png 1600w "data-src =" https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/logkeywords-5e69535490860.png

Aller à Outils> Éditeur de script pour commencer.

Il s'agit d'un IDE (Integrated Development Environment) intégré pour Google Sheets.

Nous allons écrire une simple fonction JavaScript appelée logKeywords qui lira tous les mots-clés de notre fiche et les connectera à la console.

Veuillez vous référer à la documentation officielle ici.

fonction logKeywords () 
  var sheet = SpreadsheetApp.getActiveSheet ();
  var data = sheet.getDataRange (). getValues ​​();
  
  pour (var i = 0; i <data.length; i ++) 
      console.log ('Mot-clé:' + données[i][0]);
  

Passons en revue la fonction, étape par étape.

Nous obtenons d'abord une référence à la feuille active, dans ce cas, il est Sheet1.

Si vous comparez ce code à celui que nous avons écrit en Python, vous verrez quelques avantages.

  • Nous n'avions pas besoin de nous authentifier.
  • Nous n'avions pas besoin d'ouvrir la feuille de calcul.

Aller à Affichage> Journalisation Stackdriver. Là, vous obtiendrez un lien vers le tableau de bord des scripts d'applications. Cliquez dessus pour voir les journaux de la console.

C'est une bonne idée de garder cette page dans un autre onglet, car vous vous y référerez souvent comme votre code et vous voudrez voir si les changements ont fonctionné.

Vous verrez la dernière entrée de journal en haut de la liste. Cliquez dessus et vous verrez quelque chose comme la capture d'écran ci-dessus.

Maintenant, nous avons imprimé plus de 100 lignes, ce qui a pris un peu de temps. Lorsque vous écrivez et testez votre code, il est préférable de travailler avec des listes plus petites.

Nous pouvons faire un simple changement dans la boucle pour résoudre ce problème.

fonction logKeywords () {
  var sheet = SpreadsheetApp.getActiveSheet ();
  var data = sheet.getDataRange (). getValues ​​();
  
  // pour (var i = 0; i <data.length; i ++) 
  pour (var i = 0; i <10; i ++) 
      
    console.log ('Mot-clé:' + données[i][0]);
  

Notez que j'ai codé en dur la valeur dix comme limite et a laissé un commentaire avec le bon code.

Je préfère commenter les modifications de code au lieu de les supprimer, car il sera plus facile de revenir en arrière lorsque je serai prêt à publier pour une utilisation en production.

Lorsque vous exécutez cela, non seulement il s'exécute plus rapidement, mais la vérification du journal est également beaucoup plus rapide.

Ajouter une colonne avec des ID de mot clé

Ensuite, apprenons à ajouter des données à la feuille.

Nous allons écrire une nouvelle fonction nommée addIDtoKeywords. Il crée une colonne avec un ID numérique par mot clé.

Il n'y a pas beaucoup de valeur à faire cela, mais cela devrait vous aider à tester la technique avec quelque chose de super simple.

Voici le code pour le faire.

fonction addIDtoKeywords () 
  var sheet = SpreadsheetApp.getActiveSheet ();
  var data = sheet.getRange ("B1");

  // construire une liste de valeurs
  
  valeurs var = [];
  
  // nombre de mots clés
  longueur = 100;
  
  pour (var i = 1; i <= longueur + 1; i ++) 
    
    values.push ([i]);
  
  
  console.log (values.length);

  // Mettre à jour la colonne de la feuille avec les valeurs calculées
  var colonne = sheet.getRange ("B2: B102");
  

  column.setValues ​​(valeurs);
  

Sélectionnez cette fonction dans le menu déroulant et cliquez sur le bouton de lecture pour exécuter.

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets "width =" 2316 "height =" 1580 "tailles =" (max-width: 2316px) 100vw, 2316px "data-srcset =" https://cdn.searchenginejournal.com/wp -content / uploads / 2020/03 / addids-5e6956d04ca67.png 2316w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/addids-5e6956d04ca67-480x327.png 480w, https: // cdn .searchenginejournal.com / wp-content / uploads / 2020/03 / addids-5e6956d04ca67-680x464.png 680w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/addids-5e6956d04ca67-768x524. png 768w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/addids-5e6956d04ca67-1024x699.png 1024w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/ 03 / addids-5e6956d04ca67-1600x1092.png 1600w "data-src =" https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/addids-5e6956d04ca67.png

Vous devriez obtenir une nouvelle colonne dans la feuille avec des nombres en ordre croissant.

Nous pouvons également ajouter un en-tête de colonne en gras nommé ID de mot clé en utilisant le code suivant.

    data.setValue ("ID de mot clé");
 data.setFontWeight ("gras");

Voici à quoi ressemble la sortie mise à jour.

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets "width =" 2682 "height =" 1580 "tailles =" (largeur maximale: 2682px) 100vw, 2682px "data-srcset =" https://cdn.searchenginejournal.com/wp -content / uploads / 2020/03 / keywordid-5e695748d849c.png 2682w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/keywordid-5e695748d849c-480x283.png 480w, https: // cdn .searchenginejournal.com / wp-content / uploads / 2020/03 / keywordid-5e695748d849c-680x401.png 680w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/keywordid-5e695748d849c-768x452. png 768w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/keywordid-5e695748d849c-1024x603.png 1024w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/ 03 / keywordid-5e695748d849c-1600x943.png 1600w "data-src =" https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/keywordid-5e695748d849c.png

C'est un code très similaire. Examinons les modifications.

J'ai ajouté un tableau JavaScript nommé valeurs pour contenir les ID de mot clé.

Pendant la boucle, j'ai ajouté une ligne pour ajouter chaque ID généré dans la boucle au tableau.

values.push ([i]);

J'ai imprimé la longueur du tableau de valeurs à la fin de la boucle pour m'assurer que le nombre correct d'ID a été généré.

Enfin, je dois obtenir les valeurs de la feuille.

    var colonne = sheet.getRange ("B2: B102");

Ce code sélectionne les cellules correctes à remplir, puis je peux simplement définir leur valeur à l'aide de la liste que j'ai générée.

    column.setValues ​​(valeurs);

Ça ne peut pas être plus simple que ça!

Récupération des résultats de l'API à partir du script d'applications

Dans le prochain exercice, nous apprendrons à effectuer des requêtes API à partir d'Apps Script.

Je vous recommande de suivre ce codelab de Google pour vous familiariser avec certains des concepts les plus avancés.

Nous allons adapter le code de l'étape 11 qui extrait les données d'une API Books.

Au lieu de récupérer des livres, nous traduirons des mots clés à l'aide de l'API Google Translate.

Maintenant, nous commençons à écrire du code plus utile!

Voici une nouvelle fonction nommée fetchTranslation basé sur un code adapté de l'étape 11.

fonction fetchTranslation (TEXT) 
  API_KEY = "SAISIR VOTRE CLÉ API";

  TEXT = encodeURI (TEXT); // "Je m'appelle Steve" -> "Mon% 20nom% 20is% 20Steve";
  
  var url = `https://translation.googleapis.com/language/translate/v2?target=es&key=$ API_KEY & q = $ TEXT`;
      
  //console.log(url);
  
  var response = UrlFetchApp.fetch (url, 'muteHttpExceptions': true);
  
  var json = response.getContentText ();
  
  //console.log(json);
  
  translation = JSON.parse (json);
  
  retourner la traduction["data"]["translations"][0]["translatedText"];
  

Cette fonction prend un texte d'entrée, le code et l'insère dans une URL d'API pour appeler le service Google Translate.

Il y a une clé API que nous devons obtenir et nous devons également activer le service de traduction. Je recommande également de restreindre l'API à l'adresse IP que vous utilisez pour tester pendant le développement.

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets "width =" 2682 "height =" 1580 "tailles =" (largeur maximale: 2682px) 100vw, 2682px "data-srcset =" https://cdn.searchenginejournal.com/wp -content / uploads / 2020/03 / api_key-5e6959947a48d.png 2682w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/api_key-5e6959947a48d-480x283.png 480w, https: // cdn .searchenginejournal.com / wp-content / uploads / 2020/03 / api_key-5e6959947a48d-680x401.png 680w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/api_key-5e6959947a48d-768x452. png 768w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/api_key-5e6959947a48d-1024x603.png 1024w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/ 03 / api_key-5e6959947a48d-1600x943.png 1600w "data-src =" https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/api_key-5e6959947a48d.png

Une fois que nous avons l'URL de l'API à appeler, c'est aussi simple que d'appeler ce code.

        var response = UrlFetchApp.fetch (url, 'muteHttpExceptions': true);

Les lignes suivantes nous obtiennent la réponse au format JSON et après un peu de navigation dans l'arborescence JSON, nous obtenons le texte traduit.

Comme vous pouvez le voir dans mon code, j'aime enregistrer presque toutes les étapes du code sur la console pour confirmer qu'il fait ce que j'attends.

Voici un exemple de la façon dont j'ai trouvé la bonne séquence de chemin JSON.

//console.log(translation["data"]);

//console.log(translation["data"]["translations"]);

//console.log(translation["data"]["translations"][0]);

//console.log(translation["data"]["translations"][0]["translatedText"]);

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets "width =" 2116 "height =" 1050 "tailles =" (largeur maximale: 2116px) 100vw, 2116px "data-srcset =" https://cdn.searchenginejournal.com/wp -content / uploads / 2020/03 / fetchtranslation-5e695aaf7f0ff.png 2116w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/fetchtranslation-5e695aaf7f0ff-480x238.png 480w, https: // cdn .searchenginejournal.com / wp-content / uploads / 2020/03 / fetchtranslation-5e695aaf7f0ff-680x337.png 680w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/fetchtranslation-5e695aaf7f0ff-768x png 768w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/fetchtranslation-5e695aaf7f0ff-1024x508.png 1024w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/ 03 / fetchtranslation-5e695aaf7f0ff-1600x794.png 1600w "data-src =" https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/fetchtranslation-5e695aaf7f0ff.png

Vous pouvez voir la progression dans les journaux ici, y compris la sortie finale.

Traduction de mots clés

Comme nous avons testé la fonction et que cela fonctionne, nous pouvons créer une autre fonction pour récupérer et traduire les mots-clés de la feuille.

Nous allons construire à partir de ce que nous avons appris jusqu'à présent.

Nous appellerons cette fonction un nom super original TranslateKeywords!

fonction TranslateKeywords () 
  var sheet = SpreadsheetApp.getActiveSheet ();
  var header = sheet.getRange ("B1");

  // Ajouter une nouvelle colonne d'en-tête nommée Translation
  header.setValue ("Traduction");
  header.setFontWeight ("bold");
  
  // var keyword = "générateur de code-barres";
  var mot-clé = sheet.getRange ("A2"). getValue ();
  
  console.log (mot-clé);
  
  mot-clé traduit = fetchTranslation (mot-clé);
  
  console.log (mot-clé traduit);
  
  var data = sheet.getRange ("B2");
  
  data.setValue (mot-clé traduit);

  

Le code de cette fonction est très similaire à celui que nous avons utilisé pour définir les ID de mots clés.

La principale différence est que nous transmettons le mot-clé à notre nouveau fetchTranslation fonction et mettre à jour une seule cellule avec le résultat.

Voici à quoi cela ressemble pour notre exemple de mot clé.

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets "width =" 2672 "height =" 1584 "tailles =" (largeur maximale: 2672px) 100vw, 2672px "data-srcset =" https://cdn.searchenginejournal.com/wp -content / uploads / 2020/03 / translatekeywords-5e695b7b68c91.png 2672w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/translatekeywords-5e695b7b68c91-480x285.png 480w, https: // cdn .searchenginejournal.com / wp-content / uploads / 2020/03 / translatekeywords-5e695b7b68c91-680x403.png 680w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/translatekeywords-5e695b7b68c91-768x png 768w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/translatekeywords-5e695b7b68c91-1024x607.png 1024w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/ 03 / translatekeywords-5e695b7b68c91-1600x949.png 1600w "data-src =" https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/translatekeywords-5e695b7b68c91.png

Comme vous pouvez probablement le voir, il n'y a pas pour boucle, cela ne mettra donc à jour qu'une seule ligne / mot clé. Le premier.

Veuillez compléter le pour boucle pour obtenir la traduction de tous les mots clés comme exercice de devoirs.

Construire un modèle de classification d'intention

Passons à la création de notre service de classification des intentions que nous appellerons pour remplir les intentions des mots clés.

Dans mes précédents articles d'apprentissage approfondi, j'ai couvert Ludwig, la boîte à outils AI d'Uber.

Je l'aime beaucoup car il vous permet de créer des modèles d'apprentissage en profondeur de pointe sans écrire une seule ligne de code.

Il est également très pratique de fonctionner dans Google Colab.

Nous allons suivre les mêmes étapes que celles décrites dans cet article, cela nous donnera un puissant modèle de prédiction d'intention propulsé par BERT.

Voici un bref résumé des étapes que vous devez coller dans Google Colab (assurez-vous de sélectionner le runtime GPU!).

Veuillez vous référer à mon article pour le contexte:

% tensorflow_version 1.x

importer tensorflow en tant que tf; imprimer (tf .__ version__)

! pip installer ludwig

#upload Question_Classification_Dataset.csv et 'Question Report_Page 1_Table.csv'
à partir de fichiers d'importation google.colab

files.upload ()

importer des pandas en tant que pd
df = pd.read_csv ("Question_Classification_Dataset.csv", index_col = 0)

! wget https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip
! décompressez uncased_L-12_H-768_A-12.zip

# créer le fichier de configuration ludwig pour la classification basée sur BERT
template = "" "
input_features:
-
nom: Questions
type: texte
encodeur: bert
chemin_config: uncased_L-12_H-768_A-12 / bert_config.json
checkpoint_path: uncased_L-12_H-768_A-12 / bert_model.ckpt
prétraitement:
word_tokenizer: bert
word_vocab_file: uncased_L-12_H-768_A-12 / vocab.txt
padding_symbol: '[PAD]"
unknown_symbol: '[UNK]"
fonctions_sortie:
-
nom: Category0
type: catégorie
-
nom: Catégorie2
type: catégorie
texte:
word_sequence_length_limit: 128
formation:
batch_size: 32
learning_rate: 0,00002
"" "
avec open ("model_definition.yaml", "w") comme f:
    f.write (modèle)
! pip install bert-tensorflow

! expérience ludwig 
  --data_csv Question_Classification_Dataset.csv 
  --model_definition_file model_definition.yaml

Après avoir terminé ces étapes dans Google Colab, nous devrions obtenir un modèle prédictif de haute précision pour l'intention de recherche.

Nous pouvons vérifier les prédictions avec ce code.

test_df = pd.read_csv ("Question Report_Page 1_Table.csv")
#nous renommons Requête en Questions pour correspondre à ce que le modèle attend

predictions = model.predict (test_df.rename (colonnes = 'Requête': 'Questions'))

test_df.join (prédictions)[["Query", "Category2_predictions"]]

Nous obtenons une trame de données comme celle-ci.

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets "width =" 632 "height =" 425 "tailles =" (max-width: 632px) 100vw, 632px "data-srcset =" https://cdn.searchenginejournal.com/wp -content / uploads / 2020/03 / predictions-5e695d927953e.png 632w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/predictions-5e695d927953e-480x323.png 480w "data-src =" https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/predictions-5e695d927953e.png
Les intentions prédites ne sont pas celles que vous attendez généralement: navigation, transactionnel, informationnel, mais elles sont suffisamment bonnes pour illustrer le concept.

Veuillez consulter un article génial de Kristin Tynski qui explique comment développer ce concept pour obtenir de véritables intentions de recherche.

Transformer notre modèle en service API

Ludwig a une fonctionnalité super cool qui vous permet de servir des modèles directement en tant que service API.

La commande pour cela est Ludwig serve.

J'essayais d'accomplir la même chose en suivant un chemin super compliqué parce que je n'ai pas vérifié que quelque chose comme ça existait déjà. 🤦

Il n'est pas installé par défaut, nous devons l'installer avec cette commande.

! pip installer ludwig[serve]

Nous pouvons vérifier les options de ligne de commande avec:

! ludwig serve - aide

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets "width =" 1018 "height =" 313 "tailles =" (max-width: 1018px) 100vw, 1018px "data-srcset =" https://cdn.searchenginejournal.com/wp -content / uploads / 2020/03 / ludwig-serve-5e695eaf92e9c.png 1018w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/ludwig-serve-5e695eaf92e9c-480x148.png 480w, https : //cdn.searchenginejournal.com/wp-content/uploads/2020/03/ludwig-serve-5e695eaf92e9c-680x209.png 680w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/ ludwig-serve-5e695eaf92e9c-768x236.png 768w "data-src =" https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/ludwig-serve-5e695eaf92e9c.png

Créer une API à partir de notre modèle est aussi simple que d'exécuter cette commande.

! ludwig serve -m results / experiment_run / model

INFO: processus serveur démarré [5604]
INFO: en attente de démarrage de l'application.
INFO: démarrage de l'application terminé.
INFO: Uvicorn s'exécutant sur http://0.0.0.0:8000 (appuyez sur CTRL + C pour quitter)
INFO: arrêt
INFO: processus serveur terminé [5604]

Comme nous exécutons ce code dans le bloc-notes, nous devons utiliser une petite astuce pour pousser ce processus en arrière-plan (un thread séparé).

%% bash --bg

nohup ludwig serve -m results / experiment_run / model> debug.log 2> & 1

La commande magique %% bash –bg exécute le shellcode dans un thread séparé renvoyant le contrôle au bloc-notes afin que nous puissions exécuter du code qui peut interagir avec le service.

J'ai trouvé que c'était un truc super cool et précieux. Je présente également d'autres astuces de shell que j'ai apprises il y a de nombreuses années.

La commande nohup empêche le processus d'être tué lorsque le parent décède. C'est facultatif ici.

Le code 2> & 1 redirige l'erreur standard vers l'entrée standard et les deux sont ensuite envoyés dans le fichier debug.log. Vous pouvez en savoir plus sur cette technique ici.

Nous pouvons suivre la progression du processus d'arrière-plan à l'aide de cette commande.

! tail debug.log

Après avoir vu ce message, vous pouvez passer à l'étape suivante.

INFO: Uvicorn s'exécutant sur http://0.0.0.0:8000 (appuyez sur CTRL + C pour quitter)

Envoyons une demande d'API de test à l'aide de curl pour voir si le service fonctionne.

! curl http://0.0.0.0:8000/predict -X POST -F 'Questions = qui est le patron?'

Vous devriez récupérer cette réponse.

 "Category0_predictions": "humain", "_" Category0_probabilities: 0.00021219381596893072, "Category0_probabilities_ENTITY": 7.17515722499229e-05, "Category0_probabilities_HUMAN": ,9988889098167419, "Category0_probabilities_DESCRIPTION": ,000423480843892321, "Category0_probabilities_NUMERIC": 2.7793401386588812e-05, "Category0_probabilities_LOCATION": 0.0003020864969585091 , "Category0_probabilities_ABBREVIATION": 7.374086999334395e-05, "Category0_probability": ,9988889098167419, "Category2_predictions": "ind", "Category2_probabilities _": 8.839580550557002e-05, "Category2_probabilities_ind": 0.9759176969528198, "Category2_probabilities_other": ,0013697665417566895, "Category2_probabilities_def": 3,929347076336853 e-05, "Category2_probabilities_count": 4.732362140202895e-05, "Category2_probabilities_desc": 0.014149238355457783, "Category2_probabilities_manner": 7.225596345961094e-05, "Category2_probabilities_date": 7.537546480307356706 ": ,00042629052768461406," Category2_probabilities_gr ": ,0025540771894156933," Category2_probabilities_country ": 0,0002626778441481292," Category2_probabilities_city ": 0,0004305317997932434," Category2_probabilities_animal ": 0,00024954770924523473," Category2_probabilities_food ": 8.139225974446163e-05," Category2_probabilities_dismed ": 7.852958515286446e-05," Category2_probabilities_termeq ": ,00023714809503871948, "Category2_probabilities_period": 4.197505040792748e-05, "Category2_probabilities_money": 3.626687248470262e-05, "Category2_probabilities_exp": 5.991378566250205e-05, "Category2_probabilities_state": ,00010361814202042297, "Category2_probabilities_sport": 8.741072088014334e-05, "Category2_probabilities_event": ,00013374585250858217, "Category2_probabilities_product": 5.6306344049517065e-05, "Category2_probabilities_substance": 0.00016623239207547158, "Category2_probabilities_color": 1.9601659005274996e-05, "Category2_probabilities_techmeth": 4.7484772875_6696286 3491e-05, "Category2_probabilities_perc": 3.87108520953916e-05, "Category2_probabilities_veh": ,00011915313370991498, "Category2_probabilities_word": 0,00016430433606728911, "Category2_probabilities_title": 0,0010781479068100452, "Category2_probabilities_mount": ,00024070330255199224, "Category2_probabilities_body": 0,0001515906333224848, "Category2_probabilities_abb": 8.521509153069928e- 05, "Category2_probabilities_lang": 0,00022924368386156857, "Category2_probabilities_plant": 4.893113509751856e-05, "Category2_probabilities_volsize": ,0001462997024646029, "Category2_probabilities_symbol": 9.98345494735986e-05, "Category2_probabilities_weight": 8.899033855414018e-05, "Category2_probabilities_instru": 2.636547105794307e-05, "Category2_probabilities_letter": 3.7610192521242425e-05, "Category2_probabilities_speed": 4.142118996242061e-05, "Category2_probabilities_code": 5.926147059653886e-05, "Category2_probabilities_temp": 3.68766231986228e226e22 s_religion ": 0.00012743560364469886," Category2_probabilities_currency ": 5.8569487009663135e-05," Category2_probability ": 0.9759176969528198

Exposer notre service en utilisant Ngrok

Nous avons donc une nouvelle API qui peut faire des prédictions d'intention, mais un gros problème est qu'elle n'est accessible qu'à partir de notre bloc-notes Colab.

Permettez-moi de vous présenter un autre service sympa que j'utilise souvent, Ngrok.

Ngrok vous aide à créer des URL accessibles au public qui se connectent à un service local comme celui que nous venons de créer.

Je ne recommande pas de le faire pour une utilisation en production, mais c'est très pratique lors du développement et des tests.

Vous n'avez pas besoin de créer un compte, mais je le fais personnellement parce que je peux configurer un sous-domaine personnalisé que j'utilise très fréquemment.

Voici les étapes pour donner à notre API une URL publique à appeler depuis App Script.

! wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip && unzip ngrok-stable-linux-amd64.zip

Nous téléchargeons et décompressons d'abord ngrok.

%% bash --bg

./ngrok http -hostname = api.votredomaine.com 8000 2> ngrok.log

Le code ci-dessus indique à ngrok de se connecter au service local sur le port 8000. C'est tout ce que nous devons faire.

! curl http://api.yourdomain.com/predict -X POST -F 'Questions = qui est le patron?'

Vous pouvez confirmer que cela fonctionne en répétant l'appel curl, mais en appelant l'URL publique. Vous devriez obtenir le même résultat.

Si vous ne souhaitez pas configurer un domaine personnalisé, vous pouvez utiliser ce code à la place.

%% bash --bg

./ngrok http 8000 2> ngrok.log

Cela va générer une URL publique aléatoire et vous récupérez avec ce code.

! curl -s http: // localhost: 4040 / api / tunnels | python3 -c 

    "import sys, json; print (json.load (sys.stdin)['tunnels'][0]['public_url']) "

Maintenant, nous revenons à nos dernières étapes.

Récupération des prédictions d'intention

Nous allons adapter le code que nous avons utilisé pour effectuer les demandes d'API Google Translate afin que nous puissions faire des demandes de prédiction d'intention.

Une grande différence entre les deux services API est que nous devons effectuer des requêtes HTTP POST au lieu de requêtes HTTP GET plus simples.

Voyons comment cela change notre code et apprenons un peu plus sur HTTP dans le processus.

function fetchPrediction (question = "qui est le patron?") 
  
  TEXT = encodeURI (TEXT);
  
  console.log (TEXT);
  
  var url = "http://api.votredomaine.com/predict";
  
   var options = 
    "méthode": "POST",
    "contentType": "application / x-www-form-urlencoded",
    "charge utile": TEXTE,
    'muteHttpExceptions': vrai
  ;
        
  var response = UrlFetchApp.fetch (url, options);
  
  var json = response.getContentText ();
  
  //console.log(json);
  
  prédiction = JSON.parse (json);
  
  //console.log(prediction);

  console.log (prédiction["Category0_predictions"]);
  
  prédiction de retour["Category0_predictions"];
  

La fonction fetchPrediction appelle le service API que nous avons créé et renvoie l'intention prédite. Il reproduit essentiellement l'équivalent du boucle appelons nous avons fait Colab, mais dans Apps Script.

J'ai souligné quelques changements clés dans le code. Examinons-les.

Une différence clé entre les requêtes GET et POST est que dans les requêtes GET, les données sont transmises dans l'URL en tant que paramètres.

Dans les requêtes POST, les données sont transmises dans le corps de la requête.

Nous devons formater les données avant de les transmettre dans le corps et nous devons définir le type de contenu correct afin que le serveur sache comment les décoder.

Cette ligne encode la question que nous passons.

    TEXT = encodeURI (TEXT);

Ceci est un exemple de ce à quoi ressemble le TEXTE encodé.

Questions = label% 20generator

Le type de contenu correct pour cet encodage est application / x-www-form-urlencoded. Il s'agit du codage recommandé pour les données de formulaire HTML.

Nous créons un les options structure de données où nous spécifions ces paramètres et le type de demande correct et nous sommes prêts à partir.

Sélectionnez la fonction fetchPrediction dans le menu déroulant et cliquez sur le bouton Exécuter.

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets "width =" 2672 "height =" 1584 "tailles =" (largeur maximale: 2672px) 100vw, 2672px "data-srcset =" https://cdn.searchenginejournal.com/wp -content / uploads / 2020/03 / intention-logs-5e6965565b0b1.png 2672w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/intent-logs-5e6965565b0b1-480x285.png 480w, https : //cdn.searchenginejournal.com/wp-content/uploads/2020/03/intent-logs-5e6965565b0b1-680x403.png 680w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/ intention-logs-5e6965565b0b1-768x455.png 768w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/intent-logs-5e6965565b0b1-1024x607.png 1024w, https: //cdn.searchenginejournal. com / wp-content / uploads / 2020/03 / intention-logs-5e6965565b0b1-1600x949.png 1600w "data-src =" https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/intent- logs-5e6965565b0b1.png

Vous devriez voir l'entrée codée et l'intention prévue dans les journaux.

Comment obtenir les intentions de tous les mots clés de la feuille?

Vous pensez peut-être que nous allons créer une autre fonction qui lira les mots clés en boucle et remplira les intentions. Pas du tout!

On peut simplement appeler cette fonction par son nom directement depuis la feuille! À quel point cela est cool?

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets "width =" 2672 "height =" 1584 "tailles =" (largeur maximale: 2672px) 100vw, 2672px "data-srcset =" https://cdn.searchenginejournal.com/wp -content / uploads / 2020/03 / fetchintent-5e696709258a2.png 2672w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/fetchintent-5e696709258a2-480x285.png 480w, https: // cdn .searchenginejournal.com / wp-content / uploads / 2020/03 / fetchintent-5e696709258a2-680x403.png 680w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/fetchintent-5e696709258a2-768x455. png 768w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/fetchintent-5e696709258a2-1024x607.png 1024w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/ 03 / fetchintent-5e696709258a2-1600x949.png 1600w "data-src =" https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/fetchintent-5e696709258a2.png

Ressources pour en savoir plus

La combinaison de fonctions de script d'application simples avec de puissants backends d'API que vous pouvez coder dans n'importe quelle langue ouvre les portes à des hacks de productivité infinis.

Voici quelques-unes des ressources que j'ai lues en rassemblant ces informations.

Enfin, permettez-moi de souligner un projet très important et précieux qui JR Oakes commencé.

Classification automatisée des intentions à l'aide du Deep Learning dans Google Sheets "width =" 1538 "height =" 1054 "tailles =" (largeur maximale: 1538px) 100vw, 1538px "data-srcset =" https://cdn.searchenginejournal.com/wp -content / uploads / 2020/03 / icodeseo-5e6970e5defe8.png 1538w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/icodeseo-5e6970e5defe8-480x329.png 480w, https: // cdn .searchenginejournal.com / wp-content / uploads / 2020/03 / icodeseo-5e6970e5defe8-680x466.png 680w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/icodeseo-5e6970e5defe8-768x526. png 768w, https://cdn.searchenginejournal.com/wp-content/uploads/2020/03/icodeseo-5e6970e5defe8-1024x702.png 1024w "data-src =" https://cdn.searchenginejournal.com/wp-content /uploads/2020/03/icodeseo-5e6970e5defe8.png

C'est un référentiel génial pour les projets Python et JavaScript des codeurs de la communauté SEO. Je prévois de trouver du temps pour télécharger mes extraits de code, veuillez vous assurer de contribuer le vôtre.

Pour une raison quelconque, ce non-problème continue d'apparaître dans mon flux Twitter. Je vais laisser ce tweet ici comme un rappel amical. ✌️

Davantage de ressources:


Crédits d'image

Toutes les captures d'écran prises par l'auteur, mars 2020

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.