Es más fácil de entender los datos de WordNet mirando en los archivos Prolog. Están documentadas aquí:
http://wordnet.princeton.edu/wordnet/man/prologdb.5WN.html
WordNet términos son grupo en synsets. Un synset es un conjunto de sinónimos máximo de . Los sintonizadores tienen una clave primaria para que se puedan usar en relaciones semánticas.
Así que respondiendo a la primera pregunta, se puede enumerar los diferentes sentidos y sus correspondientes sinónimos de una palabra de la siguiente manera:
Input X: Term
Output Y: Sense
Output L: Synonyms in this Sense
s_helper(X,Y) :- s(X,_,Y,_,_,_).
?- setof(H,(s_helper(Y,X),s_helper(Y,H)),L).
Ejemplo:
?- setof(H,(s_helper(Y,'discouraged'),s_helper(Y,H),L).
Y = 301664880,
L = [demoralised, demoralized, discouraged, disheartened] ;
Y = 301992418,
L = [discouraged] ;
No
Para la segunda parte de su pregunta, Los términos de WordNet son secuencias de palabras. Así que usted puede buscar estos términos WordNet para las palabras de la siguiente manera:
Input X: Word
Output Y: Term
s_helper(X) :- s(_,_,X,_,_,_).
word_in_term(X,Y) :- atom_concat(X,' ',H), sub_atom(Y,0,_,_,H).
word_in_term(X,Y) :- atom_concat(' ',X,H), atom_concat(H,' ',J), sub_atom(Y,_,_,_,J).
word_in_term(X,Y) :- atom_concat(' ',X,H), sub_atom(Y,_,_,0,H).
?- s_helper(Y), word_in_term(X,Y).
Ejemplo:
?- s_helper(X), word_in_term('beat',X).
X = 'beat generation' ;
X = 'beat in' ;
X = 'beat about' ;
X = 'beat around the bush' ;
X = 'beat out' ;
X = 'beat up' ;
X = 'beat up' ;
X = 'beat back' ;
X = 'beat out' ;
X = 'beat down' ;
X = 'beat a retreat' ;
X = 'beat down' ;
X = 'beat down' ;
No
Esto le daría potenciales n-gramas, pero no tanto variación morfológica.WordNet también exhibe algunas relaciones léxicas , que podrían ser útiles.
Pero las dos consultas Prolog que he dado no son muy eficientes. El problema es la falta de indexación de algunas palabras. Una implementación Java podría, por supuesto, implementar algo mejor. Imagínese algo a lo largo:
class Synset {
static Hashtable<Integer,Synset> synset_access;
static Hashtable<String,Vector<Synset>> term_access;
}
Algunos Prolog puede hacer lo mismo, por una directiva de indexación, es posible indicar al sistema Prolog al índice en múltiples argumentos de un predicado.
La instalación de un servicio web no debería ser tan difícil, ya sea en Java o Prolog. Muchos sistemas Prologs permiten incrustar fácilmente programas Prolog en servidores web y servlets de campeones de Java.
Una lista de los prólogos que soportan los servidores web se puede encontrar aquí:
http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementations#Operating_system_and_Web-related_features
Saludos
Gracias por esta información, muy, muy útil. Pregunta rápida, todavía no estoy 100% seguro de esto, pero si es posible, ¿cuál sería la mejor manera de vincular programáticamente una palabra como "desalentado" a "golpear"? – NightWolf
Depende del "enlace" y del lenguaje de programación. En WordNet hay dos tipos de "enlaces", semánticos y léxicos. A través de Prolog, para un enlace semántico, afirmarías un enlace de hecho (synset_id1, synset_id2). Para un enlace léxico, debe afirmar un enlace de hecho (synset_id1, word_num1, synset_id2, word_num2). En Java usaría su estructura/servicio de datos apropiado. O coloque las dos palabras en el mismo synset, o cree un nuevo synset donde estén juntas. El último se aplica en caso de que su "enlace" represente el mismo sentido. –