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