2011-08-08 48 views
6

Tôi đang tìm cách sử dụng WordNet để tìm kiếm một tập hợp các thuật ngữ giống như từ tập hợp cơ sở các thuật ngữ.Word Net - Từ đồng nghĩa và cấu trúc từ liên quan - Java hoặc Python

Ví dụ, từ 'nản' - đồng nghĩa tiềm năng có thể là: daunted, glum, deterred, pessimistic.

Tôi cũng muốn xác định các bi-gam tiềm năng như; beat down, put off, caved in vv

Tôi làm cách nào để trích xuất thông tin này bằng Java hoặc Python? Có bất kỳ cơ sở dữ liệu WordNet được lưu trữ trên máy chủ/giao diện web nào cho phép truy vấn như vậy không?

Cảm ơn!

Trả lời

3

Dễ hiểu nhất dữ liệu WordNet bằng cách tìm kiếm tại các tệp Prolog. Chúng được ghi nhận ở đây:

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

WordNet điều khoản này là nhóm thành synsets. Đồng bộ hóa là một tập hợp từ đồng nghĩa tối đa . Synsets có khóa chính để chúng có thể được sử dụng trong các mối quan hệ ngữ nghĩa.

Vì vậy, trả lời câu hỏi đầu tiên của bạn, bạn có thể liệt kê các ý nghĩa khác nhau và từ đồng nghĩa tương ứng của một từ như sau:

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). 

Ví dụ:

?- setof(H,(s_helper(Y,'discouraged'),s_helper(Y,H),L). 
Y = 301664880, 
L = [demoralised, demoralized, discouraged, disheartened] ; 
Y = 301992418, 
L = [discouraged] ; 
No 

Đối với phần thứ hai của câu hỏi của bạn, Các thuật ngữ WordNet là chuỗi các từ. Vì vậy, bạn có thể tìm kiếm WordNet này về các từ như sau:

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). 

Ví dụ:

?- 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 

Điều này sẽ cung cấp cho bạn khả năng n-gram, nhưng không có quá nhiều sự thay đổi hình thái .WordNet cũng thể hiện một số quan hệ từ vựng , có thể hữu ích.

Nhưng cả hai truy vấn Prolog tôi đã đưa ra đều không hiệu quả lắm. Vấn đề là thiếu một số chỉ mục từ. Một thực hiện Java có thể tất nhiên thực hiện một cái gì đó tốt hơn. Chỉ cần tưởng tượng cái gì đó dọc:

class Synset { 
    static Hashtable<Integer,Synset> synset_access; 
    static Hashtable<String,Vector<Synset>> term_access; 
} 

Một số Prolog có thể làm như vậy, bởi một chỉ thị lập chỉ mục, nó là thể chỉ thị cho hệ thống Prolog chỉ mục trên nhiều lập luận cho một vị.

Việc thiết lập một dịch vụ web không quá khó khăn, hoặc là bằng Java hoặc Prolog. Nhiều hệ thống Prologs dễ dàng cho phép nhúng các chương trình Prolog Prolog vào các máy chủ web và các servlet vô địch Java.

Một danh sách các Prologs có hỗ trợ các máy chủ web có thể được tìm thấy ở đây:

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

Trân trọng

+0

Cảm ơn thông tin này, rất hữu ích. Câu hỏi nhanh, tôi vẫn không chắc chắn 100% về điều này, nhưng nếu có thể, cách tốt nhất để liên kết một từ như 'chán nản' với 'đánh bại' theo chương trình là gì? – NightWolf

+0

Phụ thuộc vào "liên kết" và ngôn ngữ lập trình. Trong WordNet có hai loại "liên kết", ngữ nghĩa và từ vựng. Thông qua Prolog, cho một liên kết ngữ nghĩa, bạn sẽ xác nhận một liên kết thực tế (synset_id1, synset_id2). Đối với một liên kết từ vựng bạn sẽ xác nhận một liên kết thực tế (synset_id1, word_num1, synset_id2, word_num2). Trong Java, bạn sẽ sử dụng datastructure/service thích hợp của mình. Hoặc bạn đặt hai từ này vào cùng một tập hợp hoặc tạo một tập hợp mới trong đó chúng nằm trong đó. Sau này được áp dụng trong trường hợp "liên kết" của bạn phải có cùng ý nghĩa. –

3

Đây là hai vấn đề khác nhau.

1) Wordnet và python. Sử dụng NLTK, nó có một đẹp interface to wordnet. Bạn có thể viết một cái gì đó của riêng bạn, nhưng thành thật tại sao làm cho cuộc sống khó khăn? Lingpipe cũng có thể có thứ gì đó được tích hợp sẵn nhưng NLTK dễ sử dụng hơn nhiều. Tôi nghĩ rằng nltk chỉ tải về một cơ sở dữ liệu ntlk, nhưng tôi khá chắc chắn có apis để nói chuyện với wordnet.

2) Để nhận các bigram trong nltk follow this tutorial. Nói chung bạn tokenize văn bản và sau đó chỉ cần iterate qua câu nhận được tất cả các n-gram cho mỗi từ bằng cách nhìn về phía trước và lạc hậu.

+0

Cám ơn các liên kết. Từ thử nghiệm của tôi với WordNet cụm từ nhất định như "đánh bại" không thể được xác định, là điều này đúng? – NightWolf

+0

Nếu bạn sử dụng wordnet trực tuyến, bạn có thể thấy một số từ đồng nghĩa: 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 = beat + xuống – nflacco

+0

có thể phiên bản trực tuyến là db mới hơn của từ? – nflacco

2

Thay thế cho NLTK, bạn có thể sử dụng one điểm cuối SPARQL WordNet có sẵn để truy xuất thông tin đó. Ví dụ truy vấn:

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 

Trong khung công tác Java, JenaSesame có thể được sử dụng.

+0

nếu tôi thay thế 'chạy' bằng 'xe đạp', vì kết quả tôi nhận được xe đạp, xe đạp, chu kỳ, nhưng cũng có bánh xe và đạp xe <- tại sao 2 người cuối cùng này? – Renaud

Các vấn đề liên quan