NLTK Tokenizing y Python

Python
Estándar

Hola, bienvenidos al blog, en esta ocasión les traigo algo “nuevo”, está bien, no es nuevo pero si es interesante. Vamos a hablar de PNL, el cuál es un tema muy interesante. involucra muchísimas cosas y aqui vamos a tratar especificamente de un cosa; El texto.

Así es, como lo dice el título del post hoy vamos a aprender un poco de Tokenizing que no es más que dividir algo en una lista de algo.

Tokenizing

Conceptualmente es la división de texto o cadenas de texto en partes más pequeñas como frases, palabras o símbolos, utilizando así un concepto como el de “divide y vencerás“. El resultado de hacer el Tokenizing será una lista de Tokens.

Por ejemplo, si aplicamos el Tokenizing a un párrafo el resultado será una lista de tokens los cuales estarán compuestos de oraciones, si hacemos lo mismo pero para una oración obtendremos una lista de tokens compuestos por las palabras que componen dicha oración.

Teniendo la siguiente oración podemos ver que al hacer el Tokenizing obtendremos dos tokens, el de color azul y el de color naranja. Estos a su vez puedes ser separados en palabras pero para el ejmeplo utilizaremos primero la separación por sentencias.

Text Tokenizing

Text Tokenizing

Python y NLTK

Hacer el Tokenizing en python es ralmente sencillo, y si programar algoritmos en python es fácil, utilizando librerías como NLTK es aún más sencillo.

Crearemos un nuevo archivo de script python o desde la consola puedes trabajar.

from nltk.tokenize import sent_tokenize

para = "Today is good to see you. How are you?"
print sent_tokenize(para)

En el código de python importamos la librería NLTK y en concreto la parte de Tokenize el cuál nos ayudará con la creación de tokens.

Screenshot (27)

Con esto podemos empezar a probar la magia de la librería. Con una cadena vamos a realizar el tokenizing, para este ejemplo la cadena es la variable para al final para hacer el tokenizing solamente tenemos que hacer la función sent_tokenize() con la variable como parámetro y en pantalla veremos algo como lo siguiente:

Un vector con token por cada frase será nuestro resultado. sin embargo esta manera resulta no tan efectiva para cuando tenemos un montón de texto, así que ahora vamos a ver una de las maneras más usuales. Utilizar el Tokenize.

Para usar el Tokenize debemos hacer algo un poco similar a lo anterior, solo que con una parte diferente, ahora con NLTK->Data vamos a importarla al script.

import nltk.data

para = "Today is good to see you. How are you?"
tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
print tokenizer.tokenize(para)

Tenemos la misma variable(para) con las sentencias y al ejecutarlo vemos que tenemos el mismo resultado que con la funcion sent_tokenize().

Screenshot (27)

Entonces me dirán que cuál es la diferencia, la pequeña gran diferencia es que para hacer el tokenizing de un monton de sentencias la eficiencia se refleja al utilizar ésta forma.

Una línea diferente es la variable tokenizer la cual es cargada con el lenguaje que se va a utilizar en éste caso es Inglés, pero de igual manera se puede realizar con el español y nos funcionara exactamente igual.

import nltk.data

para = "Hola amigos. Gracias por ver este video. Saludos"
tokenizer = nltk.data.load('tokenizers/punkt/spanish.pickle')
print tokenizer.tokenize(para)

EL resultado de las tres maneras de realizar el tokenizing nos mostrará una pantalla como la siguiente:

Screenshot (26)

Entonces podemos trabajar con un montón de lenguajes (que soporte NLTK obviamente), así terminaremos este sincillo post sobre el tokenizing de oraciones, en el próximo veremos algo más a fondo que sera el tokenizing de frases para que los tokens resultantes sean las palabras de la frase.

Me despido y nos vemos en la siguiente entrada. Cualquier duda o comentario estoy atento y les responderé en breve.

Les dejo ésta canción que tiene buen ritmo y me encantó. Saludos.

Referencias

WebService con PHP

Estándar

Que tal, lectores de éste blog medio irregular, en esta entrada como el título lo dice vamos a ver como crear un WebService super sencillo donde implementaremos una operación fácil, por no decir pan comido.

Seguramente te han planteado el problema en tu universidad o bachillerato de “Calcular el índice de masa corporal de una persona” (léase con voz de maestro) y la verdad es que es fácil, incluso puedes decirme en los comentarios, “Pero eso no está complicado”, “Ya hay páginas que sacan el cálculo”, “Para que lo hago si ya lo sé”. Cuál sea tu comentario, éste blog es para ver, practicar, repasar e incluso aprender cosas nuevas, así que el cálculo del IMC lo vamos a hacer del lado del servidor (no se lo esperaban verdad :P).

Requisitos

Para hacer esta práctica debemos tener encuanta que necesitamos:

  • Host (puede ser gratuito si queremos hacer esta prueba)
  • Editor de código (Usaré Visual Studio Code)
  • Muchas ganas de hacer tu webservice

