Translate

lunes, 24 de marzo de 2014

Expresiones Regulares en detección de Entidades Nombradas con Java

(Artículo en proceso )

Introducción

Para el procesamiento automatizado de textosde nuestro programa espía internacional deberemos saber de lo que se está hablando, así que procederemos a etiquetar la información en Nombres, Organizaciones y Datos Misceláneos.

Decisión de la fuente de datos


En este caso el orígen de datos será un archivo de texto, por ello deberemos usar un reader para leer cadenas sin procuparnos por lidiar a nivel intermedio con los flujos de cadenas.

 Para ello importamos un lector de ficheros:

import java.io.FileReader;
public class CortaCadenas {
    public static void main(String[] args) {
 }  
}

Como doble precaución y para poderlo operar mejor, agregaremos un búffer.

¿Qué es un búffer?

Un buffer, en el sentido más estricto es un almacenamiento temporal, que se usa para contrarestar el desfase temporal asociado a una señal, proceso o recurso. En este caso, usaremos un búffer pensando que el programa podría correr en una máquina muy lenta (o tal vez muy rápida... en cualquiera de los dos extremos sirve), en la que la velocidad de lectura física del fichero podría ser más lenta que la velocidad a la que recibimos su contenido. En el caso de Java, la Clase BufferedReader contiene el método readLine que para nuesrtos propósitos será muy efectivo al permitrnos leer el texto línea por línea.

Por lo tanto nuestro código quedará algo así:

import java.io.BufferedReader;
import java.io.FileReader;

public class CortaCadenas {
    public static void main(String[] args) { 
     BufferedReader br = null;
 }  
}


Contemplando excepciones


Alguna veces, a pesar de todo, algo peude salir mal, por ello añadiremos un código de manejo deexcepciones de entrada y salida... ¿Qué cómo podría pasar esto? Pudiera ser que nuestro arcivo estuviera siendo escaneado por un antivirus, o lo tuviéramos abierto, o le estuviéramos guardando información, hay muchísimas explicaciones. 
Nuestro código quedaría así:

import java.io.BufferedReader;
import java.io.FileReader;

public class CortaCadenas {
    public static void main(String[] args) { 
     BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("miarchivodetexto.txt")));
 

            String texto =""; //inicializamos
        } catch (IOException ex) {
            System.err.println("Problema de lectura/escritura");
        }
        finally{
            try {
                br.close();
            } catch (IOException ex) {
                System.err.println("Problemas al cerrar el archivo"); 
            }
        }
 

 }  
}


Usando Expresiones Regulares


Las expresiones regulares es una forma de decir que vamos a buscar expresiones comunes que se pueda expresar de manera matemáticamente regular mediante algún lenguaje.

Identificando Nombres Propios


Por suerte gramaticalmente los nombres propios se distinguen relativamente fácil porque siempre comienzan con la primera letra mayúscula. Existe sin embargo un caso en el que debemos decidir, y es el caso del inicio de texto, pues los textos casi siempre inician con una palabra en mayúscula que no es un nombre, así que omitiremos la primera palabra de los textos.
El código quedará así:

String connombre=texto.replaceAll("\\p{Space}[A-Z][a-z][a-z]+", " NOMBRE");
System.out.println(connombre);


Es importante notar que antes de la palabra NOMBRE hay un espacio, esto es porque nos comemos el espacio anterior para lograr evitar detectar la primera palabra.

Identificando Organizaciones


Otra de las entidades nominales comunmente encontradas son las organizaciones, estas por lo general se caracterizan porque tienen siglas.
En nuestro caso las identificaremos mediante el código:

String conorganizacion=texto.replaceAll("([A-z]+\\.)+", "ORGANIZACION");
System.out.println(conorganizacion);

Identificando Información miscelánea

Aparte de la información importante, también puede que nos interese alguna información miscelánea, como pueden ser precios, fechas, porcentajes y cosas similares.
La información Miscelánea normalmente se etiqueta como MISC, es decir se remplaza toda la palabra de ese carácter por la palabra MISC, en nuestro caso lo haremos con la palabra MISCELANEA.

Lo haremos en nuestro caso mediante:

