5

I am using java jwi API for searching the wordnet to get the synonyms of a word. The problem is that it only gives me one result the word to find its synonyms itself. Please guide me. Is it possible to get the list of all possible synonyms of a given word? My code is:

  public void searcher() {
    try {

        url = new URL("file", null, path);


        dict = new Dictionary(url);
        try {
            dict.open();
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "Dictionary directory does not exist\n" + ex + "\nClass:Meaning Thread", "Dictionary Not Found Error", JOptionPane.ERROR_MESSAGE);

        }

        IIndexWord idxWord = dict.getIndexWord("capacity", POS.NOUN);
        IWordID wordID = idxWord.getWordIDs().get(0);
        IWord word = dict.getWord(wordID);


        //Adding Related Words to List of Realted Words
        ISynset synset = word.getSynset();
        for (IWord w : synset.getWords()) {
            System.out.println(w.getLemma());
        }


    } catch (Exception e) {
    }

}

The output is only:

capacity

itself! The actual synonyms must be:

  capability
  capacitance 
  content
  electrical capacitance
  mental ability...(so on)

So is there anything I missed in the code or can somebodygive me any ideas what is the real problem?

Thanks in advance

demongolem
  • 9,474
  • 36
  • 90
  • 105
Java Nerd
  • 958
  • 3
  • 19
  • 51

3 Answers3

4

So, here comes the answer i use Java JAWS for wordnet searching! The steps are:

    1- Download WordNet Dictionary from 

Here

    2- Install WordNet
    3- Go to Installed Directory and copied the WordNet Directory (in my case C:\Program Files (x86) was the Directory for WordNet Folder)
    4- Pasted it into my Java Project (under MyProject>WordNet)
    5- Making Path to the directory as:
       File f=new File("WordNet\\2.1\\dict");
       System.setProperty("wordnet.database.dir", f.toString());
    6- Got Synonyms as:

       public class TestJAWS{
              public static void main(String[] args){
                    String wordForm = "capacity";
                    //  Get the synsets containing the word form=capicity

                   File f=new File("WordNet\\2.1\\dict");
                   System.setProperty("wordnet.database.dir", f.toString());
                   //setting path for the WordNet Directory

                   WordNetDatabase database = WordNetDatabase.getFileInstance();
                   Synset[] synsets = database.getSynsets(wordForm);
                   //  Display the word forms and definitions for synsets retrieved

                   if (synsets.length > 0){
                      ArrayList<String> al = new ArrayList<String>();
                      // add elements to al, including duplicates
                      HashSet hs = new HashSet();
                      for (int i = 0; i < synsets.length; i++){
                         String[] wordForms = synsets[i].getWordForms();
                           for (int j = 0; j < wordForms.length; j++)
                           {
                             al.add(wordForms[j]);
                           }


                      //removing duplicates
                       hs.addAll(al);
                       al.clear();
                       al.addAll(hs);

                      //showing all synsets
                      for (int i = 0; i < al.size(); i++) {
                            System.out.println(al.get(i));
                      }
                   }
              }
              }
              else
              {
               System.err.println("No synsets exist that contain the word form '" + wordForm + "'");
              }
       } 

The Thing is you must have jaws-bin.jar

Java Nerd
  • 958
  • 3
  • 19
  • 51
  • how can i handle wordnetexception. I try inputting other keywords like light or ball it throws the wordnet exception. btw, you have extra bracket for your if condition – Chit Khine Feb 08 '18 at 03:58
  • the exception is like "An error occurred parsing the synset data: : 00292635 30 v 05 light 0 illume 0 illumine 0 light_up 0 illuminate 3 012 @ 00281690 v 0000 + 14006632 n 0501 + 05025708 n 0502 + 14711674 n 0501 + 14006789 n 0101 + 04958550 n 0101 + 08663763 n 0101 + 05025269 n 0106 + 03670692 n 0101 + 11494354 n 0101 ~ 00293009 v 0000 ~ 00293130 v 0000 02 + 08 00 + 11 00 | make lighter or brighter; "This lamp lightens the room a bit" – Chit Khine Feb 08 '18 at 04:11
2

What you are getting is "capacity#1", which has the meaning of "capability to perform or produce", and it does indeed only have one synonym. (Play around with the PWN search page to get a feel for how WordNet organizes the words into synsets.)

It sounds like what you are after is the union of all synonyms in all the synsets? I think you either use getSenseEntryIterator(), or simply put a loop around idxWord.getWordIDs().get(0);, replacing the 0 with the loop counter, so you are not only ever getting the first item in the array.

Darren Cook
  • 27,837
  • 13
  • 117
  • 217
  • could you call getSenseEntryIterator() for every POS for a given word? Or would that be repetitive? – 219CID Dec 21 '20 at 17:59
  • 1
    @219CID Yes, I guess if you want every synonym for every possible part of speech, you'd add an outer loop, that will iterate through each POS tag. – Darren Cook Dec 21 '20 at 21:55
  • Thank you, I had success doing this and was able to get these unique synonyms for capacity: CAPABILITY CONTENT CAPACITANCE ELECTRICALCAPACITY MENTALABILITY – 219CID Dec 22 '20 at 03:56
  • I am wondering if you could take a look at this related JWI/WordNet question: https://stackoverflow.com/questions/65403290/get-antonyms-for-a-word-in-java-wordnet-jwi – 219CID Dec 23 '20 at 02:22
1

If you want to use JWI and want to fetch more than 1 synonym then change your code from this exact spot:

IIndexWord idxWord = dict.getIndexWord(inputWord, POS.NOUN);
        try {
            int x = idxWord.getTagSenseCount();
            for (int i = 0; i < x; i++) {
                IWordID wordID = idxWord.getWordIDs().get(i);
                IWord word = dict.getWord(wordID);

                // Adding Related Words to List of Realted Words
                ISynset synset = word.getSynset();
                for (IWord w : synset.getWords()) {
                    System.out.println(w.getLemma());
                    // output.add(w.getLemma());
                }
            }
        } catch (Exception ex) {
            System.out.println("No synonym found!");
        }

It works perfectly fine.