He estudiado algunas implementaciones simples de redes semánticas y técnicas básicas para analizar el lenguaje natural. Sin embargo, no he visto muchos proyectos que intenten cerrar la brecha entre los dos.Generación probabilística de redes semánticas
Por ejemplo, consideremos el diálogo:
"the man has a hat"
"he has a coat"
"what does he have?" => "a hat and coat"
Una red semántica simple, basado en el análisis del árbol de la gramática de las oraciones anteriores, podría parecerse a:
the_man = Entity('the man')
has = Entity('has')
a_hat = Entity('a hat')
a_coat = Entity('a coat')
Relation(the_man, has, a_hat)
Relation(the_man, has, a_coat)
print the_man.relations(has) => ['a hat', 'a coat']
Sin embargo, esta implementación supone el conocimiento previo de que los segmentos de texto "el hombre" y "él" se refieren a la misma entidad de red.
¿Cómo diseñaría un sistema que "aprenda" estas relaciones entre segmentos de una red semántica? Estoy acostumbrado a pensar en problemas de LD/NL basados en la creación de un conjunto sencillo de entrenamiento de pares de atributos/valores y en alimentarlo con un algoritmo de clasificación o regresión, pero tengo problemas para formular este problema de esa manera.
En última instancia, parece que tendría que superponer probabilidades sobre la red semántica, pero eso complicaría drásticamente una implementación. ¿Hay alguna técnica anterior en esta línea? He visto algunas librerías, como NLTK y OpenNLP, y si bien tienen herramientas decentes para manejar la lógica simbólica y analizar el lenguaje natural, ninguna parece tener ningún tipo de marco proabablilstic para convertir una a la otra.
PR-OWL parece interesante, ya que se han dado cuenta de que una red semántica utilizable debe manejar la incertidumbre. Sin embargo, nunca me gustó OWL porque nunca me quedó claro cómo reifican las entidades. Además, como mencionaste, el proyecto parece ser vapor en este punto sin código publicado. – Cerin