Word Net - Синонимы слова и связанные с ними конструкции слова - Java или Python - PullRequest
6 голосов
/ 08 августа 2011

Я хочу использовать WordNet для поиска набора похожих терминов из базового набора терминов.

Например, слово «обескуражен» - потенциальные синонимы могут быть: daunted, glum, deterred, pessimistic.

Я также хотел определить потенциальные биграммы, такие как;beat down, put off, caved in и т. Д.

Как мне извлечь эту информацию с помощью Java или Python?Есть ли какие-либо размещенные базы данных / веб-интерфейсы WordNet, которые позволили бы такие запросы?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 08 августа 2011

Проще понять данные WordNet, посмотрев файлы Prolog.Они описаны здесь:

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  

Для второгочасть вашего вопроса, термины 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 также демонстрирует некоторые лексические отношения, которые могут быть полезны.

Но оба запроса Пролога, которые я дал, не очень эффективны.Проблема в том, что не хватает индексации слов.Реализация Java может, конечно, реализовать что-то лучшее.Просто представьте себе что-то вроде:

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

Некоторые Prolog могут сделать то же самое, с помощью директивы индексации можно указать системе Prolog индексировать несколько аргументов для предиката.

Установкавеб-служба не должна быть такой сложной, как на Java, так и на прологе.Многие системы Prologs легко позволяют встраивать программы Prolog в веб-серверы и сервлеты Java Champions.

Список Prologs, поддерживающих веб-серверы, можно найти здесь:

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

С наилучшими пожеланиями

3 голосов
/ 08 августа 2011

Это две разные проблемы.

1) Wordnet и python.Используйте NLTK, он имеет приятный интерфейс к wordnet .Вы могли бы написать что-то по своему усмотрению, но, честно говоря, зачем усложнять жизнь?Lingpipe, вероятно, также имеет что-то встроенное, но NLTK намного проще в использовании.Я думаю, что nltk просто загружает базу данных ntlk, но я уверен, что есть apis, чтобы поговорить с wordnet.

2) Чтобы получить биграммы в nltk , следуйте этому уроку .Как правило, вы разбиваете текст на части, а затем просто перебираете предложение, получая все n-граммы для каждого слова, глядя вперед и назад.

2 голосов
/ 08 августа 2011

В качестве альтернативы NLTK вы можете использовать одну доступных конечных точек WordNet SPARQL для получения такой информации. Пример запроса:

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 .

...