<p>通过查看WordNet数据最容易理解
在序言文件。记录如下:</p>
<p><a href="http://wordnet.princeton.edu/wordnet/man/prologdb.5WN.html" rel="nofollow">http://wordnet.princeton.edu/wordnet/man/prologdb.5WN.html</a></p>
<p>WordNet术语被分组成语法集。synset是最大值
同义词集。Synsets有一个主键,因此可以使用它们
在语义关系中。在</p>
<p>所以回答你的第一个问题,你可以列出不同的
一个词的意义和对应的同义词如下:</p>
<pre><code>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).
</code></pre>
<p>示例:</p>
^{pr2}$
<p>在问题的第二部分,WordNet术语是
单词序列。所以你可以搜索这个词
用词如下:</p>
<pre><code>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).
</code></pre>
<p>示例:</p>
<pre><code>?- 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
</code></pre>
<p>这会给你潜在的n克数,但没有那么多
形态变异。WordNet也展示了一些
词汇关系,这可能是有用的。在</p>
<p>但是我给出的两个Prolog查询都不是很有效。
问题是缺乏一些单词索引。爪哇
实现当然可以实现更好的东西。
想象一下:</p>
<pre><code>class Synset {
static Hashtable<Integer,Synset> synset_access;
static Hashtable<String,Vector<Synset>> term_access;
}
</code></pre>
<p>有些Prolog也可以这样做,通过一个索引指令
可以指示Prolog系统在多个
谓词的参数。在</p>
<p>建立一个web服务也不难
在Java或Prolog中。许多Prologs系统很容易允许嵌入
web服务器中的Prolog程序,以及Java冠军servlet。在</p>
<p>支持web服务器的Prologs列表可在以下位置找到:</p>
<p><a href="http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementations#Operating_system_and_Web-related_features" rel="nofollow">http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementations#Operating_system_and_Web-related_features</a></p>
<p>谨致问候</p>