Semelhança Wordnet em Java:JAWS, JWNL ou Java WN::Similaridade?
-
12-11-2019 - |
Pergunta
Preciso usar o Wordnet em um aplicativo baseado em java.Eu quero:
pesquisar synsets
encontrar semelhança/relacionamento entre synsets
Meu aplicativo usa gráficos RDF e sei que existem endpoints SPARQL com Wordnet, mas acho que é melhor ter uma cópia local do conjunto de dados, pois não é muito grande.
Encontrei os seguintes frascos:
- Biblioteca geral - MANDÍBULAS http://lyle.smu.edu/~tspell/jaws/index.html
- Biblioteca geral - JWNL http://sourceforge.net/projects/jwordnet
- Biblioteca de similaridade (Perl) - Wordnet::similaridade http://wn-similarity.sourceforge.net/
- Versão Java do Wordnet::similaridade http://www.cogs.susx.ac.uk/users/drh21/ (beta)
O que você recomendaria para meu aplicativo?
É possível usar uma biblioteca Perl de um aplicativo Java por meio de algumas ligações?
Obrigado!Mulone
Solução
Eu uso o JAWS para coisas normais do Wordnet porque é fácil de usar.Para métricas de similaridade, porém, eu uso a biblioteca localizada aqui.Você também precisará baixar esse pasta, contendo dados WordNet e corpus pré-processados, para que funcione.O código pode ser usado assim, supondo que você colocou essa pasta em outra chamada "lib" na pasta do seu projeto:
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");
Isto irá imprimir algo como o seguinte, mostrando a pontuação de similaridade entre cada combinação possível de synsets representados pelas palavras a serem comparadas:
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
Existem também métodos que permitem especificar qual sentido de uma ou de ambas as palavras: res(String word1, int senseNum1, String word2, partOfSpeech)
, etc.Infelizmente, a documentação fonte não é JavaDoc, então você precisará inspecioná-la manualmente.A fonte pode ser baixada aqui.
Os algoritmos disponíveis são:
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();
Além disso, é necessário que você tenha o arquivo jar do MIT JWI
Outras dicas
Há função nas mandíbulas para encontrar palavras semelhantes Aqui estão os detalhes:
adjetivesynset [] getsimilar () lança o WordNetException e aqui está link que você pode verificar: http://lyle.smu.edu/~tspell/jaws/doc/edu/smu/tspell/wordnet/adjetivesynset.html Este link ele contém detalhes que você pode usar.
Não tenho certeza se o JAWS ou o JWNL fornecem métodos para calcular a similaridade entre synsets, mas tentei ambos para pesquisar synsets e achei o JAWS mais fácil de usar.Especificamente, o simples:
// Specifying the Database Directory
System.setProperty("wordnet.database.dir", "C:/WordNet/2.1/dict/");
foi mais fácil para mim entender do que o requisito file_properties.xml do JWNL.