初识WordNet

WordNet是什么

  首先,来看WordNet。搜了一下相关介绍:

  WordNet是一个由普林斯顿大学认识科学实验室在心理学教授乔治·A·米勒的指导下建立和维护的英语字典。开发工作从1985年开始,从此以后该项目接受了超过300万美元的资助(主要来源于对机器翻译有兴趣的政府机构)。

  由于它包含了语义信息,所以有别于通常意义上的字典。WordNet根据词条的意义将它们分组,每一个具有相同意义的字条组称为一个synset(同义词集合)。WordNet为每一个synset提供了简短,概要的定义,并记录不同synset之间的语义关系。

WordNet的开发有两个目的:

    它既是一个字典,又是一个辞典,它比单纯的辞典或词典都更加易于使用。

    支持自动的文本分析以及人工智能应用。

WordNet内部结构

    在WordNet中,名词,动词,形容词和副词各自被组织成一个同义词的网络,每个同义词集合都代表一个基本的语义概念,并且这些集合之间也由各种关系连接。(一个多义词将出现在它的每个意思的同义词集合中)。在WordNet的第一版中(标记为1.x),四种不同词性的网络之间并无连接。WordNet的名词网络是第一个发展起来的。

名词网络的主干是蕴涵关系的层次(上位/下位关系),它占据了关系中的将近80%。层次中的最顶层是11个抽象概念,称为基本类别始点(unique beginners),例如实体(entity,“有生命的或无生命的具体存在”),心理特征(psychological feature,“生命有机体的精神上的特征)。名词层次中最深的层次是16个节点。(wikipedia)

通俗地来说,WordNet是一个结构化很好的知识库,它不但包括一般的词典功能,另外还有词的分类信息。目前,基于WordNet的方法相对来说比较成熟,比如路径方法 (lch)、基于信息论方法(res)等。(详见原文参考文献)

安装WordNet

因为我是用的windows,所以讲一下windows的安装方法。

WordNet官方下载地址:http://wordnet.princeton.edu/wordnet/download/current-version/,此处可以选择操作系统对应的版本。

下载下来之后就是普通的安装。

使用WordNet

java可以使用JWIJAWS提供的接口,这两个项目分别隶属于mit和msu,对应不同的文档和使用方法。

JWI:

下载地址及文档地址:http://projects.csail.mit.edu/jwi/
一下代码可以获得动词go的近义词。

import java.io.File;
import java.io.IOException;
import java.net.URL;

import edu.mit.jwi.Dictionary;
import edu.mit.jwi.IDictionary;
import edu.mit.jwi.item.IIndexWord;
import edu.mit.jwi.item.ISynset;
import edu.mit.jwi.item.IWord;
import edu.mit.jwi.item.IWordID;
import edu.mit.jwi.item.POS;

public class GetWordSynsetsTest {
    private static String WORDNET_PATH = "D:\\Programming\\WordNet\\dict";

    public static void main(String[] args) throws IOException{
        File wnDir=new File(WORDNET_PATH);
        URL url=new URL("file", null, WORDNET_PATH);
        IDictionary dict=new Dictionary(url);
        dict.open();//打开词典
        getSynonyms(dict); //testing
    }

    public static void getSynonyms(IDictionary dict){
        // look up first sense of the word "go"
        //IIndexWord idxWord2 = dict.
        IIndexWord idxWord =dict.getIndexWord("go", POS.VERB);
        IWordID wordID = idxWord.getWordIDs().get(0) ; // 1st meaning
        IWord word = dict.getWord(wordID);
        ISynset synset = word.getSynset (); //ISynset是一个词的同义词集的接口

        // iterate over words associated with the synset
        for(IWord w : synset.getWords())
            System.out.println(w.getLemma());//打印同义词集中的每个同义词
    }
}

运行结果为:

travel 
 go 
 move 
 locomote

JAWS

下载地址及文档地址:http://lyle.smu.edu/~tspell/jaws/

import edu.smu.tspell.wordnet.Synset;
import edu.smu.tspell.wordnet.WordNetDatabase;

public class TestJAWS {
    private static String WORDNET_PATH = "D:\\Programming\\WordNet\\dict";
    public static void main(String[] args)
    {
        String[] arguments = new String[args.length+1];
        for(int i = 0 ; i <= args.length; i++) {
            if(i == args.length) {
                arguments[i] = "fly";
            }
            else {
                arguments[i] = args[i];
            }
        }

        if (arguments.length > 0)
        {
            //在CODE上查看代码片派生到我的代码片
            //下面的代码制定wordnet数据库的位置
            //在CODE上查看代码片派生到我的代码片
            System.setProperty("wordnet.database.dir", WORDNET_PATH);
            StringBuffer buffer = new StringBuffer();
            for (int i = 0; i < arguments.length; i++)
            {
                buffer.append((i > 0 ? " " : "") + arguments[i]);
            }

            String wordForm = buffer.toString();
            System.out.println(wordForm);
            WordNetDatabase database = WordNetDatabase.getFileInstance();
            Synset[] synsets = database.getSynsets(wordForm);
            if (synsets.length > 0)
            {
                //在CODE上查看代码片派生到我的代码片
                //获得得到的同义词
                System.out.println("The following synsets contain '" +
                        wordForm + "' or a possible base form " +
                        "of that text:");
                for (int i = 0; i < synsets.length; i++)
                {
                    System.out.println("");
                    String[] wordForms = synsets[i].getWordForms();
                    for (int j = 0; j < wordForms.length; j++)
                    {
                        System.out.print((j > 0 ? ", " : "") +
                                wordForms[j]);
                    }
                    System.out.println(": " + synsets[i].getDefinition());
                }
            }
        }
    }

}

运行结果为:

fly 
 The following synsets contain ‘fly’ or a possible base form of that text: 
 fly: two-winged insects characterized by active flight 
 tent-fly, rainfly, fly sheet, fly, tent flap: flap consisting of a piece of canvas that can be drawn back to provide entrance to a tent 
 fly, fly front: an opening in a garment that is closed by a zipper or by buttons concealed under a fold of cloth 
 fly, fly ball: (baseball) a hit that flies up in the air 
 fly: fisherman’s lure consisting of a fishhook decorated to look like an insect 
 fly, wing: travel through the air; be airborne 
 fly: move quickly or suddenly 
 fly, aviate, pilot: fly a plane 
 fly: transport by aeroplane 
 fly: cause to fly or float 
 fly: be dispersed or disseminated 
 fly: change quickly from one emotional state to another 
 fly, fell, vanish: pass away rapidly 
 fly: travel in an airplane 
 fly: display in the air or cause to float 
 flee, fly, take flight: run away quickly 
 fly: travel over (an area of land or sea) in an aircraft 
 fly: hit a fly 
 vanish, fly, vaporize: decrease rapidly and disappear 
 fly: (British informal) not to be deceived or hoodwinked

似乎不是我们所需要的结果,故最后选择JWI的实现。


我觉得这个词库不是很好,尤其是不支持中文,所以觉得效果不好可以自己设计词库。