Word Net-Synonymes de mots et constructions de mots connexes-Java ou Python


Je cherche à utiliser WordNet pour rechercher une collection de termes similaires à partir d'un ensemble de termes de base.

Par exemple, le mot 'découragé' - potentiel synonymes pourrait être la suivante: daunted, glum, deterred, pessimistic.

Je voulais également identifier les bi-grammes potentiels tels que; beat down, put off, caved in etc.

Comment puis-je extraire ces informations en utilisant Java ou Python? Existe-t-il des bases de données/interfaces Web WordNet hébergées qui permettraient une telle interrogation?

Merci!

Author: NightWolf, 2011-08-08

3 answers

Il est plus facile de comprendre les données WordNet en recherchant dans les fichiers Prolog. Ils sont documentés ici:

Http://wordnet.princeton.edu/wordnet/man/prologdb.5WN.html

Les termes WordNet sont regroupés en synsets. Un synset est un maximum synonyme ensemble. Les synsets ont une clé primaire afin qu'ils puissent être utilisés dans les relations sémantiques.

Donc, en répondant à votre première question, vous pouvez lister les différents sens et synonymes correspondants d'un mot comme suit:

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).  

Exemple:

?- setof(H,(s_helper(Y,'discouraged'),s_helper(Y,H),L).  
Y = 301664880,  
L = [demoralised, demoralized, discouraged, disheartened] ;  
Y = 301992418,  
L = [discouraged] ;  
No  

Pour la deuxième partie de votre question, les termes WordNet sont des séquences de mots. Vous pouvez donc rechercher les termes de ce WordNet pour les mots comme suit:

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).

Exemple:

?- 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

Cela vous donnerait des n-grammes potentiels, mais pas tellement variation morphologique. WordNet en expose également relations lexicales, ce qui pourrait être utile.

Mais les deux requêtes Prolog que j'ai données ne sont pas très efficaces. Le problème est le manque de certains mots indexer. Java la mise en œuvre pourrait bien sûr mettre en œuvre quelque chose de mieux. Imaginez quelque chose le long:

class Synset {  
    static Hashtable<Integer,Synset> synset_access;  
    static Hashtable<String,Vector<Synset>> term_access;  
}

Certains Prolog peuvent faire de même, par une directive d'indexation, c'est possibilité de demander au système Prolog d'indexer sur plusieurs arguments pour un prédicat.

Mettre en place un service Web ne devrait pas être si difficile non plus en Java ou en Prolog. De nombreux systèmes Prologs permettent facilement l'intégration Programmes Prolog dans les serveurs Web et les servlets Java champions.

Une liste de Prologs que les serveurs Web de soutien peuvent être trouvés ici:

Http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementations#Operating_system_and_Web-related_features

Meilleures salutations

 3
Author: j4n bur53, 2011-08-08 16:40:26

Ce sont deux problèmes différents.

1) Wordnet et python. Utilisez NLTK, il a une belle interface vers wordnet . Vous pourriez écrire quelque chose par vous-même, mais honnêtement, pourquoi rendre la vie difficile? Lingpipe a probablement aussi quelque chose intégré mais NLTK est beaucoup plus facile à utiliser. Je pense que nltk télécharge simplement une base de données ntlk, mais je suis sûr qu'il existe des API pour parler à wordnet.

2) Pour obtenir des bigrammes dans nltk suivez ce tutoriel. En général vous tokenize texte et puis juste parcourez la phrase en obtenant tous les n-grammes pour chaque mot en regardant en avant et en arrière.

 3
Author: nflacco, 2011-08-08 15:51:01

Comme alternative à NLTK, vous pouvez utiliser un des points de terminaison SPARQL WordNet disponibles pour récupérer ces informations. Exemple de requête:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX wordnet: <http://www.w3.org/2006/03/wn/wn20/schema/>

SELECT DISTINCT ?label {
  ?input_word a wordnet:WordSense;
     rdfs:label ?input_label.
  FILTER (?input_label = 'run')
  ?synset wordnet:containsWordSense ?input_word.
  ?synset wordnet:containsWordSense ?synonym.
  ?synonym rdfs:label ?label.
} LIMIT 100

En Java univers, Jena et Sésame cadres peuvent être utilisés.

 2
Author: Lev Khomich, 2011-08-08 16:39:17