• No results found

Chapter 2 Literature review

2.7 Knowledge capturing, modelling and automation approaches and practices

2.7.3 Artificial intelligence

Las estructuras de datos se basaron en el libro “Quien es quien en el béisbol mexicano” del año 2000. El hecho de basar la estructura en una fuente en particular, repercutió de manera notable en el resto del caso.

Dada la naturaleza de la información de béisbol, que se manejan dos grupos de datos diferentes de acuerdo al tipo de jugador: bateador o lanzador, que en la actualidad casi en su totalidad son mutuamente excluyentes. Se optó por usar dos estructuras XML para guardar los datos.

Un lanzador ya no batea, por lo tanto, no se guarda información a su desempeño como bateador, salvo en ocasiones muy contadas. En particular, el documento de la “Enciclopedia del béisbol Mexicano 2005” no guarda la información de estadísticas de bateo de la mayoría de los lanzadores, aun cuando estos bateaban en temporadas anteriores a 1976.

4.1.2 Fuente de Datos

La primera fuente de datos es el documento PDF “Enciclopedia del béisbol Mexicano 2005”. Dicho documento fue utilizado con permiso de la Liga Mexicana de Béisbol. Este libro tiene estadísticas de todos los jugadores que han participado en dicha liga hasta el año 2005.

La segunda fuente de datos es cualquier consulta de los datos de un jugador en la página www.baseball-reference.com que contiene información de los jugadores de béisbol que actualmente juegan en las Grandes Ligas de los Estados Unidos.

4.1.3 Transformación de página de red

La información se copió de un documento semi-estructurado HTML, obtenido a traves de transformar el archivo PDF, en un documento equivalente en lenguaje HTML. Dado que la información sobre bateadores aparece primero en el documento, fue la primera en procesarse.

Figura 4.1. Datos de bateador de béisbol.

Como se ve en la figura 4.1, al principio de cada página de estadísticas de bateadores viene un encabezado, seguido posteriormente de los datos de uno o más jugadores, sin que dicho encabezado aparezca entre jugador y jugador.

La primera dificultad se presentó al transformar el documento PDF a un documento HTML, esperando obtener una tabla en código HTML, en su lugar, cada renglón generó un elemento paragraph de HTML. Considerando los datos de la primera temporada del primer jugador en la figura 4.1 como ejemplo:

<p>ABAD JAIME B:D/R T:D/R Nació/Born:04/ Oct/ 1926 en/in:YANGA, VERACRUZ MEXICO P:OF</p>

<p>1952 AGUILA .222 73 198 30 44 57 5 4 0 15 2 * 1 14 * 17 4 * 0 .288</p>

Por la aplicación de la estrategia se esperaba encontrar en un elemento <td> de HTML una relación directa con uno de los elementos de la estructura XML de búsqueda, pero al no ser el caso, hubo que realizar un trabajo previo de transformación no contemplado que consistió en transformar los datos en una tabla que cumpliera con los requisitos del standard HTML donde los datos se encuentren separados por celdas.

En este caso fue necesario recurrir al uso de expresiones regulares para determinar la separación de datos. El encabezado de cada página

se utilizó solamente una vez, para determinar en que columna debería quedar el dato a buscar. Aprovechando que los nombres de los datos también venían mencionados en inglés, se agregaron como sinónimos.

Por cada jugador se observó que el primer renglón contenía datos generales del jugador y los renglones posteriores contenían los datos que varían año con año, de acuerdo a lo realizado en las temporadas en que el jugador tuvo actividad. En el primer renglón de datos del bateador es fácil observar que siempre comienza con su nombre en mayúsculas y cada dato posterior viene precedido de dos puntos, por lo que al alimentar las expresiones regulares de que sustituyese cada palabra que terminase con dos puntos por un separador de etiqueta adecuado, en este caso la etiqueta <tr> de HTML, que representa un renglón dentro de una tabla. Las expresiones regulares usadas para la transformación de cada dato general del jugador en un renglón de una tabla en código HTML fueron las siguientes8:

s/\(^[A-Z]*\)\( \{2,}\)\(.*\)/<td>\1 \3/g s/ [A-Za-z\/]*:/<\/td><td>/g

s/\(^\)\(.*\)\($\)/<tr @tipo=”general”>\2<\/td><\/tr>/g

