MIT Java Wordnet Interface
JWI是一个java实现的与Wordnet交互的工具包,通过JWI我们可以搜索词form对应的词汇(具有具体语义)及其synset,gloss,上下级词汇等。
Getting Started
JWI交互的主要接口是edu.mit.jwi.IDictionary,标准实现类为edu.mit.jwi.Dictionary,我们可以通过指定Wordnet所在的位置的url简单的初始化一个Dictionary。
1 | public void testDictionary() throws IOException { |
1 | Id = WID-2084071-n-?-dog |
为了提高速度,JWI2.2提供了一个新的IDicitionary实现类:edu.mit.jwi.RAMDictionary,允许将整个Dicitionary加载到RAM中,
1 | public void testRAMDictionary(File wnDir) throws Exception { |
1 | Treking across Wordnet...........................done (3467 msec) In my trek I saw 522858 words |
需要注意的是,JWI要求作为参数的传入必须是词的词根root,否则可能会无法返回在wordnet正确的词汇,比如dog,我们应该传入dog
作为参数,dogs
则有可能会导致结果有误。我们可以通过edu.mit.jwi.morph.WordnetStemmer来过来的词root,之后以此输入词典进行查找。
Retrieve synonyms
也就是取得一个term的某种语义意思的synset中的其他词汇。
1 | public void getSynonyms(IDictionary dict){ |
1 | dog |
Get the synonym number(in all possible synset)
1 | public static int getSynonymsNumber(String term) { |
Retrieve hypernyms
各个synset之间通过semantic pointers指针联系在一起,其中最常见的是Hyoernym pointer(上级指针),也就是指向一个更加general的synset。我们可以通过调用synset getRelatedSynsets(IPointer)。
1 | public void getHypernyms(IDictionary dict) { |
1 | SID-2083346-n {canine, canid} |
Lexical pointers and Sematic pointers
Wordnet中存在两种指针,一种是在synset之间的semantic指针,一种是word form之间的lexical pointers,这些指针在JWI的枚举类Pointer,但在使用时,我们应该使用合适的类的合适的方法种使用合适的pointer,比如为了获得synset的具有某种关系synset,我们应该调用ISynset.getRelatedSynsets(IPointer) method,其中IPointer类型指名了这种关系,如上面使用的Pointer.HYPERNYM)。为了获得词的具有某种关系的相关词汇,我们应该使用IWord.getRelatedWords(IPointer) method,同样其中IPointer类型指名了这种关系。如果我们传递了一个lexical pointer(比如Pointer.DERIVED)到getRelatedSynsets method,则我们无法得到任何结果。
这两种关系在Wordnet的documentation并没有解释的很清楚,下面是一个很好的说明例子。我们可以看到,在JWI种,lexical pointer只存在与IWord对象间,而semantic pointer只存在于ISynset objects。没有指针连接word和synset。所以我们只能查找synset的hypernyms,而不能直接查找word的hypernyms,同样我们只能查找word的derived form,synset没有其derived synset。
存在的一个问题是,wordnet documentation并没有说明哪些指针是semantic pointer,哪些指针是lexical pointer,哪些同时是semantic pointer和lexical pointer。JWI文档给出了一个基于统计的各个pointer的使用类型情况,如下图所示。