6

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

例如,单词'discouraged' - 潜在的同义词可能是:daunted, glum, deterred, pessimistic.

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

如何使用 Java 或 Python 提取这些信息?是否有任何托管的 WordNet 数据库/Web 界面允许此类查询?

谢谢!

4

3 回答 3

3

这是两个不同的问题。

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

2) 要在 nltk 中获得二元组,请遵循本教程。通常,您对文本进行标记,然后通过向前和向后查看来遍历句子,以获得每个单词的所有 n-gram。

于 2011-08-08T15:51:01.243 回答
3

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

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

WordNet 术语被分组为同义词集。同义词集是最大同义词集。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 构建 Web 服务应该不会那么困难。许多 Prologs 系统很容易允许将 Prolog 程序嵌入 Web 服务器和 Java 冠军 servlet。

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

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

此致

于 2011-08-08T16:40:26.017 回答
2

作为 NLTK 的替代方法,您可以使用可用的 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 世界中,可以使用JenaSesame框架。

于 2011-08-08T16:31:39.343 回答