• No results found

As part of the ShipService WSDL, you may add additional elements to your

In document Track Service. July 2011 (Page 39-130)

B.2 Paso Dos: Las relaciones de Extended

WordNet 2.0

Añadir las relaciones 'gloss' que proporciona eXtended WordNet no va a ser una tarea fácil. Por un lado, dichas relaciones no se encuentran en el MCR. Para conseguirlas, es necesario descargar la información de internet. Por otro lado, la información esta almacenada en un formato diseñado en XML, en archivos separados para nombres, verbos, adjetivos y adverbios. Para conseguir extraer esta información creamos una hoja de estilo XSLT que transforme esta información en una página html sencilla:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/">

<html> <head>

B.2. Paso Dos: Las relaciones de Extended WordNet 2.0 Proyecto Fin de Carrera </head> <body> <xsl:for-each select="/glosses/gloss"> <xsl:for-each select="./wsd/wf[@quality]"> <xsl:value-of select="../../@synsetID"/> <xsl:choose> <xsl:when test="../../@pos='NOUN'"> n </xsl:when> <xsl:when test="../../@pos='VERB'"> v </xsl:when> <xsl:when test="../../@pos='ADJ'"> a </xsl:when> <xsl:when test="../../@pos='ADV'"> r </xsl:when> </xsl:choose> # <xsl:value-of select="@lemma"/> <xsl:choose>

<xsl:when test="@pos='NN' or @pos='NNS' or @pos='NNP' or @pos='NNPS'">

n

</xsl:when>

<xsl:when test="@pos='VB' or @pos='VBD' or @pos='VBG' or @pos='VBN' or @pos='VBP' or @pos='VBZ'">

v

</xsl:when>

<xsl:when test="@pos='JJ' or @pos='JJR' or @pos='JJS'"> a

</xsl:when>

<xsl:when test="@pos='RB' or @pos='RBR' or @pos='RBS'"> r </xsl:when> </xsl:choose> <xsl:value-of select="@wnsn"/> <BR/> </xsl:for-each> <BR/> </xsl:for-each> </body>

B. Creando el Grafo WN2.0+XWN2.0 para Boost::Graph Proyecto Fin de Carrera

</html>

</xsl:template> </xsl:stylesheet>

La información que devuelve esta hoja de estilo tiene este formato: [synset origen] [PoS origen] # [lemma] [sentido]

Ejemplo de glosa formateada de total.gloss:

00001740 a # usually r 1 00001740 a # follow v 1 00001740 a # have v 1 00001740 a # necessary a 1 00001740 a # means n 1 00001740 a # skill n 2 00001740 a # know-how n 1 00001740 a # authority n 1 00001740 a # do v 3 00001740 a # something n 1

La última fase es la más complicada del proceso, ya que a la hora de consultar los términos que hemos extraído con lemma y sentido, no siempre conseguimos una identificación exitosa. La razones para no encontrar un synset determinado pueden ser varias. Lo más común es que alguno de los términos que se consultaban necesitaban alguna letra en mayúsculas, y nuestra fuente de datos nos daba todos los términos en minúsculas. Sin embargo en una pequeña minoría de casos, un término sencillamente no se encontraba en la base de datos.

El script que devuelve un archivo de texto 'all' similar al que hemos visto en el paso uno para WordNet va a realizar una serie de refinamientos sucesivos en las consultas hasta conseguir que el número de términos que perdemos sea mínimo. El resultado de este proceso es que de 607260 palabras para consultar, 1236 no han sido posible de identificarlas en WordNet porque sus synset (offset-pos) no eran encontradas en la base de datos. El porcentaje de pérdidas es del 0,2035372 %

B.2. Paso Dos: Las relaciones de Extended WordNet 2.0 Proyecto Fin de Carrera

#!/usr/bin/perl -w

use strict;

use DBI;

use Boost::Graph;

my $db = DBI->connect("DBI:mysql:database=mcr3;host=localhost", "root", "sobresaliente");

my $t; my $line = ""; my @list; my $count=0; sub SynsetsSenses { my $w = $_[0]; my $p = $_[1]; my $sense = $_[2]; my $s;

my $query = "SELECT * FROM `wei_en20_variant` WHERE `word` LIKE CONVERT(_utf8 '$w'

USING latin1) COLLATE latin1_bin AND `pos` = '$p' AND `sense` = '$sense'";

