WordNet similitude dans Java: Jaws, JWNL ou Java WN :: similitude?
-
12-11-2019 - |
Question
J'ai besoin d'utiliser WordNet dans une application basée sur Java. Je veux:
Recherchez des syndriets
Trouvez la similitude / la parenté entre les syndsets
Mon application utilise des graphiques RDF et je sais qu'il existe des points de terminaison SPARQL avec WordNet, mais je suppose qu'il est préférable d'avoir une copie locale de l'ensemble de données, car ce n'est pas trop grand.
J'ai trouvé les pots suivants:
- Bibliothèque générale - MÂCHOIRES http://lyle.smu.edu/~tspell/jaws/index.html
- Bibliothèque générale - Jwnl http://sourceforge.net/projects/jwordnet
- Bibliothèque de similitude (Perl) - WordNet :: similitude http://wn-similarity.sourceforge.net/
- Version Java de WordNet :: similitude http://www.cogs.susx.ac.uk/users/drh21/ (bêta)
Que recommanderiez-vous pour mon application?
Est-il possible d'utiliser une bibliothèque Perl à partir d'une application Java via quelques liaisons?
Merci! Mulone
La solution
J'utilise des mâchoires pour des trucs WordNet normaux car il est facile à utiliser. Pour des mesures de similitude, cependant, j'utilise la bibliothèque située ici. Vous devrez également télécharger cette Dossier, contenant des données WordNet et Corpus prétraitées, pour qu'elle fonctionne. Le code peut être utilisé comme celui-ci, en supposant que vous avez placé ce dossier dans un autre appelé "lib" dans votre dossier de projet:
JWS ws = new JWS("./lib", "3.0");
Resnik res = ws.getResnik();
TreeMap<String, Double> scores1 = res.res(word1, word2, partOfSpeech);
for(Entry<String, Double> e: scores1.entrySet())
System.out.println(e.getKey() + "\t" + e.getValue());
System.out.println("\nhighest score\t=\t" + res.max(word1, word2, partOfSpeech) + "\n\n\n");
Cela imprimera quelque chose comme celui qui suit, montrant le score de similitude entre chaque combinaison possible de syndriets représentés par les mots à comparer:
hobby#n#1,gardening#n#1 2.6043996588901104
hobby#n#2,gardening#n#1 -0.0
hobby#n#3,gardening#n#1 -0.0
highest score = 2.6043996588901104
Il existe également des méthodes qui vous permettent de spécifier quel sens des deux mots: res(String word1, int senseNum1, String word2, partOfSpeech)
, etc. Malheureusement, la documentation source n'est pas Javadoc, vous devrez donc l'inspecter manuellement. La source peut être téléchargée ici.
Les algorithmes disponibles sont:
JWSRandom(ws.getDictionary(), true, 16.0);//random number for baseline
Resnik res = ws.getResnik();
LeacockAndChodorowlch = ws.getLeacockAndChodorow();
AdaptedLesk adLesk = ws.getAdaptedLesk();
AdaptedLeskTanimoto alt = ws.getAdaptedLeskTanimoto();
AdaptedLeskTanimotoNoHyponyms altnh = ws.getAdaptedLeskTanimotoNoHyponyms();
HirstAndStOnge hso = ws.getHirstAndStOnge();
JiangAndConrath jcn = ws.getJiangAndConrath();
Lin lin = ws.getLin();
WuAndPalmer wup = ws.getWuAndPalmer();
En outre, cela vous oblige à avoir le fichier JAR pour le MIT JWI
Autres conseils
Il y a une fonction dans les mâchoires pour trouver des formes de mots similaires voici des détails:
public adjectiveSynset [] getImilar () lève WordNetException et voici le lien que vous pouvez consulter: http://lyle.smu.edu/~tspell/jaws/doc/edu/smu/tspell/wordnet/adjectifynset.htmlCe lien qu'il contient des détails que vous pouvez utiliser.
Je ne sais pas si JAWS ou JWNL fournissent des méthodes pour calculer la similitude entre les sysets, mais j'ai essayé les deux pour la recherche de syntèmes de syntèmes et j'ai trouvé des mâchoires plus faciles à utiliser. Plus précisément, le simple:
// Specifying the Database Directory
System.setProperty("wordnet.database.dir", "C:/WordNet/2.1/dict/");
J'étais plus facile pour moi de comprendre que l'exigence de fichier_properties.xml de JWNL.