【问题标题】:Find synonyms of nouns in wordnet在 wordnet 中查找名词的同义词
【发布时间】:2015-05-20 17:55:58
【问题描述】:

我想知道是否有一种简单的方法可以在 wordnet 中获取名词的同义词。形容词的同义词似乎很容易得到。

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

我从另一个 SO question 中找到了上面的代码,它适用于形容词。但是当我的词是“汽油”或“火”时,结果很糟糕。理想情况下,我会得到一个与this site 非常相似的单词列表。

我尝试过的其他一些效果很好但速度极慢的方法是:

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 问题中找到的。有没有更简单的方法来获取上面提供的链接中的名词同义词?

【问题讨论】:

    标签: python nltk wordnet synonym


    【解决方案1】:

    这是一种获取同义词的老套方法。我尝试了一些同义词库 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, 你'块':1, 你'冷':1, 你'水晶':1, 你的立方体':1, u'钻石':1, 你'干':1, 你'漂浮':1, 你'冻结':1, 你'冷':1, 你'frigorific':1, u'frost-bound': 1, 你'霜':1, 你'冻结':1, 你'gelid':1, u'冰川':1, 你'冰川':1, 你'刺眼':1, 你'釉':1, 你'冰雹':1, 你'冰雹':1, '冰':1, u'冰山':1, 你'冰':1, u'冰柱':1, “冰冷”:2, u'永久冻土':1, u'极地':1, 你'原始':1, 你'冷藏':1, 你'rimy':1, 你'颤抖':1, 你'颤抖':1, 你'雨夹雪':1, 你'sleeted':1, 你'光滑':1, “雪”:1, 你的“降雪”:1}

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

    【讨论】:

      【解决方案2】:

      无论您处理的是名词、动词还是形容词:您总是会通过Synset.lemma() 获得同义词集的同义词,例如wn.synsets('gasoline')[0].lemmas()

      【讨论】:

      • wn.synsets('word') 本身给出了同义词,尽管它们对名词没有意义。形容词仍然需要上面第一种方法中提供的额外步骤。使用该方法,名词不会产生任何结果,而您提供的引理也不会产生任何结果。我在上面提供的第二种方法确实适用于名词(定义很重要),但由于它循环遍历整个同义词集,所以速度非常慢。在网上搜索我需要的东西似乎更容易。
      • wn-synsets('word') 不返回同义词!它返回给定单词的不同语义概念。例如wn.synsets('cat') 返回[Synset('cat.n.01'), Synset('guy.n.01'), ... Synset('caterpillar.n.02'), ... Synset('vomit.v.01')]
      • 根据stackoverflow.com/questions/19258652/…,同义词是同义词。
      • 可能一些同义词或多或少相似,但这并不意味着它们是同义词。看看上面猫的例子,你会说“呕吐”和“毛毛虫”是同义词吗?
      • 此外,请考虑您提供的链接示例: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'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多