2015-03-18 7 views
3

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

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

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

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

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 вопроса. Есть ли более простой способ получить синонимы существительных, как в приведенной выше ссылке?

ответ

0

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

+1

'wn.synsets ('word')' сам по себе дает синонимы, хотя они не интересны для существительных. Прилагательные все еще нуждаются в дополнительном шаге, предусмотренном в первом методе выше. Существительные ничего не дают с этим методом и ничего с лемами, которые вы предоставили. Второй метод, который я изложил выше, очень хорошо работает для существительных (определение важно), но очень медленно, поскольку оно проходит через весь набор синхронизаций. Похоже, что проще очистить сеть за то, что мне нужно. –

+0

'wn-synsets ('word')' не возвращает синонимы! Он возвращает различные семантические концепции данного слова. Например: 'wn.synsets ('cat')' возвращает '[Synset ('cat.n.01'), Synset ('guy.n.01'), ... Synset ('caterpillar.n.02') , ... Synset ('vomit.v.01')] '. –

+0

Согласно http://stackoverflow.com/questions/19258652/how-to-get-synonyms-from-nltk-wordnet-python, synsets являются синонимами. –

2

Heres хакерский способ получения синонимов. Я пробовал некоторые 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 переплете ': 1, u'frosty': 1, u'frozen ': 1, u'gelid': 1, u'glacial ': 1, u'glacier': 1, u'glaring ': 1, u'glaze': 1, и» града ': 1, u'hailstone': 1, 'лед': 1, u'iceberg ': 1, u'iced': 1, u'icicle ': 1, 'ледяным': 2 , u'permafrost ': 1, u'polar': 1, u'raw ': 1, u'refrigerated ': 1, u'rimy': 1, u'shivering ': 1, u'shivery': 1, u'sleet ': 1, u'sleeted': 1, U 'smooth': 1, 'snow': 1, u'snowfall ': 1}

A dict используется для присвоения баллов словам для моего конкретного приложения.