6

WordNetを使用して、用語の基本セットから同様の用語のコレクションを探すことを検討しています。

たとえば、「落胆した」という単語-潜在的な同義語は次のようになりますdaunted, glum, deterred, pessimistic

また、次のような潜在的なバイグラムを特定したいと思いました。beat down, put off, caved in

JavaまたはPythonを使用してこの情報を抽出するにはどうすればよいですか?そのようなクエリを可能にするホストされたWordNetデータベース/Webインターフェイスはありますか?

ありがとう!

4

3 に答える 3

3

これらは2つの異なる問題です。

1)WordnetとPython。NLTKを使用してください、それはwordnetへの素晴らしいインターフェースを持っています。あなたは自分で何かを書くことができますが、正直なところ、なぜ人生を難しくするのですか?Lingpipeにも何かが組み込まれている可能性がありますが、NLTKの方がはるかに使いやすいです。nltkはntlkデータベースをダウンロードするだけだと思いますが、wordnetと通信するためのAPIがあると確信しています。

2)nltkでバイグラムを取得するには、このチュートリアルに従ってください。一般に、テキストをトークン化してから、文を繰り返し処理して、前後を見て各単語のすべてのnグラムを取得します。

于 2011-08-08T15:51:01.243 に答える
3

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

よろしくお願いします

于 2011-08-08T16:40:26.017 に答える
2

NLTKの代わりに、利用可能なWordNetSPARQLエンドポイントの1つを使用してそのような情報を取得できます。クエリの例:

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ユニバースでは、JenaおよびSesameフレームワークを使用できます。

于 2011-08-08T16:31:39.343 に答える