通过查看最容易理解 WordNet 数据
在 Prolog 文件中。它们记录在这里:
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 查询都不是很有效。
问题是缺少一些词索引。一个爪哇
实施当然可以实施更好的东西。
想象一下:
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
最好的问候