La primera expresión se encarga de localizar el nombre, que siempre va al inicio y además está en mayúsculas, éste será la primera columna de cada renglón, al final de dicho nombre se le agrega un espacio en blanco. Esto fue importante para poder aplicar la siguiente expresión regular.

Se observa que cada indicador de dato se encuentra separado por un espacio en blanco, un número variable de caracteres alfanuméricos y el caracter de dos puntos. La segunda expresión regular transforma esos patrones en patrones de columnas en tabla de HTML, salvo al último dato. De esto se encarga la última expresión que complementa los tags de <tr> que son los que definen un renglón de tabla en código HTML. Se observa que se agrega un atributo tipo que no es propiamente de lenguaje HTML pero que será útil en las futuras transformaciones.

En los renglones de datos del bateador, se observa que después del nombre del equipo viene un porcentaje que siempre empieza con un punto decimal. A partir de este punto cada dato se encuentra separado por un espacio en blanco, por lo que se transformó cada espacio en

8 La aplicación de las expresiones regulares fue por medio de la herramienta sed corriendo sobre Linux

blanco en un separador <td> de lenguaje HTML. Las expresiones regulares usadas para la transformación de estos datos fueron las siguientes:

s/\(^[0-9]\{4\}\)\( \)\([- A-Z]*\)/<td>\1<\/td><td>\3/g s/\( \)\([.*0-9]*\)/<\/td><td>\2/g

s/\(^\)\(.*\)\($\)/<tr @tipo=”dato”>\2<\/td><\/tr>/g

La primera expresión se encarga de separar la temporada y los equipos para los que jugó el pelotero, dado que hay equipos de béisbol cuyo nombre consiste de más de una palabra, como en el caso de Nuevo Laredo. Para separar el resto de los datos se observó que con que fuera un espacio en blanco seguido de cualquier caracter distinto a una letra, se hacía la separación. La última expresión se encarga de construir el renglón de una tabla, donde como en la tabla de los datos generales maneja un atributo que permite distinguir el tipo de renglón.

Tomando como ejemplo la primera temporada del primer jugador cuyos datos aparecen en la figura 4.1, el XHTML generado tiene la siguiente forma: <tr @tipo=”general”> <td>ABAD JAIME</td> <td>D/R</td> <td>D/R</td> <td>04/ Oct/ 1926</td>

<td>YANGA, VERACRUZ MEXICO</td> <td>OF</td> </tr> <tr @tipo=”dato”> <td>1952</td> <td>AGUILA</td> <td>.222</td> <td>73</td> <td>198</td> <td>30</td> <td>44</td> <td>57</td> <td>5</td> <td>4</td> <td>0</td> <td>15</td> <td>2</td> <td>*</td> <td>1</td> <td>14</td> <td>*</td> <td>17</td>

<td>4</td> <td>*</td> <td>0</td> <td>.288</td> </tr>

Los datos de los lanzadores se presentan de la figura 4.2:

Figura 4.2. Datos de lanzador de béisbol

En particular el dato IP presentó dificultades al incorporar la información a la base de datos, lo cual se explica en la sección 4.1.5 Copiado de información a la base de datos. Se usaron los mismos criterios utilizados con los bateadores para crear los separadores en lenguaje HTML.

Otro elemento de datos que presentó problemas fueron los elementos que empiezan a registrar datos a partir de un determinado año, pero no antes. En la figura 4.2 se puede apreciar en los datos del lanzador José Peña, que previo a la temporada de 1973 no se registran datos de tres elementos, pero en el documento aparecen con asteriscos, aún cuando los valores válidos del dato a nivel conceptual son numéricos. Esto también puede apreciarse en otros elementos de los datos de bateadores.

4.1.4 Puntos de referencia

Concluidas las transformaciones hacia un formato de tabla HTML, procede la construcción de los puntos de referencia. En este caso enumerar cada celda de acuerdo a su posición en la tabla. Esto se logró con apoyo del siguiente archivo en formato XSL:

<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" indent="yes" /> <xsl:template match="table"> &lt;table&gt; <xsl:apply-templates select="tr"/> &lt;/table&gt; </xsl:template> <xsl:template match="tr">

&lt;tr tipo="<xsl:value-of select="@tipo"/>"&gt; <xsl:apply-templates select="td"/> &lt;/tr&gt; </xsl:template> <xsl:template match="td"> &lt;td columna="<xsl:number/>"&gt;<xsl:value-of select="."/>&lt;/td&gt; </xsl:template> </xsl:stylesheet>