my $st = $db->prepare($query); $st->execute(); my $r = $st->fetchrow_hashref(); if (defined $r){ $s = $r->{offset}."-".$p; } else { $s = ""; } return $s; }

open (GLOSS, "< total.gloss") or die "\nUnable to open the source file \"total.gloss\"\n";

open (OUT, "> total.all") or die "\nUnable to create the target file \"total.all\"\n";

my $counter = 0;

while($line = <GLOSS>){

chomp $line;

$counter ++;

@list = split / /, $line;

$list[3] =~ s/\'/\'\'/;

$t = &SynsetsSenses($list[3], $list[4], $list[5]);

if ($t ne ""){

print OUT $list[0]."-".$list[1]." ".$t." 69 xn\n"; } else { # fase de refinamiento

B. Creando el Grafo WN2.0+XWN2.0 para Boost::Graph Proyecto Fin de Carrera

my $letter = chop($singular);

$t = &SynsetsSenses($singular, $list[4], $list[5]);

if ($t ne ""){ print OUT $list[0]."-".$list[1]." ".$t." 69 xn\n"; next; } # refinamiento para mayúsculas al principio

my $word = ucfirst($list[3]);

$t = &SynsetsSenses($word, $list[4], $list[5]);

if ($t ne ""){ print OUT $list[0]."-".$list[1]." ".$t." 69 xn\n"; next; } # refinamiento para el término especial 'pH'

if ($list[3] eq "ph"){

$t = &SynsetsSenses("pH", $list[4], $list[5]);

if ($t ne ""){ print OUT $list[0]."-".$list[1]." ".$t." 69 xn\n";

next; }

}

# refinamiento para palabras con guión

my @guion = split /_/, $list[3];

if (@guion > 1) {

for (my $i=0;$i<@guion;$i++){

unless ($guion[$i] eq "of" or $guion[$i] eq "the" or

$guion[$i] eq "a" or $guion[$i] eq "and" or $guion[$i] eq "de" or $guion[$i] eq "on" or

$guion[$i] eq "al" or $guion[$i] eq "at" or

$guion[$i] eq "family" or $guion[$i] eq "order" or

$guion[$i] eq "genus" or $guion[$i] eq "class" or $guion[$i] eq "phylum" or $guion[$i] eq "division" or

$guion[$i] eq "subfamily" or $guion[$i] eq "suborder" or $guion[$i] eq "subgenus" or $guion[$i] eq "subclass" or $guion[$i] eq "subphylum" or

$guion[$i] eq "subdivision" or

$guion[$i] eq "western" or $guion[$i] eq "eastern" or

$guion[$i] eq "northern" or $guion[$i] eq "southern" or

$guion[$i] eq "southwestern" or $guion[$i] eq "southeastern" or $guion[$i] eq "northwestern" or $guion[$i] eq "northeastern") {

$guion[$i] = ucfirst($guion[$i]); }

# voy a tratar aquí los números romanos

my $romans = $guion[$i];

$romans =~ tr/vicxVICX//d;

B.2. Paso Dos: Las relaciones de Extended WordNet 2.0 Proyecto Fin de Carrera

} }

$word = join "_", @guion;

$t = &SynsetsSenses($word, $list[4], $list[5]);

if ($t ne ""){ print OUT $list[0]."-".$list[1]." ".$t." 69 xn\n";

next; }

}

# refinamiento para iniciales (todas las letras en mayúsculas)

my $initials = $list[3];

$initials =~ tr/[a-z]/[A-Z]/;

$t = &SynsetsSenses($initials, $list[4], $list[5]);

if ($t ne ""){ print OUT $list[0]."-".$list[1]." ".$t." 69 xn\n"; next; } # rama para mostrar los términos infructuosos

print "The seek in line ".$counter." is failed for ".$list[3]." ".$list[4]." ".$list[5]." \n";

$count++; }

}

print "Not formatted ".$count." words from the gloss.\n";

close GLOSS;

close OUT;

In document Track Service. July 2011 (Page 39-130)

Related documents