VISITAS:

martes, 24 de enero de 2012

Servicios Web con .NET (howto)

En este artículo describiré paso a paso cómo crear un servicio web con .NET desde cero.
Las versiones que utilizaré son:
  • Windows 7
  • IIS 7.5
  • Visual Studio 2010
CREAR UNA SOLUCIÓN
1. Crear un directorio base, por ej, D:\apps\Calculadora
2. Abrir VisualStudio
3. New Project > Other Project Types > Visual Studio Solutions > Blank Solution
Name: CalculadoraSolution
Location: directorio base
OK
Visual Studio crea un subdirectorio para la solución D:\apps\Calculadora\CalculadoraSolution

PROYECTO PARA EL WS
1. Solution Explorer > Botón derecho sobre la solución > Add > New Project
2. Visual Basic > Web > ASP.NET Web Service Application
Name: CalculadoraWS
Location: Subdirectorio de la solución (...CalculadoraSolution)
OK
Visual Studio crea un subdirectorio para el proyecto D:\apps\Calculadora\CalculadoraSolution\CalculadoraWS
3. Solution Explorer > Botón derecho sobre Service1.asmx > Rename
Cambiar el nombre a CalculadoraService.asmx
4. Cambiar el nombre de la clase
Solution Explorer > Botón derecho sobre el fichero CalculadoraService.asmx > View Code
Botón derecho sobre la clase Service1 > Rename
Cambiar el nombre a Calculadora
Si se desea, se puede cambiar también el atributo Namespace
Solution Explorer > Botón derecho sobre el fichero CalculadoraService.asmx > View Markup
En el atributo Class, poner: CalculadoraWS.Calculadora
5. Meter las operaciones:
Solution Explorer > Botón derecho sobre el fichero CalculadoraService.asmx > View Code
Quitar el método HelloWorld y añadir los siguientes métodos:
Public Function Suma(ByVal a As Double, ByVal b As Double) As Double
Return a + b
End Function

Public Function Resta(ByVal a As Double, ByVal b As Double) As Double
Return a - b
End Function

6. Build > Build Solution

DESPLEGAR EN IIS
1. Abrir el administrador de IIS: Panel de Control > Herramientas administrativas > Administrador de Internet Information Services (IIS)
2. Crear el directorio D:\apps\Calculadora\WWW
3. Botón derecho sobre Sitios > Agregar Sitio Web
Nombre del sitio: Calculadora
Ruta de acceso física: D:\apps\Calculadora\WWW
Puerto: 82
Aceptar
4. Botón derecho sobre el sitio Calculadora > Agregar aplicación
Alias: CalculadoraApp
Ruta: directorio del proyecto, D:\apps\Calculadora\CalculadoraSolution\CalculadoraWS
Aceptar
5. Abrir un navegador (Internet Explorer)
6. Invocar una operación
Pulsar sobre el enlace Suma
Introducir valores para los parámetros a y b
Pulsar el botón Invocar
El resultado será el mensaje XML devuelto por el servicio

CLIENTE .NET
1. Solution Explorer > Botón derecho sobre la solución > Add > New Project
2. Visual Basic > Windows > Windows Forms Application
Name: CalculadoraClient
Location: Subdirectorio de la solución (...CalculadoraSolution)
OK
Visual Studio crea un subdirectorio para el proyecto D:\apps\Calculadora\CalculadoraSolution\CalculadoraClient
3. Añadir dos TextBox al formulario para los parámetros a y b
4. Añadir un Label al formualrio para poner el resultado
5. Añadir dos Button al formulario para invocar las operaciones suma y resta
6. Solution Explorer > Proyecto Calculadora Client > Add Web Reference
Pulsar la flecha verde
Web reference name: calculadoraws
Botón Add Reference
7. En el callback de los botones hay que invocar a las operaciones del servicio
Dim a As Double = CDbl(txtA.Text)
Dim b As Double = CDbl(txtB.Text)
Dim calc As calculadoraws.Calculadora = New calculadoraws.Calculadora
Dim res As Double = calc.Suma(a, b)
lblResultado.Text = CStr(res)
8. Solution Explorer > Proyecto CalculadoraClient > Set as startup project
9. Debug > Start debugging