Con todo listo vamos a explicar el flujo de nuestro mini proyecto con  un pequeño diagrama.

Flujo de los datos

1. Diagrama para funcionamiento del webservice

En el diagrama se muestra el funcionamiento básico del webservice que vamos a implementar en PHP, el flujo comienza en el dispositivo que vamos a utilizar como “cliente”, en este caso vamos a suponer un telefono celular, el cuál mandará una peticion a un servidor web, este servidor según sus reglas atenderá dicha petición y nos regresará una respuesta.

Lo único que tenemos nosotros que hacer aqui es programar nuestro webservice en PHP, no hay que configurar nada del host o del dispositivo, ya que podemos probar desde el mismo navegador del dispositivo.

Comenzaremos por crear la estructura en nuestro host, regularmente un webservice tiene una estructura de carpetas como la siguiente:

/API/V1/index.php

Esto es solamente una carpeta API que contiene una carpeta V1 donde estará nuestro index.php

Manos a la obra

En nuestro editor preferido vamos a comenzar por utilizar un header el cual nos dirá que tipo es el documento, en nuestro caso será de tipo application/json.

<?php
    header("Content-Type:application/json"); 
?>

Quizá te preguntes el porque un contenido de tipo application/json, la respuesta es que este tipo de “servicios” utiliza protocolos para el envío y recepción de peticiones.

Con el header definido vamos a empezar con el procesamiento de la información, es por ello que utilizaremos la variable $_GET para obtener datos que sean enviados en la petición en la url del navegador.

Debemos saber el nombre de quién es la persona que está consultando su IMC, así que el primer dato que recibiremos será un nombre y validaremos que el dato no venga vacío.

<?php
    header("Content-Type:application/json");
    
    $nombre = $_GET['nombre'];
    if(!empty($nombre))
    {
        //Nombre valido       
    }
    else
    {
        //Nombre no valido
    }
?>