String conmiscelanea=texto.replaceAll("[\\p{Punct}*[0-9][0-9]+\\p{Punct}*]+[0-9]+", "MISCELANEA");
System.out.println(conmiscelanea);



Contando las ocurrencias


Finalmente contaremos cuantas veces se han detectado:

public class EntidadesNombradas {

    public static void main(String[] args) {
        BufferedReader br = null;

        String texto = "";
        texto = "Ayer fui con Arturo al supermercado Wallmart y me compré 10 chicles en $5.50, enfrente de la O.N.U. en EE.UU.A. solamente al 20% de descuento el día 20/02/2014";

        String[] nombres;
        nombres = texto.split("\\p{Space}[A-Z][a-z][a-z]+");
        System.out.println("Su texto tiene " + (nombres.length-1) + " Nombres");

        String[] organizaciones;
        organizaciones = texto.split("([A-z]+\\.)+");
        System.out.println("Su texto tiene " + (organizaciones.length-1) + " Organizaciones");

        String[] miscelaneas;
        miscelaneas = texto.split("\\B[\\p{Punct}*[0-9][0-9]+\\p{Punct}*]+");
        System.out.println("Su texto tiene " + (miscelaneas.length-1) + " entidades misceláneas");

        String connombre = texto.replaceAll("\\p{Space}[A-Z][a-z][a-z]+", " NOMBRE");
        System.out.println(connombre);
        String conorganizacion = connombre.replaceAll("([A-z]+\\.)+", "ORGANIZACION");
        System.out.println(conorganizacion);
        String conmiscelanea = conorganizacion.replaceAll("[\\p{Punct}*[0-9][0-9]+\\p{Punct}*]+", "MISCELANEA");
        System.out.println(conmiscelanea);

    }
}

Código

El código completo quedaría de la siguiente manera:


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JOptionPane;

public class EntidadesNombradas {

    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(JOptionPane.showInputDialog("Escriba al ruta a su archivo de texto por favor")));
            String texto = "";
            //texto = "Ayer fui con Arturo al supermercado Wallmart y me compré 10 chicles en $5.50, enfrente de la O.N.U. en EE.UU.A. solamente al 20% de descuento el día 20/02/2014";
            String lineaLeida = br.readLine();
            do {
                System.out.println(texto);
                texto += lineaLeida;
                lineaLeida = br.readLine();
            } while (lineaLeida != "" && lineaLeida != null);


            String[] nombres;
            nombres = texto.split("\\p{Space}[A-Z][a-z][a-z]+");
            System.out.println("Su texto tiene " + (nombres.length - 1) + " Nombres");

            String[] organizaciones;
            organizaciones = texto.split("([A-z]+\\.)+");
            System.out.println("Su texto tiene " + (organizaciones.length - 1) + " Organizaciones");

            String[] miscelaneas;
            miscelaneas = texto.split("\\B[\\p{Punct}*[0-9][0-9]+\\p{Punct}*]+");
            System.out.println("Su texto tiene " + (miscelaneas.length - 1) + " entidades misceláneas");

            String connombre = texto.replaceAll("\\p{Space}[A-Z][a-z][a-z]+", " NOMBRE");
            System.out.println(connombre);
            String conorganizacion = connombre.replaceAll("([A-z]+\\.)+", "ORGANIZACION");
            System.out.println(conorganizacion);
            String conmiscelanea = conorganizacion.replaceAll("[\\p{Punct}*[0-9][0-9]+\\p{Punct}*]+", "MISCELANEA");
            System.out.println(conmiscelanea);
        } catch (IOException ex) {
        }
    }
}


domingo, 23 de marzo de 2014

Configuración de gree para un juego android

(Artículo en proceso)

Introducción

