Word Net - Word同义词&相关的单词构造 - Java或Python

时间:2011-08-08 15:10:33

标签: java python nlp text-mining wordnet

我希望使用WordNet从一组基本术语中查找类似术语的集合。

例如, '气馁' 这个词 - 潜在的同义词可能是:daunted, glum, deterred, pessimistic

我还想识别潜在的二元组,例如; beat down, put off, caved in等。

如何使用Java或Python提取此信息?是否有任何托管的WordNet数据库/ Web界面可以进行此类查询?

谢谢!

3 个答案:

答案 0 :(得分:3)

这是两个不同的问题。

1)Wordnet和python。使用NLTK,它有一个很好的interface to wordnet。你可以自己写点东西,老实说为什么要让生活变得困难? Lingpipe可能还内置了一些东西,但NLTK更容易使用。我认为nltk只是下载了一个ntlk数据库,但我很确定有没有人可以与wordnet进行对话。

2)在nltk follow this tutorial中获取bigrams。一般来说,你会对文本进行标记,然后只需通过向前和向后搜索每个单词的所有n-gram来迭代句子。

答案 1 :(得分:3)

通过查看最容易理解WordNet数据 在Prolog文件。它们记录在这里:

http://wordnet.princeton.edu/wordnet/man/prologdb.5WN.html

WordNet术语分组为synsets。 synset是最大值 同义词集。 Synsets具有主键,因此可以使用它们 在语义关系中。

回答你的第一个问题,你可以列出不同的问题 感知和单词的相应同义词如下:

Input X: Term
Output Y: Sense  
Output L: Synonyms in this Sense  

s_helper(X,Y) :- s(X,_,Y,_,_,_).  
?- setof(H,(s_helper(Y,X),s_helper(Y,H)),L).  

示例:

?- setof(H,(s_helper(Y,'discouraged'),s_helper(Y,H),L).  
Y = 301664880,  
L = [demoralised, demoralized, discouraged, disheartened] ;  
Y = 301992418,  
L = [discouraged] ;  
No  

对于问题的第二部分,WordNet术语是 单词序列。因此,您可以搜索此WordNet术语 单词如下:

Input X: Word  
Output Y: Term

s_helper(X) :- s(_,_,X,_,_,_).  
word_in_term(X,Y) :- atom_concat(X,' ',H), sub_atom(Y,0,_,_,H).
word_in_term(X,Y) :- atom_concat(' ',X,H), atom_concat(H,' ',J), sub_atom(Y,_,_,_,J).
word_in_term(X,Y) :- atom_concat(' ',X,H), sub_atom(Y,_,_,0,H).
?- s_helper(Y), word_in_term(X,Y).

示例:

?- s_helper(X), word_in_term('beat',X).  
X = 'beat generation' ;  
X = 'beat in' ;  
X = 'beat about' ;  
X = 'beat around the bush' ;  
X = 'beat out' ;  
X = 'beat up' ;  
X = 'beat up' ;  
X = 'beat back' ;  
X = 'beat out' ;  
X = 'beat down' ;  
X = 'beat a retreat' ;  
X = 'beat down' ;  
X = 'beat down' ;  
No

这会给你潜在的n-gram,但没有那么多 形态变异。 WordNet也展示了一些 词汇关系,这可能是有用的。

但是我给出的两个Prolog查询效率都不高。 问题是缺少一些单词索引。一个Java 实施当然可以更好地实施。 想象一下:

class Synset {  
    static Hashtable<Integer,Synset> synset_access;  
    static Hashtable<String,Vector<Synset>> term_access;  
}

一些Prolog可以通过索引指令执行相同的操作 可以指示Prolog系统对多个索引进行索引 谓词的参数。

建立网络服务也不应该那么困难 在Java或Prolog中。许多Prologs系统很容易嵌入 Web服务器中的Prolog程序和Java冠军servlet。

可以在此处找到支持Web服务器的Prolog列表:

http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementations#Operating_system_and_Web-related_features

最好的问候

答案 2 :(得分:2)

作为NLTK的替代方案,您可以使用one个可用的WordNet SPARQL端点来检索此类信息。查询示例:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX wordnet: <http://www.w3.org/2006/03/wn/wn20/schema/>

SELECT DISTINCT ?label {
  ?input_word a wordnet:WordSense;
     rdfs:label ?input_label.
  FILTER (?input_label = 'run')
  ?synset wordnet:containsWordSense ?input_word.
  ?synset wordnet:containsWordSense ?synonym.
  ?synonym rdfs:label ?label.
} LIMIT 100

在Java Universe中,可以使用JenaSesame框架。