LIBRERÍA PARA LA LÓGICA Y CÁLCULOS
Imaginemos ahora que queremos separar el servicio web de la lógica (cálculos en este caso). Nos interesa hacer una librería para meter allí toda la lógica, e invocar a esta librería desde el servicio.

1. Solution Explorer > Botón derecho sobre la solución > Add > New Project
2. Visual Basic > Windows > Class Library
Name: CalculadoraLib
Location: Subdirectorio de la solución (...CalculadoraSolution)
OK
Visual Studio crea un subdirectorio para el proyecto D:\apps\Calculadora\CalculadoraSolution\CalculadoraLib
3. Solution Explorer > Botón derecho sobre el fichero Class1.vb
Rename
Renombrar a CalculadoraLib.vb
4. Implementar los métodos de la clase:
Public Function Suma(ByVal a As Double, ByVal b As Double) As Double
Return a + b
End Function

Public Function Resta(ByVal a As Double, ByVal b As Double) As Double
Return a - b
End Function
5. Build > Build Solution
6. Solution Explorer > Botón derecho sobre el proyecto CalculadoraWS > Add Reference
Seleccionar el proyecto CalculadoraLib
Cada vez que se reconstruya el proyecto, Visual Studio copiará el fichero CalculadoraLib.dll en el directorio bin del proyecto CalculadoraWS
7. Cambiar la implementación del servicio web para que invoque a la librería:

Public Function Suma(ByVal a As Double, ByVal b As Double) As Double
Dim calc As CalculadoraLib.CalculadoraLib = New CalculadoraLib.CalculadoraLib
Return calc.Suma(a, b)
'Return a + b
End Function

Public Function Resta(ByVal a As Double, ByVal b As Double) As Double
Dim calc As CalculadoraLib.CalculadoraLib = New CalculadoraLib.CalculadoraLib
Return calc.Resta(a, b)
' Return a - b
End Function

Aunque parezca que hemos complicado el código, en realidad lo hemos simplificado muchísimo, ya que la lógica y los cálculos suelen ser bastante complicados, y es bueno mantenerlos en una librería aparte.

8. Probar de nuevo el servicio invocando la URL: http://localhost:82/CalculadoraApp/CalculadoraService.asmx

TIPOS COMPLEJOS
A veces es necesario pasar como entrada o como salida tipos de datos complejos.
1. Solution Explorer > Botón derecho sobre el proyecto CalculadoraLib > Add > Class
Common items > Code > Class
Name: DatosCalculadora.vb
OK
2. Este es el contenido del nuevo fichero:
Public Class Entrada

Public a As Double
Public b As Double

End Class

Public Class Salida

Public suma As Double
Public resta As Double

End Class

3. Añadir una nueva función a CalculadoraLib.vb:
Public Function SumaResta(ByVal ent As Entrada) As Salida
Dim sal As Salida = New Salida
sal.suma = Suma(ent.a, ent.b)
sal.resta = Resta(ent.a, ent.b)
Return sal
End Function

4. Build > Build Solution
5. Añadir una nueva operación al servicio en CalculadoraService.asmx.vb
Public Function SumaResta(ByVal ent As CalculadoraLib.Entrada) As CalculadoraLib.Salida
Dim calc As CalculadoraLib.CalculadoraLib = New CalculadoraLib.CalculadoraLib
Return calc.SumaResta(ent)
End Function

6. Build > Build Solution
Si se pulsa sobre la nueva operación SumaResta no podremos probarla ya que tiene tipos compuestos

