Clasificación de intención automatizada mediante el aprendizaje profundo en las hojas de cálculo de Google

Clasificación de intención automatizada mediante el aprendizaje profundo en las hojas de cálculo de Google

marzo 13, 2020 0 Por admin


En artículos anteriores, aprendimos cómo realizar una clasificación de intención avanzada, impulsada por BERT, en Python.

También aprendimos cómo completar automáticamente las Hojas de cálculo de Google en Python.

¿No sería bueno poder realizar nuestra clasificación de intención directamente en Hojas de cálculo de Google?

¡Esto es exactamente lo que haremos aquí!

Clasificación de intención automatizada mediante el aprendizaje profundo en las hojas de cálculo de Google "width =" 640 "height =" 380 "tamaños =" (ancho máximo: 640px) 100vw, 640px "src =" https: // cdn. seoconsem.com/wp-content /uploads/2020/03/intent-googlsheets-5e69509b695b5.gif

Presentación de la secuencia de comandos de Google Apps

Una limitación de las funciones integradas en Hojas de cálculo de Google es que lo limita a un comportamiento predefinido.

La buena noticia es que puede definir funciones personalizadas con un nuevo comportamiento si puede codificarlas usted mismo en Google Apps Script.

El script de Google Apps se basa en JavaScript y agrega funcionalidades adicionales que permiten la interacción con Hojas de cálculo, Documentos y otras aplicaciones de Google.

Vamos a definir una nueva función personalizada llamada fetchPrediction que tomará palabras clave de las celdas de Google Sheet y las ejecutará a través de un modelo predictivo BERT para obtener la intención de los usuarios de búsqueda.

Aquí está nuestro plan de acción:

  • Aprenda a ver y actualizar valores en Hojas de cálculo de Google desde Apps Script.
  • Practique extraer los resultados de una API y complete una hoja con los valores recuperados.
  • Entrene nuestro modelo predictivo BERT con Ludwig de Uber.
  • Use Ludwig para completar una API a la que podemos llamar desde Apps Script.
  • Descubra nuevas herramientas y conceptos que nos ayudan a conectar los dos servicios.

¡Empecemos!

Recuperando datos de palabras clave de Hojas de cálculo de Google

Es una hoja de Google vacía con palabras clave relacionadas con códigos de barras que hemos extraído de SEMrush.

En nuestro primer ejercicio, leeremos e imprimiremos las primeras 10 palabras clave en la columna A.

Clasificación automatizada de intenciones usando Deep Learning en Hojas de cálculo de Google "width =" 2110 "height =" 1058 "tallas =" (ancho máximo: 2110px) 100vw, 2110px "srcset =" https: // cdn. seoconsem.com/wp-content /uploads/2020/03/logkeywords-5e69535490860.png 2110w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/logkeywords-5e69535490860-480x241.png 480w, https: //cdn.seoconsem .com / wp-content / uploads / 2020/03 / logkeywords-5e69535490860-680x341.png 680w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/logkeywords -5e69535490860-768x385.png 768w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/logkeywords-5e69535490860-1024x513.png 1024w, https://cdn.seoconsem.com/wp-content / uploads / 2020/03 / logkeywords-5e69535490860-1600x802.png 1600w "src =" https://cdn.seoconsem.com/wp-content/uploads/2020/03/logkeywords-5e69535490860.png

Ir a Herramientas> Editor de secuencias de comandos para empezar.

Es un IDE (Entorno de desarrollo integrado) integrado para Hojas de cálculo de Google.

Vamos a escribir una función simple de JavaScript llamada logKeywords que leerá todas las palabras clave de nuestro archivo y las conectará a la consola.

Consulte la documentación oficial aquí.

