Geração de Linguagem Natural em Java

Então galera, eu estou desenvolvendo um projeto onde eu preciso basicamente gerar descrições de modelos de classe em linguagem natural.

Eu precisava de basicamente três coisas:

  • Dado uma classe (substantivo simples ou composto) eu precisava saber qual o gênero dela, de forma a poder gerar frases como “Uma maçã (…)” mas “Um carro (…)”;
  • Poder obter o plural de um substantivo como “Homens” e “Carros”.
  • Dado um verbo no infinitivo eu precisava conjugar esse verbo de acordo com o tempo e a pluralidade, exemplo se eu tenho “Homem” e “fazer” no passado eu queria obter “O Homem fez (…)” e “Os homens fizeram” de acordo com a situação. Algo mais complicado mas também necessário seria poder inferir a forma no infinitivo do verbo a partir de outro tempo, por exemplo obter “ter” de “tem” e “fazer” de “fez”.

Alguém conhece algum framework/biblioteca em JAVA pra trabalhar com esse tipo de coisa? Eu andei dando uma pesquisada mas só achei coisa que processa em inglês, dentre eles tem o GF da IBM(Website), o SimpleNLG e o JWKTL.
Alguém com conhecimento sobre alguma dessas ferramentas pra pelo menos me dar uma luz se ela poderia atender aos meus desejos, ainda que sem suporte ao português?

Aliás, existe também o Language API do Google, que faz traduções e outros tipos de coisa, mas não sei se ele tem capacidade pra inferir todas as informações que eu precisava, alguém sabe me dizer?

Abraços

Não consegui entender por que você necessita de um framework para isso? Eu faço na mão mesmo!

Como você pode identificar o gênero na mão, por exemplo? Teria que ter por trás no mínimo um dicionário pra poder fazer isso.

Atualmente a minha geração tá sendo na mão também, mas fica algo do tipo “Um(a) árvore(s) possui(em) muitos(as) galho(s)”. Queria poder melhorar isso simplesmente, e também penso em poder estender futuramente pro inglês, de forma que seria melhor uma coisa mais robusta pra que eu não precise mexer no código.

Ai não entendi o que você quer. “Uma arvores possuem”? Não faz sentido

Eu faço assim:

Arvore umaArvore = Arvore.plantar(); Galhos galhos = umaArvore.possuiGalhos(); Folhas folhas = galhos.temFolhas(); ou poderia ser:

Arvores arvores = Arvores.plantar(); Galhos galhos = arvores.possuemGalhos(); Folhas folhas = galhos.temFolhas(); Ou você tem um objeto Arvore ou tem um objeto Arvores. São objetos distindos. Claro que você pode ter um conjunto de arvores representados por uma lista, mas o acesse é individual então:

  List<Arvore> arvores = Arvores.plantar(10);
  Arvore umaArvore = arvores .get(9);
  Galhos galhos = umaArvore.possuiGalhos();
  Folhas folhas = galhos.temFolhas();

Cara, você não entendeu o meu problema.

É tudo sobre gramática da língua portuguesa. O que eu tenho é uma String “Árvore” e uma String “possui”. Eu preciso saber a classificação gramatical das palavras dentro dessas strings pra poder fazer alguma coisa. Se eu sei que “Árvore” é um substantivo feminino eu posso dizer então “A Árvore”, e não “O Árvore”…

Da mesma forma se eu sei que “possui” vem do verbo “possuir” eu posso conjugar esse verbo pra terceira pessoa do plural, obtendo assim “possuem”. Dai se fosse o caso eu diria “As Árvores possuem”.

Tá claro ou não? Num tem nada a ver com ter a classe Java Árvore, Galhos, etc…

Agora eu entendi.
O problema está no seu título e na forma como você colocou no texto:

“Dado uma classe (substantivo simples ou composto)”.
“gerar descrições de modelos de classe”

O que você quer não tem nada haver então com linguagem natural sendo usado na programação então! O exemplo que te dei é como isso é feito em java e esse seria um modelo gerado. O que você necessita é:

[b] Dado um substantivo simples ou composto (uma string) eu precisava saber qual o gênero dela, de forma a poder gerar frases como “Uma maçã (…)” mas “Um carro (…)”;

  • Poder obter o plural de um substantivo como “Homens” e “Carros”.
  • Dado um verbo no infinitivo eu precisava conjugar esse verbo de acordo com o tempo e a pluralidade, exemplo se eu tenho “Homem” e “fazer” no passado eu queria obter “O Homem fez (…)” e “Os homens fizeram” de acordo com a situação. Algo mais complicado mas também necessário seria poder inferir a forma no infinitivo do verbo a partir de outro tempo, por exemplo obter “ter” de “tem” e “fazer” de “fez”.
    [/b]

Cara, não acretido que você vá encontrar nada parecido pronto em java para isso. Eu utilizaria duas abordagens para resolver esse problema!

  1. Utilizar um dicionáro de dados para saber o genêro e plural do substantivo. Para isso você pode utilizar o dicionário do open office ou algum dicionário online!
  2. Criar alguma ferramenta de conjugação de verbos com base nas regras gramaticais (tem esse livro do Pasquali que pode ajudar) ou utilizar alguma ferramenta online como o conjuga-me

Você precisa de uma lista das palavras da língua portuguesa com o gênero e suas flexões, ou seja:

cachorro - cadela - cachorros - cadelas

vender - vendo - vendes - vende - vendemos - vendeis - vendem - vendi - vendeste - vendeu …

http://www.ime.usp.br/~ueda/br.ispell/ para as palavras flexionadas.

(Não sei se o br.ispell também informa o gênero)

Pensei ter me expressado mal mesmo quando falei de classe, porque quis dizer a classe de um modelo/diagrama de domínio (ou seja, um conceito), como UML, por exemplo… Acabou confundindo com classe Java.

Mas certamente tem haver com geração de linguagem natural, tanto que o termo em inglês que está relacionado a esse assunto e eu sempre acho nas referências é Natural Language Generation (NLG).

De qualquer forma eu agradeço pela ajuda, era isso que eu precisa. Vou dar uma olhada nos links que vocês passaram pra ver se me atende e darei um retorno.

Abraços

[quote=vmsobral]Pensei ter me expressado mal mesmo quando falei de classe, porque quis dizer a classe de um modelo/diagrama de domínio (ou seja, um conceito), como UML, por exemplo… Acabou confundindo com classe Java.

Mas certamente tem haver com geração de linguagem natural, tanto que o termo em inglês que está relacionado a esse assunto e eu sempre acho nas referências é Natural Language Generation (NLG).

De qualquer forma eu agradeço pela ajuda, era isso que eu precisa. Vou dar uma olhada nos links que vocês passaram pra ver se me atende e darei um retorno.

Abraços[/quote]
Mais ou menos! Da forma como você colocou não. Linguagem natural está restrita ao ambito da linguagem que você aplica, se você usar UML para gerar um diagrama pode vir a ter problemas um exemplo considere a frase abaixo:

Uma arvore tem galhos que possuem folhas! A frase é uma afirmação porém se você passar isso para programação pode ficar algo dubio.

Nesse caso pronome “que” gera uma duvida a respeito da frase, afinal é uma afirmação ou uma pergunta? Nesse caso teria que ser analizado o tipo de retorno para saber o que está acontecendo e se tiver que fazer isso o propósito da linguagem natural se perde. Então você teria que usar duas frases simples:

Uma arvore tem galhos! Galhos possuem folhas! Isso geraria algo como:

Galhos = umaArvore.temGalhos(); Galhos.possuemFolhas();