8. Solution Explorer > Botón derecho sobre calculadoraws (Web reference) del proyecto CalculadoraClient > Update Web Reference
9. En el formulario de CalculadoraClient meter un nuevo botón para SumaResta
10. En el callback del nuevo botón poner:
Private Sub btnSumaResta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSumaResta.Click
Dim a As Double = CDbl(txtA.Text)
Dim b As Double = CDbl(txtB.Text)
Dim calc As calculadoraws.Calculadora = New calculadoraws.Calculadora
Dim ent As calculadoraws.Entrada = New calculadoraws.Entrada
ent.a = a
ent.b = b
Dim sal As calculadoraws.Salida = calc.SumaResta(ent)
lblResultado.Text = "Suma = " & sal.suma & ", resta = " & sal.resta
End Sub

11. Debug > Start debugging


lunes, 23 de enero de 2012

Introducción al procesamiento del lenguaje natural (I)

Empiezo con éste, una serie de artículos sobre procesamiento del lenguaje natural. Este es el primero que servirá de introducción. Trataré temas como análisis de palabras (autómatas, expresiones regulares, transductores, N-gramas, part-of-speech tagging, modelos de Markov), análisis sintáctico (gramáticas formales, parseado sintáctico, parseado estadístico, unificación) y análisis semántico (representación del significado, semántica computacional, semántica léxica, semántica léxica computacional, discurso).
Si todo va bien, serán muchos artículos durante bastante tiempo. Empecemos por tanto introduciendo el procesamiento del lenguaje natural (NLP) con sistemas informáticos.

La idea de dar a los ordenadores la capacidad de procesar el lenguaje humano no es nueva. Se trata de un campo interdisciplinar que abarca: estadística, computación, almacenamiento masivo, teoría de la información, aprendizaje automático, lingüística computacional, etc. El objetivo de este campo es conseguir que los ordenadores ejecuten tareas útiles que involucran al lenguaje humano. Ejemplos de sistemas o aplicaciones serían: agentes conversacionales, traducción automática, respuesta a preguntas, extracción de información, chequeo ortográfico y gramatical, reconocimiento de voz, generación automática de texto, etc.

CONOCIMIENTOS UTILIZADOS EN NLP
La principal diferencia entre NLP y otras aplicaciones de proceso de datos es que NLP utiliza conocimientos del lenguaje. Estos conocimientos del lenguaje se pueden resumir en:
  • Fonética y fonología: conocimiento sobre los sonidos. Cómo se pronuncian las palabras en términos de secuencias de sonidos y cómo estos sonidos se generan acústicamente.
  • Morfología: conocimiento de los componentes de cada palabra. Cómo se forma el plural, las distintas personas y tiempos verbales.
  • Sintaxis: conocimiento de las relaciones estructurales entre las palabras de una frase. No todas las secuencias de palabras son válidas, existen unas reglas que hay que cumplir. Además, intercambiar el orden de ciertas palabras, puede cambiar completamente el significado de una frase.
  • Semántica: Conocimiento del significado de cada palabra.
  • Pragmática: Conocimiento sobre cómo el contexto influye en el significado.
  • Discurso: Conocimiento sobre unidades lingüísticas más grandes que una frase. Es decir, cómo afecta lo que se ha dicho en frases anteriores al significado de la frase actual.

AMBIGÜEDAD
Un aspecto común a todos los conocimientos utilizados en NLP (fonética, fonología, morfología, sintaxis, semántica, pragmática y discurso) es que todos intentan resolver ambigüedades.
Los modelos y algoritmos del NLP presentan diversas formas de resolver estas ambigüedades.