función logKeywords () {
var sheet = SpreadsheetApp.getActiveSheet ();
datos var = sheet.getDataRange (). getValues ​​();

para (var i = 0; i <data.length; i ++) {
console.log (& # 39; Palabra clave: & # 39; + datos (i) (0));
}
}

Veamos la función paso a paso.

Primero obtenemos una referencia a la hoja activa, en este caso es Hoja1.

Si compara este código con el que escribimos en Python, verá algunas ventajas.

  • No necesitábamos autenticarnos.
  • No necesitábamos abrir la hoja de cálculo.

Ir a Ver> Registro de Stackdriver. Allí obtendrá un enlace al panel de scripts de la aplicación. Haga clic en él para ver los registros de la consola.

Es una buena idea mantener esta página en otra pestaña, ya que a menudo se referirá a ella como su código y querrá ver si los cambios han funcionado.

Verá la última entrada de registro en la parte superior de la lista. Haga clic en él y verá algo como la captura de pantalla anterior.

Ahora hemos impreso más de 100 líneas, lo que llevó un poco de tiempo. Al escribir y probar su código, es mejor trabajar con listas más pequeñas.

Podemos hacer un cambio simple en el bucle para solucionar este problema.

función logKeywords () {
var sheet = SpreadsheetApp.getActiveSheet ();
datos var = sheet.getDataRange (). getValues ​​();

// para (var i = 0; i <data.length; i ++) {
para (var i = 0; i <10; i ++) {

console.log (& # 39; Palabra clave: & # 39; + datos (i) (0));
}
}

Tenga en cuenta que he codificado el valor diez como límite y dejó un comentario con el código correcto.

Prefiero comentar sobre los cambios de código en lugar de eliminarlos, ya que será más fácil regresar cuando esté listo para publicar para uso de producción.

Cuando ejecuta esto, no solo se ejecuta más rápido, sino que la comprobación del registro también es mucho más rápida.

Agregar columna con ID de palabras clave

A continuación, aprendamos cómo agregar datos a la hoja.

Vamos a escribir una nueva función llamada addIDtoKeywords. Crea una columna con una identificación numérica por palabra clave.

Hacer esto no tiene mucho valor, pero debería ayudarte a probar la técnica con algo súper simple.

Aquí está el código para hacerlo.

Función addIDtoKeywords () {
var sheet = SpreadsheetApp.getActiveSheet ();
datos var = sheet.getRange ("B1");

// crea una lista de valores

valores var = ();

// número de palabras clave
longitud = 100;

para (var i = 1; i <= longitud + 1; i ++) {

valores.push ((i));
}

console.log (values.length);

// Actualiza la columna de la hoja con los valores calculados
var columna = sheet.getRange ("B2: B102");


column.setValues ​​(valores);

}

Seleccione esta función en el menú desplegable y haga clic en el botón de reproducción para ejecutar.

Clasificación de intención automatizada mediante el aprendizaje profundo en las hojas de cálculo de Google "width =" 2316 "height =" 1580 "tallas =" (ancho máximo: 2316px) 100vw, 2316px "srcset =" https: //cdn.seoconsem .com / wp-content /uploads/2020/03/addids-5e6956d04ca67.png 2316w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/addids-5e6956d04ca67-480x327.png 480w, https : //cdn.seoconsem .com / wp-content / uploads / 2020/03 / addids-5e6956d04ca67-680x464.png 680w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/addids- 5e6956d04ca67-768x524.png 768w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/addids-5e6956d04ca67-1024x699.png 1024w, https://cdn.seoconsem.com/wp-content uploads / 2020/03 / addids-5e6956d04ca67-1600x1092.png 1600w "src =" https://cdn.seoconsem.com/wp-content/uploads/2020/03/addids-5e6956d04ca67.png

Debería obtener una nueva columna en la hoja con números en orden ascendente.

También podemos agregar un encabezado de columna en negrita llamado ID de palabra clave usando el siguiente código.

    data.setValue ("ID de palabra clave");
data.setFontWeight ("negrita");

Así es como se ve la salida actualizada.

Clasificación de intención automatizada mediante el aprendizaje profundo en las hojas de cálculo de Google "width =" 2682 "height =" 1580 "tallas =" (ancho máximo: 2682px) 100vw, 2682px "srcset =" https: // cdn. seoconsem.com/wp-content /uploads/2020/03/keywordid-5e695748d849c.png 2682w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/keywordid-5e695748d849c-480x283.png 480w, https: //cdn.seoconsem .com / wp-content / uploads / 2020/03 / keywordid-5e695748d849c-680x401.png 680w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/keywordid -5e695748d849c-768x452.png 768w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/keywordid-5e695748d849c-1024x603.png 1024w, https://cdn.seoconsem.com/wp-content / uploads / 2020/03 / keywordid-5e695748d849c-1600x943.png 1600w "src =" https://cdn.seoconsem.com/wp-content/uploads/2020/03/keywordid-5e695748d849c.png

Es un código muy similar. Echemos un vistazo a los cambios.

Agregué una matriz de JavaScript llamada valores para contener las ID de palabras clave.

Durante el ciclo, agregué una línea para agregar cada ID generado en el ciclo a la tabla.

valores.push ((i));

Imprimí la longitud de la matriz de valores al final del ciclo para asegurarme de que se haya generado el número correcto de ID.

Finalmente, necesito obtener los valores de la hoja.

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

Este código selecciona las celdas correctas para llenar, luego puedo establecer su valor usando la lista que generé.

    column.setValues ​​(valores);

¡No podría ser más simple que eso!

Recuperando resultados de API del script de la aplicación

En el próximo ejercicio, aprenderemos cómo realizar solicitudes de API desde Apps Script.

Le recomiendo que siga este codelab de Google para familiarizarse con algunos de los conceptos más avanzados.

Adaptaremos el código del paso 11 que extrae los datos de un API Books.

En lugar de recuperar libros, traduciremos las palabras clave con la API de Google Translate.

¡Ahora comencemos a escribir código más útil!

Aquí hay una nueva función llamada fetchTranslation basado en un código adaptado del paso 11.

función fetchTranslation (TEXTO) {
API_KEY = "INGRESE SU CLAVE API";

TEXTO = encodeURI (TEXTO); // "Mi nombre es Steve" -> "Mi% 20name% 20is% 20Steve";

var url = `https://translation.googleapis.com/language/translate/v2?target=es&key=$ {API_KEY} & q = $ {TEXT}`;

//console.log(url);

respuesta var = UrlFetchApp.fetch (url, {& # 39; muteHttpExceptions & # 39;: true});

var json = response.getContentText ();

//console.log(json);

traducción = JSON.parse (json);

devolver la traducción ("datos") ("traducciones") (0) ("TransledText");

}

Esta función toma texto de entrada, código y lo inserta en una URL de API para llamar al servicio Google Translate.

Hay una clave API que debemos obtener y también debemos activar el servicio de traducción. También recomiendo restringir la API a la dirección IP que usa para probar durante el desarrollo.

Clasificación de intención automatizada mediante el aprendizaje profundo en las hojas de cálculo de Google "width =" 2682 "height =" 1580 "tallas =" (ancho máximo: 2682px) 100vw, 2682px "srcset =" https: // cdn. seoconsem.com/wp-content /uploads/2020/03/api_key-5e6959947a48d.png 2682w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/api_key-5e6959947a48d-480x283.png 480w, https: //cdn.seoconsem .com / wp-content / uploads / 2020/03 / api_key-5e6959947a48d-680x401.png 680w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/api_key -5e6959947a48d-768x452.png 768w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/api_key-5e6959947a48d-1024x603.png 1024w, https://cdn.seoconsem.com/wp-cent / uploads / 2020/03 / api_key-5e6959947a48d-1600x943.png 1600w "src =" https://cdn.seoconsem.com/wp-content/uploads/2020/03/api_key-5e6959947a48d.png

Una vez que tenemos la URL de API para llamar, es tan simple como llamar a este código.

        respuesta var = UrlFetchApp.fetch (url, {& # 39; muteHttpExceptions & # 39;: true});

Las siguientes líneas nos dan la respuesta en formato JSON y después de un poco de navegación en el árbol JSON obtenemos el texto traducido.

Como puede ver en mi código, me gusta guardar casi todos los pasos del código en la consola para confirmar que está haciendo lo que esperaba.

Aquí hay un ejemplo de cómo encontré la secuencia de ruta JSON correcta.

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

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

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

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

Clasificación de intención automatizada mediante el aprendizaje profundo en las hojas de cálculo de Google "width =" 2116 "height =" 1050 "tallas =" (ancho máximo: 2116px) 100vw, 2116px "srcset =" https: // cdn. seoconsem.com/wp-content /uploads/2020/03/fetchtranslation-5e695aaf7f0ff.png 2116w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/fetchtranslation-5e695aaf7f0ff-480x238.png 480 https: //cdn.searchengine .com / wp-content / uploads / 2020/03 / fetchtranslation-5e695aaf7f0ff-680x337.png 680w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/fetchtranslation -5e695aaf7f0ff-768x381.png 768, https://cdn.seoconsem.com/wp-content/uploads/2020/03/fetchtranslation-5e695aaf7f0ff-1024x508.png 1024w, https://cdn.seoconsem.com/wp-ont / uploads / 2020/03 / fetchtranslation-5e695aaf7f0ff-1600x794.png 1600w "src =" https://cdn.seoconsem.com/wp-content/uploads/2020/03/fetchtranslation-5e695aaf7f0ff.png

Puede ver el progreso en los registros aquí, incluida la versión final.

Traducción de palabras clave

A medida que probamos la función y funciona, podemos crear otra función para recuperar y traducir las palabras clave de la hoja.

Nos basaremos en lo que hemos aprendido hasta ahora.

Llamaremos a esta función un nombre super original TranslateKeywords!

Función TranslateKeywords () {
var sheet = SpreadsheetApp.getActiveSheet ();
encabezado var = sheet.getRange ("B1");

// Agregar una nueva columna de encabezado llamada Traducción
header.setValue ("Traducción");
header.setFontWeight ("negrita");

// var keyword = "generador de código de barras";
palabra clave var = sheet.getRange ("A2"). getValue ();

console.log (palabra clave);

palabra clave traducida = fetchTranslation (palabra clave);

console.log (palabra clave traducida);

datos var = sheet.getRange ("B2");

data.setValue (palabra clave traducida);


}

El código para esta función es muy similar al que usamos para definir las ID de palabras clave.

La principal diferencia es que pasamos la palabra clave a nuestro nuevo fetchTranslation funcionar y actualizar una sola celda con el resultado.

Esto es lo que parece para nuestro ejemplo de palabras clave.

Clasificación de intención automatizada mediante el aprendizaje profundo en las hojas de cálculo de Google "width =" 2672 "height =" 1584 "tallas =" (ancho máximo: 2672px) 100vw, 2672px "srcset =" https: //cdn.seoconsem .com / wp-content /uploads/2020/03/translatekeywords-5e695b7b68c91.png 2672w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/translatekeywords-5e695b7b68c91-480x285.png 480w, https : //cdnal.search .com / wp-content / uploads / 2020/03 / translatekeywords-5e695b7b68c91-680x403.png 680w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/translatekeywords- 5e695b7b68c91-768x455.png, https://cdn.seoconsem.com/wp-content/uploads/2020/03/translatekeywords-5e695b7b68c91-1024x607.png 1024w, https://cdn.seoconsem.com/wp-content / 2020/03 / translatekeywords-5e695b7b68c91-1600x949.png 1600w "src =" https://cdn.seoconsem.com/wp-content/uploads/2020/03/translatekeywords-5e695b7b68c91.png

Como probablemente pueda ver, no hay para bucle, por lo que esto solo actualizará una línea / palabra clave. El primero.

Por favor complete el para bucle para obtener la traducción de todas las palabras clave como un ejercicio de tarea.

Construir un modelo de clasificación intencional

Pasemos a la creación de nuestro servicio de clasificación de intenciones al que llamaremos para completar las intenciones de las palabras clave.

En mis artículos anteriores de aprendizaje profundo, cubrí Ludwig, el kit de herramientas de IA de Uber.

Me gusta mucho porque te permite crear modelos de aprendizaje profundo de vanguardia sin escribir una sola línea de código.

También es muy conveniente trabajar en Google Colab.

Vamos a seguir los mismos pasos que se describen en este artículo, esto nos dará un poderoso modelo de predicción de intenciones impulsado por BERT.

Aquí hay un breve resumen de los pasos que debe pegar en Google Colab (¡asegúrese de seleccionar el tiempo de ejecución de la GPU!).

Consulte mi artículo para el contexto:

% tensorflow_version 1.x

importar tensorflow como tf; print (tf .__ version__)

! pip install ludwig

#upload Question_Classification_Dataset.csv y & # 39; Question Report_Page 1_Table.csv & # 39;
de los archivos de importación de google.colab

files.upload ()

importar pandas como 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
! descomprimir uncased_L-12_H-768_A-12.zip

# crea el archivo de configuración ludwig para la clasificación basada en BERT
plantilla = "" "
input_features:
-
nombre: Preguntas
tipo: texto
codificador: bert
config_path: uncased_L-12_H-768_A-12 / bert_config.json
checkpoint_path: uncased_L-12_H-768_A-12 / bert_model.ckpt
pretratamiento:
word_tokenizer: bert
word_vocab_file: uncased_L-12_H-768_A-12 / vocab.txt
padding_symbol: & # 39; (PAD) & # 39;
símbolo_desconocido: & # 39; (UNK) & # 39;
funciones_salida:
-
nombre: Categoría0
tipo: categoría
-
nombre: Categoría2
tipo: categoría
texto:
word_sequence_length_limit: 128
entrenamiento:
tamaño del lote: 32
tasa de aprendizaje: 0.00002
"" "
con abierto ("model_definition.yaml", "w") como f:
f.write (modelo)
! pip install bert-tensorflow

! Ludwig  experiencia
--data_csv Question_Classification_Dataset.csv 
--model_definition_file model_definition.yaml

Después de completar estos pasos en Google Colab, deberíamos obtener un modelo predictivo de alta precisión para la intención de investigación.

Podemos verificar las predicciones con este código.

test_df = pd.read_csv ("Pregunta Informe_Página 1_Table.csv")
# cambiamos el nombre de Solicitud de preguntas para que coincida con lo que el modelo espera

predicciones = model.predict (test_df.rename (columnas = {& # 39; Consulta & # 39;: & # 39; Preguntas & # 39;}))

test_df.join (predicciones) (("Consulta", "Categoría2_predicciones"))

Obtenemos un marco de datos como este.

Clasificación automatizada de intenciones usando Deep Learning en Hojas de cálculo de Google "width =" 632 "height =" 425 "tallas =" (ancho máximo: 632px) 100vw, 632px "srcset =" https: // cdn. seoconsem.com/wp-content /uploads/2020/03/predictions-5e695d927953e.png 632w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/predictions-5e695d927953e-480x323.png 480w " src = "https: // cdn.seoconsem.com/wp-content/uploads/2020/03/predictions-5e695d927953e.png
Las intenciones predichas no son lo que generalmente espera: navegación, transacciones, información, pero son lo suficientemente buenas como para ilustrar el concepto.

Consulte un artículo impresionante de Kristin Tynski sobre cómo desarrollar este concepto para obtener verdaderas intenciones de investigación.

Transformando nuestro modelo en un servicio API

Ludwig tiene una característica súper genial que le permite servir plantillas directamente como un servicio API.

El orden para esto es servir a Ludwig.

Estaba tratando de lograr lo mismo siguiendo un camino súper complicado porque no comprobé que algo así ya existiera. ????

No está instalado de manera predeterminada, necesitamos instalarlo con este comando.

! pip install ludwig (servir)

Podemos verificar las opciones de línea de comando con:

! ludwig serve - ayuda

Clasificación de intención automatizada mediante el aprendizaje profundo en las hojas de cálculo de Google "width =" 1018 "height =" 313 "tallas =" (ancho máximo: 1018px) 100vw, 1018px "srcset =" https: // cdn. seoconsem.com/wp-content /uploads/2020/03/ludwig-serve-5e695eaf92e9c.png 1018w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/ludwig-serve-5e695eaf92e9c-480x148 .png 480w, https: / /cdn.seoconsem.com/wp-content/uploads/2020/03/ludwig-serve-5e695eaf92e9c-680x209.png 680w, https://cdn.seoconsem.com/wp-content/uploads / 2020/03 / ludwig- serve-5e695eaf92e9c-768x236.png 768w "src =" https://cdn.seoconsem.com/wp-content/uploads/2020/03/ludwig-serve-5e695eaf92e9c.png

Crear una API a partir de nuestra plantilla es tan simple como ejecutar este comando.

! ludwig serve -m resultados / experiment_run / model

INFORMACIÓN: proceso del servidor iniciado (5604)
INFORMACIÓN: esperando para iniciar la aplicación.
INFORMACIÓN: inicio de la aplicación terminado.
INFORMACIÓN: Uvicorn ejecutándose en http://0.0.0.0:8000 (presione CTRL + C para salir)
INFORMACIÓN: detente
INFORMACIÓN: proceso del servidor completado (5604)

A medida que ejecutamos este código en el Bloc de notas, necesitamos usar un pequeño truco para llevar este proceso a un segundo plano (un hilo separado).

%% bash --bg

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

El comando mágico %% bash –bg ejecuta shellcode en un hilo separado que devuelve el control al bloc de notas para que podamos ejecutar código que pueda interactuar con el servicio.

Me pareció una cosa súper genial y preciosa. También presento otros trucos de shell que aprendí hace muchos años.

El comando nohup evita que el proceso se elimine cuando el padre muere. Es opcional aquí.

El código 2> y 1 redirige el error estándar a la entrada estándar y ambos se envían al archivo debug.log. Puedes leer más sobre esta técnica aquí.

Podemos seguir el progreso del proceso en segundo plano usando este comando.

! tail debug.log

Después de ver este mensaje, puede continuar con el siguiente paso.

INFORMACIÓN: Uvicorn ejecutándose en http://0.0.0.0:8000 (presione CTRL + C para salir)

Enviemos una solicitud de API de prueba usando curl para ver si el servicio está funcionando.

! curl http://0.0.0.0:8000/predict -X POST -F & # 39; Preguntas = ¿quién es el jefe? & # 39;

Deberías obtener esta respuesta.

{"Category0_predictions": "humano", "_" Category0_probabilities: 0.00021219381596893072, "Category0_probabilities_ENTITY": 7.17515722499229e-05, "Category0_probabilities_HUMAN" :, 9988889098167419, "Category0_probabilities_DUCC08" "" Category0_probabilities_DUCC08 "" ": 0.0003020864969585091," Categoría0_probabilidades_ABBREVIACIÓN ": 7.374086999334395e-05," Categoría0_probabilidad ":, 9988889098167419," Categoría2_predicciones ":" ind "," Categoría2_probabilidades _ ":" 8.83958055055: "9_9" , "Category2_probabilities_def": 3.929347076336853 e-05, "Category2_probabilities_count": 4.732362140202895e-05, "Category2_probabilities_desc": 0.014149238355457783, "Category2_probabilities_manner": 7.22559634596330_30 ": 07:25. gr ":, 0025540771894156933," Category2_probabilities_country ": ,0002626778441481292," Category2_probabilities_city ": ,0004305317997932434," Category2_probabilities_animal ": ,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," Categoría2_probabilidades_producto ": 5.6306344049517065e-05," Categoría2_probabilidades_sustancia ": 0.00016623239207547158," Categoría2_probabilities_color ": 1.960165900527499_e_prob": 34 "; 34 6º-05, "Category2_probabilities_veh" :, 00011915313370991498, "Category2_probabilities_word": ,00016430433606728911, "Category2_probabilities_title": ,0010781479068100452, "Category2_probabilities_mount" :, 00024070330255199224, "Category2_probabilities_body": ,0001515906333224848, "Category2_probabilities_abb": 05 8.521509153069928e- "Category2_probabilities_lang": ,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 ": ,00012743560364469886," Category2_probabilities_currency ": 5.8569487009663135e-05 , "Categoría2_probabilidad": 0.9759176969528198}

Exponga nuestro servicio usando Ngrok

Por lo tanto, tenemos una nueva API que puede hacer predicciones de intención, pero un gran problema es que solo es accesible desde nuestro cuaderno Colab.

Permíteme presentarte otro servicio genial que uso a menudo, Ngrok.

Ngrok lo ayuda a crear URL de acceso público que se conectan a un servicio local como el que acabamos de crear.

No recomiendo hacerlo para uso en producción, pero es muy útil durante el desarrollo y las pruebas.

No necesita crear una cuenta, pero lo hago personalmente porque puedo configurar un subdominio personalizado que uso con mucha frecuencia.

Estos son los pasos para darle a nuestra API una URL pública para llamar desde App Script.

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

Primero descargamos y descomprimimos ngrok.

%% bash --bg

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

El código anterior le dice a ngrok que se conecte al servicio local en el puerto 8000. Eso es todo lo que necesitamos hacer.

! curl http://api.yourdomain.com/predict -X POST -F & # 39; Preguntas = ¿quién es el jefe? & # 39;

Puede confirmar que funciona repitiendo la llamada curl, pero llamando a la URL pública. Deberías obtener el mismo resultado.

Si no desea configurar un dominio personalizado, puede usar este código en su lugar.

%% bash --bg

./ngrok http 8000 2> ngrok.log

Esto generará una URL pública aleatoria y se recuperará con este código.

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

"import sys, json; print (json.load (sys.stdin) (& # 39; tunnels & # 39;) (0) (& # 39; public_url & # 39;))"

Ahora volvemos a nuestras etapas finales.

Recuperando predicciones de intención

Adaptaremos el código que utilizamos para realizar las solicitudes de la API de Google Translate para que podamos hacer predicciones de solicitudes de intención.

Una gran diferencia entre los dos servicios API es que necesitamos realizar solicitudes HTTP POST en lugar de solicitudes HTTP GET más simples.

Veamos cómo cambia nuestro código y aprenda un poco más sobre HTTP en el proceso.

function fetchPrediction (question = "¿quién es el jefe?") {

TEXTO = encodeURI (TEXTO);

console.log (TEXTO);

var url = "http://api.yourdomain.com/predict";

opciones var = {
"método": "POST",
"contentType": "application / x-www-form-urlencoded",
"carga útil": TEXTO,
& # 39; muteHttpExceptions & # 39;: verdadero
};

respuesta var = UrlFetchApp.fetch (url, opciones);

var json = response.getContentText ();

//console.log(json);

predicción = JSON.parse (json);

//console.log(prediction);

console.log (prediction ("Category0_predictions"));

predicción de retorno ("Category0_predictions");

}

La funcion fetchPrediction llama al servicio API que creamos y devuelve la intención prevista. Básicamente reproduce el equivalente de bucle llamamos a Colab, pero en Apps Script.

He resaltado algunos cambios clave en el código. Vamos a examinarlos.

Una diferencia clave entre las solicitudes GET y POST es que en las solicitudes GET, los datos se pasan en la URL como parámetros.

En las solicitudes POST, los datos se transmiten en el cuerpo de la solicitud.

Necesitamos formatear los datos antes de enviarlos al cuerpo y debemos definir el tipo de contenido correcto para que el servidor sepa cómo decodificarlos.

Esta línea codifica la pregunta que estamos pasando.

    TEXTO = encodeURI (TEXTO);

Este es un ejemplo de cómo se ve el TEXTO codificado.

Preguntas = etiqueta% 20generator

El tipo de contenido correcto para esta codificación es application / x-www-form-urlencoded. Esta es la codificación recomendada para los datos de formulario HTML.

Creamos un las opciones estructura de datos donde especificamos estos parámetros y el tipo de solicitud correcto y estamos listos para comenzar.

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

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

Vous devriez voir l&#39;entrée codée et l&#39;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. ¡Para nada!

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

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

Ressources pour en savoir plus

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

Voici quelques-unes des ressources que j&#39;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&#39;aide du Deep Learning dans Google Sheets "width =" 1538 "height =" 1054 "tailles =" (max-width: 1538px) 100vw, 1538px "srcset =" https://cdn.seoconsem.com/wp-content /uploads/2020/03/icodeseo-5e6970e5defe8.png 1538w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/icodeseo-5e6970e5defe8-480x329.png 480w, https: //cdn.seoconsem .com / wp-content / uploads / 2020/03 / icodeseo-5e6970e5defe8-680x466.png 680w, https://cdn.seoconsem.com/wp-content/uploads/2020/03/icodeseo-5e6970e5defe8-768x526.png 768w , https://cdn.seoconsem.com/wp-content/uploads/2020/03/icodeseo-5e6970e5defe8-1024x702.png 1024w "src =" https://cdn.seoconsem.com/wp-content/uploads/2020 /03/icodeseo-5e6970e5defe8.png

C&#39;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&#39;apparaître dans mon flux Twitter. Je vais laisser ce tweet ici comme un rappel amical. ✌️

Más recursos


Créditos de imagen

Toutes les captures d&#39;écran prises par l&#39;auteur, mars 2020