2011-08-08 3 views
6

WordNet을 사용하여 기본 용어 집합에서 유사한 용어 모음집을 찾습니다. 예를 들어Word Net - 동의어 및 관련 단어 구문 - Java 또는 Python

, '실망' 단어 - 잠재적 동의어가 될 수있다 : daunted, glum, deterred, pessimistic.

나는 또한 다음과 같은 잠재적 인 바이 그램을 식별하고 싶었습니다. beat down, put off, caved in

Java 또는 Python을 사용하여이 정보를 추출하는 방법은 무엇입니까? 이러한 쿼리를 허용하는 호스팅 된 WordNet 데이터베이스/웹 인터페이스가 있습니까?

감사합니다.

답변

3

Prolog 파일에서 을보고 WordNet 데이터를 이해하는 것이 가장 쉽습니다. 그들은 여기에 설명되어 있습니다 :

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

워드 넷 용어가 synset을에 그룹입니다. synset은 최대 동의어 집합입니다. 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 용어는 단어의 시퀀스입니다. 다음과 같이 그래서 당신은 단어에 대한이 워드 넷의 용어 를 검색 할 수 있습니다

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; 
} 

을, 가능한 는 술어에 대해 여러 인덱스에 인수를 프롤로그 시스템에 지시하는 것입니다.

웹 서비스를 구현하는 것이 어렵지 않아야합니다 (자바 또는 프롤로그에서 ). 많은 Prologs 시스템은 웹 서버에 Prolog 프로그램 및 Java 챔피온 서블릿을 쉽게 임베드 할 수 있습니다.

웹 서버를 지원 프롤로그의 목록은 여기에서 찾을 수 있습니다 : 링크에 대한

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

안부

+0

이 정보를 제공해 주셔서 감사합니다. 매우 도움이됩니다. 빠른 질문, 아직 100 % 확실하지는 않지만 가능한 경우 '낙담'과 같은 단어를 프로그램 방식으로 연결하는 가장 좋은 방법은 무엇일까요? – NightWolf

+0

"링크"및 프로그래밍 언어에 따라 다릅니다. WordNet에는 의미와 어휘의 두 가지 종류의 "링크"가 있습니다. Prolog를 통해 의미 론적 링크의 경우 사실 링크 (synset_id1, synset_id2)를 주장합니다. 어휘 링크의 경우 사실 링크 (synset_id1, word_num1, synset_id2, word_num2)를 지정합니다. Java에서는 적절한 데이터 구조/서비스를 사용합니다. 또는 두 단어를 동일한 synset에 넣거나 함께 결합 된 새 synset을 만듭니다. 귀하의 "링크"가 동일한 의미를 나타내야 할 경우를 대비하여 나중에 적용됩니다. –

3

두 가지 문제가 있습니다.

1) 워드 넷과 파이썬. NLTK를 사용하면 멋진 interface to wordnet을 사용합니다. 혼자서 뭔가 쓸 수는 있겠지만 솔직히 왜 인생을 힘들게합니까? Lingpipe에는 아마도 무언가가 내장되어 있지만 NLTK는 사용하기가 훨씬 쉽습니다. nltk는 ntlk 데이터베이스를 다운로드한다고 생각하지만, wordnet과 대화 할 수있는 api가 있다고 확신합니다.

2) nltk에서 bigrams를 가져 오려면 follow this tutorial. 일반적으로 텍스트를 토큰 화 한 다음 문장을 반복하여 앞뒤로 보면서 각 단어의 모든 n-gram을 얻습니다.

+0

감사합니다. WordNet과 함께하는 저의 시험에서 "박수"와 같은 특정 문구는 식별 될 수 있습니까? 맞습니까? – NightWolf

+0

온라인 wordnet을 사용하는 경우 다음과 같은 동의어를 볼 수 있습니다. http://wordnetweb.princeton.edu/perl/webwn?c=8&sub=Change&o2=&o0=1&o8=1&o1=1&o7=&o5=&o9=&o6=&o3=&o4= & i = -1 & h = 000 & s = 비트 + 아래 – nflacco

+0

아마도 온라인 버전은 새로운 단어 DB입니까? – nflacco

2

NLTK 대신, 사용 가능한 WordNet SPARQL 끝점 중 one을 사용하여 이러한 정보를 검색 할 수 있습니다. 쿼리 예 :

자바 우주에서
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 

, JenaSesame 프레임 워크를 사용할 수 있습니다.

+0

'자전거'로 '달리기'를 대체하면 자전거, 자전거, 사이클, 휠 및 페달 <결과가 왜 마지막 2 가지입니까? – Renaud