MODELOS Y ALGORITMOS
Afortunadamente, todas las clases de conocimiento mencionadas pueden ser capturadas utilizando un número relativamente pequeño de modelos y teorías. Además estos modelos son conocidos sobradamente en la ciencia informática.
Los modelos más importantes son: máquinas de estados, sistemas de reglas, lógica, modelos probabilísticos y modelos espacio-vectoriales. Estos modelos llevan a una serie de algoritmos que se utilizarán para implementar aplicaciones NLP. Veamos rápidamente cada unos de estos modelos.
Las máquinas de estados son modelos formales que consisten en estados, transiciones entre estados y entradas (eventos). Se utilizan en fonología, morfología y sintaxis.
Los sistemas de reglas son gramáticas (regulares o libres de contexto). Se utilizan en fonología, morfología y sintaxis.
Los modelos basados en lógica (de primer orden o de predicados) se han utilizado habitualmente para modelar semántica y pragmática.
Los modelos probabilísticos se pueden utilizar para mejorar las cualidades de todos los demás modelos (máquinas de estados, reglas, lógica). La ventaja de los modelos probabilísticos es su capacidad para resolver muchos problemas de ambigüedad dando una probabilidad a cada una de las soluciones posibles.
Finalmente, los modelos espacio-vectoriales están basados en el álgebra lineal y se utilizan en el tratamiento del significado de las palabras.

En cualquiera de estos modelos, el procesamiento del lenguaje implica buscar en un espacio de estados que representan hipótesis sobre una entrada. Por ejemplo, en reconocimiento de voz, se busca en un espacio de secuencias de sonidos para encontrar la palabra correcta. En análisis sintáctico, se busca en un espacio de árboles sintácticos.

LENGUAJE, IDEAS Y COMPRENSIÓN
Muchos expertos opinan que cuando la capacidad de los ordenadores para procesar el lenguaje sea comparable a la que tenemos los humanos, eso será señal de que las máquinas son realmente inteligentes. Esta creencia se basa en el hecho de que el uso efectivo del lenguaje está directamente relacionada con nuestras habilidades cognitivas.
Turing en 1950 propuso la siguiente prueba. Tres participantes, dos personas y un ordenador. Una de las personas, el entrevistador, habla con dos terminales. Detrás de uno de ellos está la otra persona y tras el otro está el ordenador. Para ganar, el entrevistador debe adivinar detrás de qué terminal está el ordenador. La persona tras el terminal debe convencer al entrevistador que él es el humano. El ordenador tratará de engañar al entrevistador para que llegue a creer que él es realmente humano. El tiempo de la entrevista es de cinco minutos.
Afortunadamente, para los propósitos y objetivos del NLP, no es importante si el ordenador es inteligente o no.

ESTADO DEL ARTE
Estamos en un momento en que el NLP puede ser algo apasionante. Los recursos de computación y almacenamiento son muy baratos y podríamos decir que casi ilimitados, incluso para un usuario medio. La web es una fuente de información masiva que crece día a día.
Estos son ejemplos de aplicaciones funcionando hoy día que reflejan esta tendencia:
  • Reserva de viajes con agentes conversacionales
  • Sistemas de navegación GPS que reconocen las indicaciones de voz del conductor
  • Sistemas de búsqueda en vídeos que analizan millones de grabaciones de audio por reconocimiento de voz
  • Buscadores multilenguaje (Google)
  • Analizadores automáticos de artículos
  • Agentes virtuales que enseñan a los niños, por ejemplo a leer
  • Análisis de opiniones de usuarios en blogs, foros y grupos de usuarios







viernes, 20 de enero de 2012

Segmentación de sentencias (5)

