初识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可以使用JWI和JAWS提供的接口,这两个项目分别隶属于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的实现。
我觉得这个词库不是很好,尤其是不支持中文,所以觉得效果不好可以自己设计词库。