我想知道是否有一种简单的方法可以在 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 问题中发现的。有没有更简单的方法来获取上面提供的链接中的名词同义词?

最佳答案

这是一种获取同义词的hacky方法。我尝试了一些同义词库 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'南极': 1,
u'arctic': 1,
你咬的:1,
你'苦':1,
你'暴雪':1,
你冷静:1,
你'冷':1,
你'寒心':1,
你很冷:1,
u'chunk': 1,
你冷:1,
你' Crystal ':1,
u'cube': 1,
你'钻石':1,
你干了':1,
你'浮':1,
你'卡住':1,
你很冷:1,
u'frigorific': 1,
u'frost-bound': 1,
你'冷淡':1,
你'卡住':1,
u'gelid': 1,
u'glacial': 1,
你'冰川':1,
你'耀眼':1,
你'釉':1,
你好:1,
u'冰雹': 1,
'冰':1,
你的冰山:1,
你'冰':1,
u'icicle': 1,
'冰':2,
u'永久冻土':1,
u'polar': 1,
你'生':1,
你'冷藏':1,
你'rimy':1,
你'颤抖':1,
你'颤抖':1,
你的雨夹雪:1,
你被雨夹雪了:1,
你很光滑': 1,
'雪':1,
你下雪了:1}

字典用于为我的特定应用程序的单词分配分数。

关于python - 在wordnet中查找名词的同义词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29113755/

10-12 22:17