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可以使用JWI和JAWS提供的介面,這兩個專案分別隸屬於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的實現。
我覺得這個詞庫不是很好,尤其是不支援中文,所以覺得效果不好可以自己設計詞庫。