Primero que nada es preciso que les explique en que consiste gree y por que deberíamos de considerar implementario en nuestro juego.
Gree es una megacorporación asiatica que hace pocos años compró el popular sistema de platafoma social OpenFeint, forzando a miles de desarrolladores de juegos a adaptarse a nuevos estándares que ya les eran habituales en mercados de videojuegos asiáticos. De hecho, normalmente le resulta muy dificil a cualquier aplicación o nuevo producto insertarse apropiadamente en el mercado asiático, y Gree nos da los lineamientos a seguir para hacerlo, pues esta compañía pertenece segun forbes al millonario más jóven de asia ( cuya fortuna  labró el mismo ).
Con el cambio de nombre de la compañía, también se adaptó la plataforma y actualmente soporta además de PC, dispositivos móviles y está replreta de características que vuelven a cualquier juego "social".

Preconfiguración

Primeramente deberemos crearnos una cuenta de desarrollador, y bajar las herramientas correspondientes al iniciar sesión en su portal para desarrolladores.
Siguiendo el enlace del manual procedemos a agregar una nueva aplicación de prueba.
 
Tras haber llenado los primeros datos que se nos piden la aplicación aparecerá en nuestra lista, y los identificadores serán creados.
Deberemos abrir el menu detalles y alli agregar los dispositivos compatibles. En este caso elegiré android.

Tras completar la plataforma, me generará las credenciales que usaré ya vía código. Por eso este paso es muy importante.









miércoles, 19 de marzo de 2014

Configurar Eclipse IDE para desarrollar aplicaciones android

Introducción


El siguiente paso después de tener el sdk de Google para desarrollar aplicaciones para la plataforma Android es buscar un buen entorno gráfico, en esta ocasión les enseñaré a configurar el entorno de desarrollo integrado Eclipse para desarrollar visualmente y en código aplicaciones android.

Procedimiento

Prieramente vamos a la opcón agregar software del menú ayuda

Nos saldrá una ventana como esta

Primero deberemos agregar el repositorio oficial
Seleccionamos Developer Tools y le damos siguiente. los NDK plugins son opcionales.
Si no hay problema nos saldrá una ventana con el softwre que elegimos, le damos en siguiente
Nos sale una ventana con las licencias de software, le damos en la primera opción para aceptar y Finalizar

El programa descargará los plugins, proceso que normlamente debe llevar cerca de 15 minutos a 100 Kb/s
Al terminar de bajar nos preguntará si queremos instalar software que no ha sido hecho por eclipse, le damos OK
Tras este paso nos pedirá reiniciar eclipse
si la instalación fue exitosa tendremos nuevas opciones en los menús, y algunas veces nos pedirá que instalemos el componente Android SDK Build-Tools desde el SDK Manager que ya será accesible desde eclipse





jueves, 13 de marzo de 2014

Programa para cortar cadenas en oraciones y palabras en Java

Introducción

A veces necesitamos programas que nos permitan contar, e incluso separar las palabras de cada oración, ya sea que busquemos información emocional, personal, etc acerca del usuario, o estudiemos tendencias de mercado basados en historiales de búsqueda, o simplemente deseemos saber con presición que palabras son las más usadas en un conjunto social para infiltrar un agente encubierto... bueno.. creo que exageré.. pero para todo eso y más se puede usar, solo falta un poco de talento, imaginación y las bases que te presentaré a continuación.

Decisión de la fuente de datos


En este caso el orígen de datos será un archivo detexto, por ello deberemos usar un reader para leer cadenas sin procuparnos por lidiar a nivel intermedio con los flujos de cadenas.

 Para ello importamos un lector de ficheros:

import java.io.FileReader;
public class CortaCadenas {
    public static void main(String[] args) {
 }  
}

Como doble precaución y para poderlo operar mejor, agregaremos un búffer.

¿Qué es un búffer?

Un buffer, en el sentido más estricto es un almacenamiento temporal, que se usa para contrarestar el desfase temporal asociado a una señal, proceso o recurso. En este caso, usaremos un búffer pensando que el programa podría correr en una máquina muy lenta (o tal vez muy rápida... en cualquiera de los dos extremos sirve), en la que la velocidad de lectura física del fichero podría ser más lenta que la velocidad a la que recibimos su contenido. En el caso de Java, la Clase BufferedReader contiene el método readLine que para nuesrtos propósitos será muy efectivo al permitrnos leer el texto línea por línea.

Por lo tanto nuestro código quedará algo así:

import java.io.BufferedReader;
import java.io.FileReader;

public class CortaCadenas {
    public static void main(String[] args) { 
     BufferedReader br = null;
 }  
}


Contemplando excepciones


Alguna veces, a pesar de todo, algo peude salir mal, por ello añadiremos un código de manejo deexcepciones de entrada y salida... ¿Qué cómo podría pasar esto? Pudiera ser que nuestro arcivo estuviera siendo escaneado por un antivirus, o lo tuviéramos abierto, o le estuviéramos guardando información, hay muchísimas explicaciones. 
Nuestro código quedaría así:

import java.io.BufferedReader;
import java.io.FileReader;

public class CortaCadenas {
    public static void main(String[] args) { 
     BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("miarchivodetexto.txt")));
 

            String texto =""; //inicializamos
        } catch (IOException ex) {
            System.err.println("Problema de lectura/escritura");
        }
        finally{
            try {
                br.close();
            } catch (IOException ex) {
                System.err.println("Problemas al cerrar el archivo"); 
            }
        }
 

 }  
}

Almacenamieno de oraciones

¿Como detectamos una oración? Fácil! Normalmente, según mis clases de primaria... las oraciones se distinguen en un texto mediante el uso del caracter "." conocido como punto... ha varias clases de puntos... pero en general podemos decir que un punto delimita una oración. Java tiene incorporada una gran funcionalidad para cadenas de texto, en este caso usaremos la siempre fiable función split de la clase String, se basa en expresiones regulares y esas cosas tan triviales que sobra mencionar :P

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JOptionPane;

public class CortaCadenas {
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(JOptionPane.showInputDialog("Escriba la ruta a su archivo de texto por favor")));
            String texto ="";
            String lineaLeida=br.readLine();
            do {               
                System.out.println(texto);
                texto+=lineaLeida;
                lineaLeida=br.readLine();
            } while (lineaLeida!="" && lineaLeida!=null);
            String[] oraciones;
                oraciones=texto.split(".");
                System.out.println("Su texto tiene "+oraciones.length+" oraciones");
                for (int i = 0; i < oraciones.length; i++) {
                String oracion = oraciones[i];
                    System.out.println("Oración "+i+":");
                    System.out.println(oracion);
            }

        } catch (IOException ex) {
            System.err.println("Problema de lectura/escritura");
        }
        finally{
            try {
                br.close();
            } catch (IOException ex) {
                System.err.println("Problemas al cerrar el archivo"); 
            }
        }
 

 }  
}


Almacenamiento de palabras

Para detectar palabras es igual de fácil, una palbra siempre está junto a almenos un espacio en blanco.

Programa Completo

El programa terminado será:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JOptionPane;

public class CortaCadenas {
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(JOptionPane.showInputDialog("Escriba la ruta a su archivo de texto por favor")));
            String texto ="";
            String lineaLeida=br.readLine();
            do {               
                System.out.println(texto);
                texto+=lineaLeida;
                lineaLeida=br.readLine();
            } while (lineaLeida!="" && lineaLeida!=null);
            String[] oraciones;
                oraciones=texto.split(".");
                System.out.println("Su texto tiene "+oraciones.length+" oraciones");
                for (int i = 0; i < oraciones.length; i++) {
                String oracion = oraciones[i];
                    System.out.println("Oración "+i+":");
                    System.out.println(oracion);
            }
           
                String[] palabras;
                palabras=texto.split(" ");
                System.out.println("Su texto tiene "+palabras.length+" palabras");
                for (int i = 0; i < palabras.length; i++) {
                String palabra = palabras[i];
                    System.out.println("Oración "+i+":");
                    System.out.println(palabra);
            }
               
        } catch (IOException ex) {
            System.err.println("Problema de lectura/escritura");
        }
        finally{
            try {
                br.close();
            } catch (IOException ex) {
                System.err.println("Problemas al cerrar el archivo"); 
            }
        }  
    }  
}


Dudas o Comentarios

Cualquier duda, aclaración o comentario será bien recibida, no vivo de esto, pero cada cien visitas recibo un par de centavos de mis patrocinadores que como sabrás se anuncian mediante mi página, así que no dudes en recomendarme a tus amigos.