Una vez obtenidas las coordenadas de cada celda, se aplicó la estrategia sobre la primera línea de los datos que contiene los encabezados de donde está colocada la información. La iteración sobre los datos de los bateadores arrojó los datos correctos, es decir, cada elemento se encontró en la columna esperada, como el equipo en la segunda columna. Este es un extracto del XSL elaborado:

<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" indent="yes" />

<xsl:template match="table"> &lt;Jugador&gt;

<xsl:apply-templates select="tr"/> &lt;/Jugador&gt;

<xsl:template match="tr"> <xsl:choose> <xsl:when test="@tipo='general'"> &lt;/Jugador&gt; &lt;Jugador&gt; <xsl:apply-templates select="td"/> </xsl:when> <xsl:otherwise> &lt;Datos&gt; <xsl:apply-templates select="td"/> &lt;/Datos&gt; </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="td"> <xsl:choose>

<xsl:when test = "../@tipo='general'"> <xsl:choose> <xsl:when test="@columna=1"> &lt;Nombre&gt;<xsl:value-of select="."/>&lt;Nombre&gt; </xsl:when> <xsl:when test="@columna=2"> &lt;Lado de bateo&gt;<xsl:value-of select="."/>&lt;Lado de bateo&gt; </xsl:when> <xsl:when test="@columna=3"> &lt;Tira&gt;<xsl:value-of select="."/>&lt;Tira&gt; </xsl:when> <xsl:when test="@columna=4"> &lt;Fecha de nacimiento&gt;<xsl:value-of select="."/>&lt;Fecha de nacimiento&gt; </xsl:when> <xsl:when test="@columna=5"> &lt;Lugar de nacimiento&gt;<xsl:value-of select="."/>&lt;Lugar de nacimiento&gt; </xsl:when> <xsl:when test="@columna=6"> &lt;Jugador&gt;<xsl:value-of select="."/>&lt;Jugador&gt; </xsl:when> </xsl:choose> </xsl:when>

<xsl:when test = "../@tipo='datos'">

&lt;td columna="<xsl:number/>"&gt;<xsl:value-of select="."/>&lt;/td&gt; </xsl:when> </xsl:choose> </xsl:template> ... </xsl:stylesheet>

Pero se presentó una ambigüedad en la tabla de lanzadores. Como se puede observar en la figura 4.2, la columna de IP en realidad abarca dos columnas en muchos renglones, mas no en todos. Esto es debido a que en la nomenclatura de la Enciclopedia del Beisbol Mexicano, cuando un lanzador no obtuvo los tres bateadores considerados “out”, se representa con fracciones de 3, pero en caso contrario, no se pone valor alguno. La forma de manejar este dato en particular se detalla en la siguiente sección.

La salida de la aplicación fueron documentos XML de la estructura de búsqueda conteniendo los datos que existían previamente en cada renglón. Retomando el ejemplo del bateador Jaime Abad:

<Jugador>

<Nombre>ABAD JAIME</Nombre>

<Lado de bateo>D/R</Lado de bateo> <Tira>D/R</Tira>

<Fecha de nacimiento></Fecha de nacimiento>

<Lugar de nacimiento>YANGA, VERACRUZ, MEXICO</Lugar de nacimiento> <Posición>OF<Posición> <Datos> <Año>1952</Año> <Equipo>AGUILA</Equipo> <PCT>.222</PCT> <Juegos>73</Juegos>

<Veces al bat>198</Veces al bat>

<Carreras Anotadas>30</Carreras Anotadas> <Hits>44</Hits>

<Total de bases>57</Total de bases> <Dobles>5</Dobles>

<Triples>4</Triples> <Homeruns>0</Homeruns>

<Carreras Producidas>15</Carreras Producidas> <Sacrificios>2</Sacrificios>

<Elevados de Sacrificio>*</Elevados de Sacrificio> <Golpeado>1</Golpeado>

<Bases por bola>14</Bases por bola>

<Bases intencionales>*</Bases intencionales> <Ponches>17</Ponches>

<Bases Robadas>4</Bases Robadas>

<Intentos de robo>*</Intentos de robo>

<Bateo para Doble play>0</Bateo para Doble play> <Slugging>.288</Slugging>

</Datos> ....

Solo se muestra un extracto por fines de ejemplificación.