1. 程式人生 > >java使用wordnet獲取近義詞

java使用wordnet獲取近義詞

初識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

java可以使用JWIJAWS提供的介面,這兩個專案分別隸屬於mit和msu,對應不同的文件和使用方法。

JWI:

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

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的實現。

我覺得這個詞庫不是很好,尤其是不支援中文,所以覺得效果不好可以自己設計詞庫。