Prologファイルを見ることでWordNetデータを理解するのが最も簡単です。それらはここに文書化されています:
http://wordnet.princeton.edu/wordnet/man/prologdb.5WN.html
WordNetの用語は、シンセットにグループ化されています。シンセットは、最大のシノニムセットです。シンセットには主キーがあるため、セマンティック関係で使用できます。
したがって、最初の質問に答えると、単語のさまざまな意味と対応する同義語を次のようにリストできます。
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
質問の2番目の部分では、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グラムが得られますが、形態学的な変化はそれほど多くありません。WordNetは、いくつかの語彙関係も示します。これは便利な場合があります。
しかし、私が与えた両方のPrologクエリはあまり効率的ではありません。問題は、いくつかの単語の索引付けがないことです。もちろん、Javaの実装はもっと良いものを実装することができます。何かを想像してみてください。
class Synset {
static Hashtable<Integer,Synset> synset_access;
static Hashtable<String,Vector<Synset>> term_access;
}
一部のPrologは同じことを行うことができ、索引付けディレクティブによって、述語の複数の引数に索引付けするようにPrologシステムに指示することができます。
JavaでもPrologでも、Webサービスを立ち上げるのはそれほど難しいことではありません。多くのPrologsシステムでは、WebサーバーやJavaチャンピオンサーブレットにPrologプログラムを簡単に埋め込むことができます。
Webサーバーをサポートするプロローグのリストはここにあります:
http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementations#Operating_system_and_Web-related_features
よろしくお願いします