CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 14 Dic 2019 22:52

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 10 mensajes ] 
Autor Mensaje
NotaPublicado: 24 Nov 2007 21:20 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
Le he echado un ojo a la rutina parsenoun y creo que sería interesante añadir como estándar la dependencia de los adjetivos de los nombres. Es decir:
Si tenemos el objeto:
Código:
object mesa "mesa de madera"
with name 'mesa',
adjectives 'madera',

...
tal como está, si el jugador escribe "EX MADERA"... le describe la mesa, cuando veo más lógico que sólo valore el léxico 'madera' cuando va acompañado de uno de los nombres del objeto.
De no querer usar esta funcionalidad bastaría con no usar adjetivos e incluir 'madera' como nombre. De otro modo ¿de qué nos sirve tener la propiedad adjectives? ¿por portabilidad? ¿por costumbre? Tal como está es un alias de name.

El Parsenoun completo modificado (con 5 cositas de nada) sería:

Código:
[ ParseNoun obj n m dudas seguir gen p aux;
    m=0;   ! número de nombres coincidentes*********
    n=0;   ! numero de palabras reconocidas de momento
    seguir=1;  ! seguir mirando palabras para ver si las siguientes
               ! se refieren a este mismo objeto

    aux=aux;
    #ifdef DEBUG;
    aux=debug_flag;
    debug_flag=0; ! Desactivar trazado de give (para no cansar con tanto 'nombreusado' cambiando continuamente)
    #endif;
!    #ifndef NI_BUILD_COUNT;
    give obj ~nombreusado; ! resetear nombreusado (quitar nombreusado)
    gen=5;    ! 1=masculino, 2=femenino,
              ! 3=masculino plural, 4= femenino plural
              ! 5=sin determinar
    while(seguir)
    {
    p=NextWord();
    if ((p=='de')&&(n==0)) return 0;
   
!     if (WordInProperty(p, obj, name))
!         ! Una palabra que se refiere al objeto
!     {
!         n++;        ! la contamos
!         n=n+dudas;        ! añadimos todos los "de" "la"...
!                 ! que estaban sin contar
!         dudas=0;        ! y resetamos el contador de "de"s
!         continue;        ! volvemos al while
!     }
    if (WordInProperty(p, obj, name_f))
        ! Una palabra que se refiere al objeto
    {
            if (p) dict_flags_of_noun = (p->#dict_par1) & $$01110100;
        if (gen==5) gen=G_FEMENINO;
            n++;        ! la contamos
      m++;      ! contamos un nombre ******
        n=n+dudas;        ! añadimos todos los "de" "la"...
                ! que estaban sin contar
        dudas=0;        ! y resetamos el contador de "de"s
!        print " --> es ahora femenino...." ; !infsp debug
        continue;        ! volvemos al while
    }
    if (WordInProperty(p, obj, name_mp))
        ! Una palabra que se refiere al objeto
    {
            if (p) dict_flags_of_noun = (p->#dict_par1) & $$01110100;
        if (gen==5) gen=G_MASCULINO+G_PLURAL;
            n++;        ! la contamos
      m++;      ! contamos un nombre ******
        n=n+dudas;        ! añadimos todos los "de" "la"...
                ! que estaban sin contar
        dudas=0;        ! y resetamos el contador de "de"s
        continue;        ! volvemos al while
    }
    if (WordInProperty(p, obj, name_fp))
    {
            if (p) dict_flags_of_noun = (p->#dict_par1) & $$01110100;
        if (gen==5) gen=G_FEMENINO+G_PLURAL;
            n++;        ! la contamos
      m++;      ! contamos un nombre ******
        n=n+dudas;        ! añadimos todos los "de" "la"...
                ! que estaban sin contar
        dudas=0;        ! y resetamos el contador de "de"s
        continue;        ! volvemos al while
    }
    ! [I7] se cambio de lugar este if para buscar el name_m (o name)
    ! en ultimo lugar, debido a una interferencia q provoca la asignacion 'automatica' de
    ! plural en los objetos I7
    if (WordInProperty(p, obj, name_m))
        ! Una palabra que se refiere al objeto
    {
            if (p) dict_flags_of_noun = (p->#dict_par1) & $$01110100;
        if (gen==5) gen=G_MASCULINO;
            n++;        ! la contamos
      m++;      ! contamos un nombre ******
        n=n+dudas;        ! añadimos todos los "de" "la"...
                ! que estaban sin contar
        dudas=0;        ! y resetamos el contador de "de"s
!        print " --> es ahora masculino...." ; !infsp debug
        continue;        ! volvemos al while
    }
    if (WordInProperty(p, obj, adjectives))
    {
            if (p) dict_flags_of_noun = (p->#dict_par1) & $$01110100;
            n++;        ! la contamos
        n=n+dudas;        ! añadimos todos los "de" "la"...
                ! que estaban sin contar
        dudas=0;        ! y resetamos el contador de "de"s
        continue;        ! volvemos al while
    }
       
    ! Si la palabra no fue reconocida, miraremos si se trata
    ! de 'de' o un artículo. En este caso mantenemos la duda y
    ! seguimos mirando palabras, hasta que una de ellas encaje
    ! en este objeto, en cuyo caso se retornan todas las que se
    ! han leido, o bien se encuentre una que no encaja en cuyo
    ! caso se retorna las que se habían encontrado antes del "de"

    else if (p== 'el' or 'la' or 'los' or 'las' or
         'de')
    {
        dudas++; continue;
    }       
    else seguir=0;   ! Si no fue reconocida, ni un articulo, ni "de"
             ! nos damos por vencidos
    }! while block
   
    if (obj provides gender)
        switch(gen)
        { ! Los casos del switch estaban mal.
          ! Bug corregido en 001030
          1: give obj ~female ~pluralname; !infsp fix for I7 compatibility (en I7 no se puede asignar el 0 a gender, de 1 para arriba, sí)
          2: give obj female ~pluralname;!print " FEMALE GIVEN "; !infsp debug
          3: give obj ~female pluralname;
          4: give obj female pluralname;
        }
    if (gen<5) give obj nombreusado;
!!    if (obj provides gender) obj.gender=gen; ! esta linea siempre esta comentariada
!    #ifnot; ! NI_BUILD_COUNT; Para I7 no trabajar con genero/numero de InformATE
!    while(seguir)
!    {
!    p=NextWord();
!    if ((p=='de')&&(n==0)) return 0;
!   
!    if (WordInProperty(p, obj, name))
!        ! Una palabra que se refiere al objeto
!    {
!        if (p) dict_flags_of_noun = (p->#dict_par1) & $$01110100;
!        n++;           ! la contamos
!        n=n+dudas;     ! añadimos todos los "de" "la"...
!                       ! que estaban sin contar
!        dudas=0;       ! y resetamos el contador de "de"s
!        continue;      ! volvemos al while
!    }
!       
!    ! Si la palabra no fue reconocida, miraremos si se trata
!    ! de 'de' o un artículo. En este caso mantenemos la duda y
!    ! seguimos mirando palabras, hasta que una de ellas encaje
!    ! en este objeto, en cuyo caso se retornan todas las que se
!    ! han leido, o bien se encuentre una que no encaja en cuyo
!    ! caso se retorna las que se habían encontrado antes del "de"
!
!    else if (p== 'el' or 'la' or 'los' or 'las' or
!         'de')
!    {
!        dudas++; continue;
!    }       
!    else seguir=0;   ! Si no fue reconocida, ni un articulo, ni "de"
!                     ! nos damos por vencidos
!    }
!    #endif; ! NI_BUILD_COUNT;
   
#ifdef DEBUG;
    debug_flag=aux;
#endif;
!    if (parser_trace >= 7) ! imprimir el buffer recibido
!    {
!          print "^[ ParseNoun:  ";
!          print "^      consulta por ", (the) obj, " --> palabras reconocidas ",n ;
!    }
if(m==0)return 0; !si no se ha detectado al menos un nombre, este objeto no nos vale **********
 
    return n;
    !return -1;
];   

Tan sólo se cuentan los nombres a parte, con la variable m, y al final se comprueba si ha habido al menos uno, de no ser así, se devuelve 0, objeto inválido.

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 25 Nov 2007 15:55 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 15 Ene 2005 22:26
Mensajes: 780
gracias Jarel por hilar tan fino.

ahora estoy de pasada por aqui, espero tener un tiempo mañana.

pero toma nota de la seccion del Documentate que habla sobre la propiedad Adjetivos.

veo si está semana seguimos con este hilo.

saludos!


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 26 Nov 2007 13:39 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
Sarganar escribió:
gracias Jarel por hilar tan fino.

ahora estoy de pasada por aqui, espero tener un tiempo mañana.

pero toma nota de la seccion del Documentate que habla sobre la propiedad Adjetivos.

veo si está semana seguimos con este hilo.

saludos!


Bien, porque resulta que si bien está en el manual, hubo un lapsus reconocido por Zak en el paso de una versión a otra y en la 6.10 de InformATE ya no estaba esa funcionalidad, de modo que Zak la añadió posteriormente de forma separada en la librería Intnombre.h

En infSP6 ignoro si se ha previsto de algún otro modo, pues esa librería no viene con el paquete y el parsenoun no da opción ni si quiera a determinar con una bandera si el jugador quiere un modo de parseado u otro ¿o sí con nombreusado, que se usa para priorizar un objeto sobre otro cuando de uno se ha escrito el nombre y del otro sólo alguno de sus adjetivos? Bastaría rematar con un:
Código:
if(NO_a_adjetivos_sin_nombre)if(m==0)return 0;

o con un
Código:
if(NO_a_adjetivos_sin_nombre)if(~~(nombreusado))return 0;

Pero con esta segunda opción nos cargamos la opción de que el jugador quiera admitir nombres y adjetivos y sólo priorizar los primeros en caso de duda.

Y ya no haría falta ni tener que usar una ampliación, pudiendo el programador determinar su deseo con esa bandera, e incluso cambiar en tiempo real el modo de parseado durante el transcurso del juego.

Saludos

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 26 Nov 2007 15:41 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 15 Ene 2005 22:26
Mensajes: 780
Hola!
En inform, el intento de interpretar (o parsear) el nombre de los objetos es el siguiente (la rutina TryGivenObject ( IntentarEncajarObjeto ) de parserm.h es la encargada de hacer esto):

* Usando la propiedad parse_name (o parse_nombre) del objeto. Asi, el nucleo de inform tambien consulta a la propiedad parse_name de todos los objetos del alcance. El primero que matchea es el objeto referido por el jugador. ¿Algun autor hispano usa esta filosofia?
* Luego de esta consulta, si no hubo exito, inform hace la llamada a la rutina general ParseNoun (Interpretar Nombre). La libreria inglesa tiene una rutina ParseNoun que no hace nada, quizas porque la filosofia de fabrica es que el parseo más flexible venga por el lado de una rutina particular (en cada objeto). Pero el punto de entada para una rutina general está contemplado, y ese es el que usa (aprovecha) informATE.
* y si no tienen exito las dos, se fija en la propiedad name (nombre) de los objetos, como ultima posibilidad.

Creo que asi es como funciona. Me diran los gurues si me equivoco.

Como nota curiosa: para dar mayor potencia al parseo, los guiris tiene la extension pname.h que incluso se mete con los adjetivos, pero siempre usando la propiedad parse_name heredada desde una clase. De ParseNoun ni se entera.


La parte que InformaTE 6/10 ya NO implementa es la posibilidad casi automatica de poner nosotros nuestra propia rutina Interpretar Nombre() [o ParseNoun, su equivalete en el ingles original], de la forma:

RutinaInterpretarNombre=NuevoInterpretarNombre; etc.


Eso solo era valido para informATE 6/7. No sé porqué después se sacó. (nota: deberia volar del DocumentATE?)

De todas formas, aun puedes definir tu PROPIA rutina ParseNoun, y ponerla antes de SpanishG.h (o Gramatica.h)
Fijate unas lineas más arriba de ParseNoun, alli dice:

Código:
#IFNDEF ParseNoun;
Constant Make__PN;
#ENDIF;
#IFDEF Make__PN;
[ ParseNoun

   blablabla;
];
#endif;



Ves? solo la carga si antes no se definió ya, como cualquier punto de entrada inform.



Ahora bien, todo lo demas respecto a adjetivos que dice el Documentate funciona bien en el informate actual e infsp6.
Quiero decir, la parte que dice...


[spoiler]En realidad, la librería InformATE ya suministra una rutina
InterpretarNombre para modificar el mecanismo estándar de parsing
que se acaba de describir.

La rutina InterpretarNombre suministrada por InformATE no sólo utiliza la propiedad nombre, sino también nombre_m, nombre_f, nombre_mp, nombre_fp y adjetivos, a la hora de decidir si una secuencia de palabras es aplicable a un objeto o no. Esta rutina es bastante complicada porque además de decidir si la secuencia de palabras se adapta al objeto, debe modificar el género de éste, según las palabras hayan sido halladas en la lista nombre_m, o nombre_f.

Básicamente, el mecanismo de parsing que usa esta función consiste en repetir el siguiente bucle:

1. Toma una palabra de las escritas por el jugador.
2. Si es "de", "el", "la", "los" y "las", la ignora provisionalmente (pero lleva la cuenta de las que ha ignorado) hasta llegar a una palabra que esté en alguna de las listas nombre_m, nombre_f, nombre_mp, nombre_fp o adjetivos
3. Si no encuentra la palabra en ninguna de esas propiedades, retorna el número de palabras comprendidas hasta ese punto (que será cero en la primera iteración de este bucle)
4. Si la encuentra en una, anota el género y número que se ha usado (a menos que esté en adjetivos, que no tiene género ni número). Anota también (en el atributo nombreusado del objeto), si la palabra has sido encontrada en una de las listas nombre (no anotará esto si sólo se encuentra en la lista de adjetivos).

Además, añade a la lista de palabras comprendidas las que había ignorado provisionalmente.
5. Vuelve al paso 1.

Aunque pueda parecer confuso, el mecanismo sirve para ignorar la palabra "de", y los artículos, siempre que estos aparezcan antes de alguna palabra referida al objeto. Así, si el objeto tiene en nombre 'caja' y en adjetivos 'madera', el parser comprenderá "CAJA DE MADERA", puesto que ignora "DE" por aparecer delante de la palabra "MADERA" que es una palabra válida para este objeto. Sin embargo, en la expresión SACA LA CAJA DE MADERA DE LA CESTA, la rutina sólo admitirá como referida a la caja, la expresión CAJA DE MADERA. Las palabras "DE LA" que la siguen, no se cuentan como válidas, pues no preceden a una palabra válida (puesto que la siguiente palabra que aparece es "CESTA", que no está en la lista nombre ni adjetivos de la caja.

La preposición "DEL" es convertida en "DE" antes incluso de que entre el parser, por lo que también es ignorada por este mecanismo.

Por otro lado, el mecanismo antes descrito acepta como buena una frase que sólo contenga adjetivos, si bien toma nota de este hecho, por si acaso otros objetos cercanos también "se dan por aludidos". Por ejemplo, imagina que tienes un objeto llamado "madera" (un trozo de madera) y otro llamado "caja de madera". Si en la misma localidad sólo se halla la caja de madera, puede parecer razonable admitir "MIRA MADERA" como una forma de referirse a la caja. Sin embargo, si están juntos la caja y el madero, parece que "MIRA MADERA" debería referirse al madero y no a la caja.

La forma en que InformATE resuelve esta ambigüedad consiste en admitir "provisionalmente" denominaciones que sólo usen el adjetivo, pero en caso de conflicto, dar prioridad a los objetos que han sido llamados por su nombre, en lugar de su adjetivo. Así, si el madero tiene 'madera' en su propiedad nombre, pero la caja sólo lo tiene en su propiedad adjetivos, entonces el madero tendrá prioridad sobre la caja cuando estén juntos y el jugador ponga "COGE MADERA".[/spoiler]


Que responde un poco a tu pregunta ¿de qué nos sirve tener la propiedad adjectives?
Creo que se intenta dar algo mas de inteligencia al parser cuando hay objetos como "madera" (un trozo de
madera) y otro llamado "caja de madera" en la misma localidad.

Por otro lado, ¿no crees que el parser deba aceptar como buena una frase que sólo contenga adjetivos?
Un buen punto a discutir, ¿qué piensan los demas?



Y, por supuesto, no funciona si no usamos la propiedad adjectives, y solo nos apañamos con poner todo en 'name'.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 26 Nov 2007 16:30 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 10 Sep 2004 00:17
Mensajes: 3039
Ubicación: Chile
Sarganar escribió:
Creo que se intenta dar algo mas de inteligencia al parser cuando hay objetos como "madera" (un trozo de
madera) y otro llamado "caja de madera" en la misma localidad.


En efecto. Yo lo uso así y no veas la de líos de desambiguación que me evito...

_________________
[Incanus]
El Escritorio - Blog Aventurero y Literario


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 26 Nov 2007 16:51 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 21:40
Mensajes: 1444
Ubicación: Nímgar, Ciudad Lunar
Creo que el tratamiento de adjetivos, aunque incompleto en informATE es muy necesario y en Inform no había nada.

_________________
Mel Hython
------------------
http://mel-hython.blogspot.com/


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 26 Nov 2007 21:31 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
Sarganar escribió:
Ahora bien, todo lo demas respecto a adjetivos que dice el Documentate funciona bien en el informate actual e infsp6.
Quiero decir, la parte que dice...


Buenas.
Yo me refería a la parte que viene a continuación:
Citar:
En la última versión de la librería InformATE, el programador puede elegir entre dos rutinas InterpretarNombre diferentes. La primera se comporta como acabamos de explicar. La nueva no permite que un nombre sea llamado usando solo el adjetivo, de modo que "COGE MADERA" nunca será entendido como una referencia a la caja de madera.


Primero dije por las bravas de reemplazar la "primera opción" y por defecto por la segunda alternativa, pero parece que no a todo el mundo le puede parecer mejor la otra.

En todo caso era sólo una sugerencia, y sigo pensando que no estaría mal introducirla con un "switch", de modo que en función del valor de esa bandera podamos anular el parseado tipo "no adjetivos si no hay nombres" o permitirlo, incluso jugar con él en unas situaciones u otras.

Saludos

PD: Por cierto, un poco de arqueología: hace 5 años...
http://es.groups.yahoo.com/group/informate/message/2478
... al final no se incluyó de serie.

PD2: ¿hace una encuesta: adjetivos SÍ-adjetivos NO? :lol:

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Nov 2007 12:18 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 07 Sep 2004 21:52
Mensajes: 1897
No, encuestas no por favor, Jarel. Yo me sumo a los que opinan que NO se toque adjetivos tal y como está. Es necesario para desambiguar, y para que el parser pueda referirse a objetos directamente por el adjetivo, imagina: Caja roja, amarilla o azul.

>examina la roja.
Es roja.

Perfecto, funciona muy bien, y corríjeme si me equivoco pero tu querrías que el parseado en ese sentido fuese más estricto, y no gracias.

De todas formas informATE! incluía opciones que desconozco para tunear el parser, y hacerlo más a tu gusto, ¿quizás Infixe o Intnombre o alguna de esas librerías que jamás he usado? ¿Estarán convenientemente documentadas?

De todas formas siempre puedes "pasar" de adjetivos. En Inform6 en guirilandia llevan 10 años sin tener adjetivos, y en inform 7 sigue sin haber, por tanto, si no te gustan, puedes obviarlos de fácil manera.

Chao

Urba.
¡Salvemos a los adjetivos!

_________________
Ruber "Urbatain" Eaglenest.
------------------------
http://www.indieorama.com/author/rubereaglenest/


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Nov 2007 13:31 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 15 Ene 2005 22:26
Mensajes: 780
Hey Jarel!

no sabia del trasfondo historico de esa variante de ParserNoun.

¿Puedes encargarte de hacer una version para infsp6 de la IntNombre.h? Asi la incluimos en el pack de extensiones I6.

Saludos!


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Nov 2007 16:00 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
Sarganar escribió:
Hey Jarel!

no sabia del trasfondo historico de esa variante de ParserNoun.

¿Puedes encargarte de hacer una version para infsp6 de la IntNombre.h? Asi la incluimos en el pack de extensiones I6.

Saludos!


Te lo he enviado a tu dirección de gmail.
Y vaya, no había caído en lo de las preguntas de duda del parser. Con este cambio en lugar de responder "el de madera" o "el azul"
tendremos que responder también con el nombre.

Saludos

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 10 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM