Skip to content

Sección XI – Frases preposicionales

Andrea Cascallar Fuentes edited this page Sep 22, 2017 · 6 revisions

Volviendo al hecho de María persiguiendo un mono, vamos a añadir a la acción un escenario: "María persigue un mono en el parque".

La frase "en el parque" es una frase preposicional. Hay diversas formas de crear frases preposicionales con SimpleNLG-ES. Las más sencilla sería pasar la cadena de caracteres "en el parque" al método addComplement:

    SPhraseSpec p = nlgFactory.createClause("María", "perseguir", "un mono");
    p.addComplement("en el parque");

Sin embargo, una forma más sofisticada de crear esta frase preposicional sería especificar las partes de la frase preposicional -la preposición y la frase nominal- y combinarlas:

    NPPhraseSpec place = nlgFactory.createNounPhrase("el", "parque");
    PPPhraseSpec pp = nlgFactory.createPrepositionPhrase("en");
    pp.addComplement(place);

A continuación, añadimos la frase preposicional como un complemento a la frase "María persigue un mono".

    p.addComplement(pp);

A continuación se muestran tres formas diferentes de crear la frase preposicional "en el parque". La mejor manera de hacerlo depende de las necesidades de la aplicación.

  • Forma simple:

      p.addComplement("en el parque");
    
  • Forma semi-compleja:

      PPPhraseSpec pp = nlgFactory.createPrepositionPhrase("en", "el parque");
      p.addComplement(pp);
    
  • Forma compleja:

      NPPhraseSpec place = nlgFactory.createNounPhrase("el", "parque");
      PPPhraseSpec pp = nlgFactory.createPrepositionPhrase("en");
      pp.addComplement(place);
      p.addComplement(pp);
    

El tercer método requiere mucho más código que las otras dos formas. Entonces, ¿por qué elegiríamos el tercer método?

La razón principal es que el tercer método permite añadir partes a una frase o oración con mucha mayor facilidad. Tenemos que recordar que, habitualmente, SimpleNLG-ES se usará en un programa más grande que seleccione el contenido de la oración, y que el contenido se determinará probablemente de manera fragmentada. Es mucho más fácil añadir una palabra o una cláusula a una frase que se ha definido de forma modular en lugar de tener que añadir nueva información a una cadena monolítica cuyas partes no están diferenciadas. Por ejemplo, si quisiéramos describir el parque como "frondoso" y hubiéramos utilizado el tercer método para definir nuestra oración, lo único que tendríamos que hacer es escribir el siguiente código:

    place.addPreModifier("frondoso");

Si hubiéramos escogido el primer o segundo método, añadir el adjetivo 'frondoso' a la cadena 'parque' sería más complicado. Entre otras cosas, habría que escribir un código que:

  • Busque dónde insertar la nueva palabra. En la mayoría de los casos esto requeriría analizar la cadena, que no es una tarea sencilla.
  • Rompa la cadena en partes para permitir la inserción.
  • Inserte la palabra.
  • Determine si esa inserción requiere cambiar otras partes de la cadena.
  • Una de nuevo los trozos de la cadena de forma gramaticalmente correcta.

En otras palabras, habría que programar un realizador como SimpleNLG-ES.

Entonces, ¿por qué, dado el inconveniente mencionado anteriormente, podríamos optar por definir una oración utilizando los métodos 1 y 2? Porque a veces simplemente queremos generar texto enlatado, es decir, texto que sabemos que no necesitará ser ampliado o cambiado. Si simplemente queremos que la salida sea tal cual está, y sabemos que no vamos a cambiar una frase (como 'en el parque'), entonces tiene sentido tratarla como una entidad uniforme, como lo hacen los dos primeros métodos.

→ Para ver más ejemplos de frases preposicionales, ver testsrc/PrepositionalPhraseTest.java.