En la mayoría de los lenguajes escritos, las sentencias se separan con los signos de puntuación. A pesar de ello, las reglas de puntuación no siempre están definidas claramente y además, no siempre se siguen estrictamente.
Además, en función del idioma, se utilizan distintos signos de puntuación para delimitar las sentencias y subsentencias. Por ejemplo, el español comienza las sentencias interrogativas con el signo ¿, mientras que el inglés no.
Parece que en general, el problema de la segmentación de sentencias es un problema de menor dificultad que el de la segmentación de palabras o tokenización.
Los signos de puntuación más utilizados son el punto, la coma, la interrogación, la exclamación, el punto y coma, los dos puntos.
Sin embargo, un punto puede utilizarse también como separador decimal en un número (o separador de miles, dependiendo del idioma), o como fin de una abreviatura, o incluso como una abreviatura al final de una sentencia. Los puntos suspensivos se pueden utilizar para terminar una sentencia, pero también en mitad de una sentencia. También a veces un paréntesis delimita una sentencia.
Por tanto, no podemos considerar el problema de la segmentación de sentencias como un problema trivial de fácil resolución, ni mucho menos.
Veamos ahora las técnicas que se pueden aplicar para resolver este problema.
Segmentación de sentencias con signos de puntuación
La mayoría de las aplicaciones NLP utilizan el punto, la interrogación y la exclamación como separadores de sentencias, definiéndose una sentencia como la que empieza por una letra mayúscula y que acaba con un signo de puntuación.
La utilización de pocos signos de puntuación como separadores da lugar a frases más largas (que también serán más difíciles de analizar por el NLP), pero reduce la casuística. Sin embargo, ampliando la cantidad de signos de puntuación utilizados da lugar a frases más cortas, pero con una casuística y complicación mayores.
El principal problema de esta técnica es el uso ambiguo de los distintos signos de puntuación. Por ejemplo, un punto puede indicar el final de una sentencia, un separador decimal en un número, una abreviatura en mitad de una sentencia o incluso una abreviatura al final de una sentencia.
El problema es desambiguar estos posibles usos.
Utilización del contexto
Podemos utilizar el carácter siguiente al signo de puntuación. Si se trata de una letra minúscula, entonces no estamos ante un final de sentencia. Si es mayúscula no se puede tomar una decisión, ya que podría tratarse de una abreviatura. En estos casos habría que analizar por ejemplo las 3 ó 4 palabras anteriores al signo de puntuación.
En general, se pueden analizar distintos contextos alrededor del signo de puntuación para determinar si se trata o no de un separador de sentencia:
  • uso de mayúsculas y minúsculas (como se ha comentado ya)
  • part of speech (por ej. Universidad de S. Antonio)
  • longitud de las palabras antes y después del punto
  • léxico de las palabras antes y después del punto
  • prefijos y sufijos
  • tipos de abreviaturas (Sr. no aparecerá al final de una frase nunca)
  • pronombres (después de un punto indican comienzo de frase)
Utilización de reglas
La utilización de reglas combinadas con listas de abreviaturas, excepciones, etc puede dar muy buenos resultados. El problema es que estas reglas suelen estar muy ligadas a un corpus y no suelen ser aplicables a otros corpus.
No obstante la utilización de estas "gramáticas" es muy efectiva habitualmente ya que puede utilizar algunos de los criterios de contexto mencionados en el apartado anterior.
Algoritmos de aprendizaje
Se han hecho algunos experimentos utilizando algoritmos de aprendizaje, sobre todo árboles de decisión, para resolver el problema de la segmentación de sentencias. Se utilizaron como variables las características contextuales de las palabras anterior y posterior al punto (longitud de la palabra, tipo de abreviatura, mayúscula/minúscula, etc).
Los resultados han sido muy satisfactorios en general, aunque ha sido necesario un corpus muy grande de entrenamiento. El problema aquí es que manualmente hay que delimitar las sentencias para que el sistema pueda aprender.

Y con esta entrada termino el tema relacionado con preprocesado del texto. Quizás un tema que no aporta mucho al NLP, pero que es imprescindible hacerlo muy cuidadosamente para que las siguientes etapas que iremos viendo puedan hacer su labor correctamente.








miércoles, 11 de enero de 2012

MyReading para Android: lectura comprensiva para primaria

Algunas personas me habían pedido que desarrollara un pequeño juego para desarrollar la lectura comprensiva, algo fundamental en la etapa de los 8 a los 10 años de nuestros hijos.
He creado esta primera versión del juego que se puede descargar gratuitamente desde el market android. De momento no tiene muchas lecturas, pero voy a ir metiendo nuevas en sucesivas versiones del juego.
Se trata de ir leyendo unos textos breves y responder después a ciertas preguntas sobre el texto. Si se supera la prueba, entonces se desbloquea una nueva lectura.
Espero que os guste y que vuestros hijos/sobrinos/nietos lo aprovechen.

Para descargarlo, hay que buscar "myreading" en el market.