Ya que estamos seguros que el nombre enviado a la petición contiene algún valor, vamos a revisar si los valores del peso y la estatura contienen valores, as[i que realizaremos una evaluación similiar a la del nombre:

<?php      
    header("Content-Type:application/json");

    $nombre = $_GET['nombre'];
    if(!empty($nombre))
    {
        $peso = $_GET['peso'];
        $estatura = $_GET['estatura'];

        if(!empty($peso) && !empty($estatura))
        {
            //Calculo de IMC
        }
        else
        {
            //Peso o estatura no validos
        }
    }
    else
    {
        //Nombre no valido
    }
?>

Ahora vamos a realizar la operación necesaria para el cálculo con los datos ya otenidos, la forma de calcular el IMC se obtiene dividiendo el peso entre la estatura elevada al cuadrado.

IMC = peso / (estatura * estatura)

Esto mismo haremos en el c[odigo para calcular el IMC y casi habremos terminado.

<?php      
    header("Content-Type:application/json");

    $nombre = $_GET['nombre'];
    if(!empty($nombre))
    {
        $peso = $_GET['peso'];
        $estatura = $_GET['estatura'];

        if(!empty($peso) && !empty($estatura))
        {
            $estatura /= 100;
            $imc = $peso / ($estatura * $estatura);
            $imc = round($imc, 2); 
        }
        else
        {
            //Peso o estatura no validos
        }
    }
    else
    {
        //Nombre no valido
    }
?>

Por último vamos a crear una función que va a devolver la respuesta en el formato que se utiliza para los webservices, una respuesta HTTP en formato JSON, esta función la utilizaremos para devolver el resultado del IMC calculado, así como los mensajes de errores (como el nombre o peso/estatura vacíos).

<?php
header("Content-Type:application/json");

    $nombre = $_GET['nombre'];
    if(!empty($nombre))
    {
        $peso = $_GET['peso'];
        $estatura = $_GET['estatura'];

        if(!empty($peso) && !empty($estatura))
        {
            $estatura /= 100;
            $imc = $peso / ($estatura * $estatura);
            $imc = round($imc, 2);
            deliver_response(200, "$nombre tu IMC es de $imc", $imc);
        }
        else
        {
            deliver_response(200, "peso o estatura no validos", null);
        }
    }
    else
    {
        deliver_response(200, "Nombre no valido", null);
    }

    function deliver_response($status, $status_message, $data)
    {
        header("HTTP/1.1 $status $status_message");
        $response['status'] = $status;
        $response['status_message'] = $status_message;
        $response['data'] = $data;

        $json_response = json_encode($response);
        echo $json_response;
    }

?>

La función deliver_response() lo que hace es recibir un status, mensaje y datos, los cuales enviará como respuesta en formato HTTP, éste formato al final lo convertiremos a un objeto JSON y lo lanzaremos como respuesta.

Probaremos el WebService

Para probar el WebService tenemos que subir el achivo index.php que creamos a nuestro host, en mi caso la ruta del archivo es:

http://www.raptorsarts.com.mx/API/IMC/V1/index.php

Para ver el funcionamiento debemos de pasar los parámetros desde la url ya que si damos clic a nuestro WebService nos mandará el error de nombre no válido, así que para probar el nombre podemos ingresar el parámetro a la url.

http://www.raptorsarts.com.mx/API/IMC/V1/index.php?nombre=Antonio

Ahora nos arroja el error del peso o estatura no válidos, solucionamos esto enviando también por parámetros el peso y la estatura.

http://www.raptorsarts.com.mx/API/IMC/V1/index.php?nombre=Antonio&peso=75&estatura=189

Ahora si, el WebService nos muestra nuestro IMC, podemos verlo desde la información mostrada en el navegador o desde la opción de desarrollador el objeto que nos regresa y explorarlo.

Visualización del resultado

Visualización del resultado

 

Con esto terminamos, si tienes algun problema de implementación no dudes en escribirme o dejarme un comentario.

Aquí te dejo el link del repositorio por si necesitas revisar el código completo:
WebService IMC – GitHub

¿Qué sigue?

Ahora viene una pregunta interesante, ¿te imaginas el poder de los webservices?, si pones un poco de atención en el flujo de la petición hay un Horno de Microondas, lo puse a propósito (obviamente), porque con los webservices podemos hacer mucho IoT (Internet of Things – Internet de las Cosas) agregando algun harware para comunicar nuestro WebService con lo que se nos ocurra controlar, las luces de nuestro cuarto, nuestro XBox o saber cuanta energía eléctrica estamos utilizando. Ésto y muchisimas cosas más podemos hacer, poco a poco iré subiendo pequeños tutoriales.

Sin más por el momento espero que llegaran hasta éste punto del post (a decir verdad uno de los más largos) pero el contenido a mi parecer es sencillo de comprender y replicar.

Aun seguiremos utilizando WebServices, nos vemos en la siguiente entrada, hasta la próxima y los dejo con algo tranquilo que les servirá para hacer su WebService.

 

Operador Ternario C#

Estándar

Regresé, bueno en verdad nunca me fuí pero estaba algo ocupado… en fin, ésta entrada la realicé por un motivo, es mágico el Operador Ternario de C#, si, yo sé que no solo existe en C#, que está en Java, PHP, Python y hasta en C/C++ con su respectiva sintáxis.

El operador ternario como su nombre lo dice (yo sé que no dice nada  xD) es un operador que hace básicamente el trabajo de una estructura condicional, hace una evaluación de una expresión y dependiendo el resultado nos asignará un resultado u otro.

Podemos verlo como un ifexpress” para algo sencillo, y digo ésto porque alguna vez un compañero de trabajo empezó a hacer un conjunto de ternarios “anidados” que vaya lío, en vez de hacerse entendible se volvió un completo dolor de cabeza, así que si hay que usarlo pero no en exceso.

El operador tiene la siguiente estructura:

variable = (condicion) ? valorVerdadero : valorFalso;

Explicando la expresión arriba descrita podemos separarla en dos partes; la parte de la condición y la parte de los valores que tendrá dependiendo de la condición.

La podemos leer como “Si la condición se cumple guardar en variable el valor verdadero, si no se cumple asignar el valor falso”. Con ésto vemos que el operador ternario es como escribí; un if. 

Vamos a verlo en un codigo propio del lenguaje.

    using system;

    namespace OperadorTernario
    {
        class Program
        {
            private static void Main(string[] args)
            {
                string resultado;
                int valor1 = 10;
                int valor2 = 6;

                resultado = (valor1 &gt; valor2) ? "Valor verdadero" : "Valor Falso";

                Console.WriteLine(resultado);
                Console.ReadLine();
            }
        }
    }

Como se puede ver declaramos dos variables enteras y una variable de tipo string para almacenar el resultado de nuestra condición. Así que seguimos la estructura antes descrita donde evaluamos que la variable numero1 sea mayor que numero2, para esta vez se cumplirá la condición y se almacenará la cadena “Valor verdadero” en la variable que después se muestra en la consola.

Si la condición fuera falsa el valor de la variable sería “Valor falso”. Asi sería el código para el valor falso.

    using system;

    namespace OperadorTernario
    {
        class Program
        {
            private static void Main(string[] args)
            {
                string resultado;
                int valor1 = 10;
                int valor2 = 6;

                resultado = (valor1 < valor2) ? "Valor verdadero" : "Valor Falso";

                Console.WriteLine(resultado);
                Console.ReadLine();
            }
        }
    }

*Nótese que el cambio solo es en la parte de la condición (<)

Aqui dejo el video de la implementación en C# con Visual Studio para que tengan una guía visual del operador ternario.

Con esto creo que queda un poco más entendible el uso del operador ternario en nuestros proyectos y por supuesto en el ámbito laboral. Terminemos ésta entrada con música (¡como siempre! 😀 )

Cualquier duda, pueden mandarme un mail, escribirme al twitter o dejar su comentario. Saludos y hasta la próxima.

El link del repo de github esta en el siguiente link:

https://github.com/JoseAntonioMora/OperadorTernario

Enlaces de referencia: