Найдите синонимы существительных в wordnet

Мне интересно, есть ли простой способ получить синонимы существительных в wordnet. Кажется, что синонимы прилагательных получить довольно легко.

for ss in wn.synsets('beautiful'):
    print(ss)
    for sim in ss.similar_tos():
        print('    {}'.format(sim))

Я нашел приведенный выше код из другого вопроса SO, и он хорошо работает с прилагательными. Но когда я говорю «бензин» или «огонь», результаты ужасны. В идеале я бы получил список слов, очень похожий на этот сайт.

Что-то еще, что я пробовал, дало хорошие результаты, но очень медленно:

def syn(word, lch_threshold=2.26):
for net1 in wn.all_synsets():
    try:
        lch = net1.lch_similarity(wn.synset(word))
    except:
        continue
    # The value to compare the LCH to was found empirically.
    # (The value is very application dependent. Experiment!)
    if lch >= lch_threshold:
        yield (net1, lch)

for x in syn('gasoline.n.1'):
    print  x

Что также было найдено из другого вопроса SO. Есть ли более простой способ получить синонимы существительных, как в приведенной выше ссылке?


person Ted Petrou    schedule 18.03.2015    source источник


Ответы (2)


Вот хитрый способ получения синонимов. Я попробовал несколько API тезауруса, но не получил именно того, что хотел.

def get_syns(old_words):
    new_words = dict()
    for word, score in old_words.iteritems():
       new_words[word] = score
       for syn in get_web_syns(word):
           new_words[syn] = 1
    return new_words

def get_web_syns(word):
    req = requests.get('http://www.thesaurus.com/browse/' + word)
    soup = BeautifulSoup(req.text, 'html.parser')
    all_syns = soup.find('div', {'class' : 'relevancy-list'})
    syns = []
    for ul in all_syns.findAll('ul'):
        for li in ul.findAll('span', {'class':'text'}):
            syns.append(li.text.split()[0])
    return syns

cold = {'icy':2, 'ice':1, 'snow':1}
get_syns(cold)

Что возвращает: {u'algific ': 1, u'antarctic': 1, u'arctic ': 1, u'biting': 1, u'bitter ': 1, u'blizzard': 1, u'chill ' : 1, u'chilled ': 1, u'chilling': 1, u'chilly ': 1, u'chunk': 1, u'cold ': 1, u'crystal': 1, u'cube ': 1, u'diamonds ': 1, u'dry': 1, u'floe ': 1, u'freezing': 1, u'frigid ': 1, u'frigorific': 1, u'frost-bound ' : 1, u'frosty ': 1, u'frozen': 1, u'gelid ': 1, u'glacial': 1, u'glacier ': 1, u'glaring': 1, u'glaze ': 1, u'hail ': 1, u'hailstone': 1, 'ice': 1, u'iceberg ': 1, u'iced': 1, u'icicle ': 1,' icy ': 2, u 'вечная мерзлота': 1, u'polar ': 1, u'raw': 1, u'frigerated ': 1, u'rimy': 1, u'shivering ': 1, u'shivering': 1, u ' мокрый снег ': 1, u'smooth': 1, u'smooth ': 1,' снег ': 1, u'snowfall': 1}

Диктовка используется для присвоения оценок словам в моем конкретном приложении.

person Ted Petrou    schedule 19.03.2015

Независимо от того, имеете ли вы дело с существительными, глаголами или прилагательными: вы всегда получаете синонимы синонима по Synset.lemma(), например wn.synsets('gasoline')[0].lemmas()

person char bugs    schedule 18.03.2015
comment
wn.synsets('word') сам по себе дает синонимы, хотя для существительных они не интересны. Прилагательные по-прежнему нуждаются в дополнительном шаге, предусмотренном в первом методе выше. Существительные ничего не дают с помощью этого метода и ничего с предоставленными вами леммами. Второй метод, который я предоставил выше, довольно хорошо работает с существительными (определение важно), но он очень медленный, поскольку он проходит через всю коллекцию синсетов. Кажется, что почистить Интернет в поисках того, что мне нужно, почти проще. - person Ted Petrou; 18.03.2015
comment
wn-synsets('word') не возвращает синонимов! Он возвращает различные семантические концепции данного слова. Например, wn.synsets('cat') возвращает [Synset('cat.n.01'), Synset('guy.n.01'), ... Synset('caterpillar.n.02'), ... Synset('vomit.v.01')]. - person char bugs; 18.03.2015
comment
Согласно http://stackoverflow.com/questions/19258652/how-to-get-synonyms-from-nltk-wordnet-python синонимы являются синонимами. - person Ted Petrou; 19.03.2015
comment
Возможно, некоторые синсеты более или менее похожи, но это не значит, что они являются синонимами. Посмотрите на приведенный выше пример с кошкой, вы бы сказали, что рвота и гусеница - синонимы? - person char bugs; 19.03.2015
comment
Кроме того, рассмотрите пример приведенной вами ссылки: wn.synsets('small') возвращает выход из разных концепций. Вы можете проверить это, получив определения серверных наборов синхронизации: wn.synsets('small')[0].definition() возвращает u'the slender part of the back', тогда как wn.synsets('small')[2].definition() показывает u'limited or below average in number or quantity or magnitude or extent'. - person char bugs; 19.03.2015