-
Notifications
You must be signed in to change notification settings - Fork 6
Sección XI – Frases preposicionales
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
.