Wordnet查找同义词

12

我正在寻找使用WordNet查找特定单词所有同义词的方法。我正在使用JAWS。

例如:

love(v): admire, adulate, be attached to, be captivated by, be crazy about, be enamored of, be enchanted by, be fascinated with, be fond of, be in love with, canonize, care for, cherish, choose, deify, delight in, dote on, esteem, exalt, fall for, fancy, glorify, go for, gone on....

love(n): Synonym : adulation, affection, allegiance, amity, amorousness, amour, appreciation, ardency, ardor, attachment, case*, cherishing, crush, delight, devotedness, devotion, emotion, enchantment, enjoyment, fervor, fidelity, flame, fondness, friendship, hankering, idolatry, inclination, infatuation, involvement

在相关的问题中,用户Ram指出了一些代码,但这并不足够,因为它只给出了非常不同的输出:

爱,激情:任何温暖情感或热爱的对象,心爱的,亲爱的,最亲爱的,宝贝, 爱:一位心爱的人;用作亲昵的称呼 爱,性爱,色情爱:深切的性欲和吸引力感受 爱:网球或壁球中的零分 性爱,做爱,爱情,爱生活:两个人之间的性行为(通常包括性交) 爱:极度喜爱或钟爱
那么我该如何实现它,WordNet适合我想要做的事情吗?
4个回答

13

如果只用WordNet,你可以尝试使用语义相似性来确定两个单词(synsets)是否足够相似,可以作为同义词。以下是一个快速示例,它来自于修改我在使用WordNet进行语义相似度中的另一个答案。

不过,它也有一些问题:

  • 反义词与同义词混在一起
  • 很慢!(因为它必须检查所有约117k个synsets)

尽管如此,它产生的同义词比仅使用lemma_names更多,因此我在这里留下它,以防它可能会有用(也许与其他东西结合使用)。

>>> from nltk.corpus import wordnet as wn
>>> def syn(word, lch_threshold=2.26):
    for net1 in wn.synsets(word):
        for net2 in wn.all_synsets():
            try:
                lch = net1.lch_similarity(net2)
            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, net2, lch)


>>> for x in syn('love'):
    print x

上面的代码输出:

(Synset('love.n.01'), Synset('feeling.n.01'), 2.538973871058276)
(Synset('love.n.01'), Synset('conditioned_emotional_response.n.01'), 2.538973871058276)
(Synset('love.n.01'), Synset('emotion.n.01'), 2.9444389791664407)
(Synset('love.n.01'), Synset('worship.n.02'), 2.9444389791664407)
(Synset('love.n.01'), Synset('anger.n.01'), 2.538973871058276)
(Synset('love.n.01'), Synset('fear.n.01'), 2.538973871058276)
(Synset('love.n.01'), Synset('fear.n.03'), 2.538973871058276)
(Synset('love.n.01'), Synset('anxiety.n.02'), 2.538973871058276)
(Synset('love.n.01'), Synset('joy.n.01'), 2.538973871058276)
(Synset('love.n.01'), Synset('love.n.01'), 3.6375861597263857)
(Synset('love.n.01'), Synset('agape.n.02'), 2.9444389791664407)
(Synset('love.n.01'), Synset('agape.n.01'), 2.9444389791664407)
(Synset('love.n.01'), Synset('filial_love.n.01'), 2.9444389791664407)
(Synset('love.n.01'), Synset('ardor.n.02'), 2.9444389791664407)
(Synset('love.n.01'), Synset('amorousness.n.01'), 2.9444389791664407)
(Synset('love.n.01'), Synset('puppy_love.n.01'), 2.9444389791664407)
(Synset('love.n.01'), Synset('devotion.n.01'), 2.9444389791664407)
(Synset('love.n.01'), Synset('benevolence.n.01'), 2.9444389791664407)
(Synset('love.n.01'), Synset('beneficence.n.01'), 2.538973871058276)
(Synset('love.n.01'), Synset('heartstrings.n.01'), 2.9444389791664407)
(Synset('love.n.01'), Synset('lovingness.n.01'), 2.9444389791664407)
(Synset('love.n.01'), Synset('warmheartedness.n.01'), 2.538973871058276)
(Synset('love.n.01'), Synset('loyalty.n.02'), 2.9444389791664407)
(Synset('love.n.01'), Synset('hate.n.01'), 2.538973871058276)
(Synset('love.n.01'), Synset('emotional_state.n.01'), 2.538973871058276)
(Synset('love.n.02'), Synset('content.n.05'), 2.538973871058276)
(Synset('love.n.02'), Synset('object.n.04'), 2.9444389791664407)
(Synset('love.n.02'), Synset('antipathy.n.02'), 2.538973871058276)
(Synset('love.n.02'), Synset('bugbear.n.02'), 2.538973871058276)
(Synset('love.n.02'), Synset('execration.n.03'), 2.538973871058276)
(Synset('love.n.02'), Synset('center.n.06'), 2.538973871058276)
(Synset('love.n.02'), Synset('hallucination.n.03'), 2.538973871058276)
(Synset('love.n.02'), Synset('infatuation.n.03'), 2.538973871058276)
(Synset('love.n.02'), Synset('love.n.02'), 3.6375861597263857)
(Synset('beloved.n.01'), Synset('person.n.01'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('lover.n.01'), 2.9444389791664407)
(Synset('beloved.n.01'), Synset('admirer.n.03'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('beloved.n.01'), 3.6375861597263857)
(Synset('beloved.n.01'), Synset('betrothed.n.01'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('boyfriend.n.01'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('darling.n.01'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('girlfriend.n.02'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('idolizer.n.01'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('inamorata.n.01'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('inamorato.n.01'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('kisser.n.01'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('necker.n.01'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('petter.n.01'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('romeo.n.01'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('soul_mate.n.01'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('squeeze.n.04'), 2.538973871058276)
(Synset('beloved.n.01'), Synset('sweetheart.n.01'), 2.538973871058276)
(Synset('love.n.04'), Synset('desire.n.01'), 2.538973871058276)
(Synset('love.n.04'), Synset('sexual_desire.n.01'), 2.9444389791664407)
(Synset('love.n.04'), Synset('love.n.04'), 3.6375861597263857)
(Synset('love.n.04'), Synset('aphrodisia.n.01'), 2.538973871058276)
(Synset('love.n.04'), Synset('anaphrodisia.n.01'), 2.538973871058276)
(Synset('love.n.04'), Synset('passion.n.05'), 2.538973871058276)
(Synset('love.n.04'), Synset('sensuality.n.01'), 2.538973871058276)
(Synset('love.n.04'), Synset('amorousness.n.02'), 2.538973871058276)
(Synset('love.n.04'), Synset('fetish.n.01'), 2.538973871058276)
(Synset('love.n.04'), Synset('libido.n.01'), 2.538973871058276)
(Synset('love.n.04'), Synset('lecherousness.n.01'), 2.538973871058276)
(Synset('love.n.04'), Synset('nymphomania.n.01'), 2.538973871058276)
(Synset('love.n.04'), Synset('satyriasis.n.01'), 2.538973871058276)
(Synset('love.n.04'), Synset('the_hots.n.01'), 2.538973871058276)
(Synset('love.n.05'), Synset('bowling_score.n.01'), 2.538973871058276)
(Synset('love.n.05'), Synset('football_score.n.01'), 2.538973871058276)
(Synset('love.n.05'), Synset('baseball_score.n.01'), 2.538973871058276)
(Synset('love.n.05'), Synset('basketball_score.n.01'), 2.538973871058276)
(Synset('love.n.05'), Synset('number.n.02'), 2.538973871058276)
(Synset('love.n.05'), Synset('score.n.03'), 2.9444389791664407)
(Synset('love.n.05'), Synset('stroke.n.06'), 2.538973871058276)
(Synset('love.n.05'), Synset('birdie.n.01'), 2.538973871058276)
(Synset('love.n.05'), Synset('bogey.n.02'), 2.538973871058276)
(Synset('love.n.05'), Synset('deficit.n.03'), 2.538973871058276)
(Synset('love.n.05'), Synset('double-bogey.n.01'), 2.538973871058276)
(Synset('love.n.05'), Synset('duck.n.02'), 2.538973871058276)
(Synset('love.n.05'), Synset('eagle.n.02'), 2.538973871058276)
(Synset('love.n.05'), Synset('double_eagle.n.01'), 2.538973871058276)
(Synset('love.n.05'), Synset('game.n.06'), 2.538973871058276)
(Synset('love.n.05'), Synset('lead.n.07'), 2.538973871058276)
(Synset('love.n.05'), Synset('love.n.05'), 3.6375861597263857)
(Synset('love.n.05'), Synset('match.n.05'), 2.538973871058276)
(Synset('love.n.05'), Synset('par.n.01'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('bondage.n.03'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('outercourse.n.01'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('safe_sex.n.01'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('sexual_activity.n.01'), 2.9444389791664407)
(Synset('sexual_love.n.02'), Synset('conception.n.02'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('sexual_intercourse.n.01'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('pleasure.n.05'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('sexual_love.n.02'), 3.6375861597263857)
(Synset('sexual_love.n.02'), Synset('carnal_abuse.n.01'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('coupling.n.03'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('reproduction.n.05'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('foreplay.n.01'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('perversion.n.02'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('autoeroticism.n.01'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('promiscuity.n.01'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('lechery.n.01'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('homosexuality.n.01'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('bisexuality.n.02'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('heterosexuality.n.01'), 2.538973871058276)
(Synset('sexual_love.n.02'), Synset('bestiality.n.02'), 2.538973871058276)
# ...

想知道像baseball_score、bogey、double_eagle这些运动术语和爱情有什么关系吗? :-) 好的,明白了。['love']:网球或壁球中的零分。 - Anatoly Alekseev

7

首先,我们需要问的问题是“同义词是什么?是否可以从表面/根词查询同义词?”

在WordNet中,你可以在这个术语下使用相似的单词来表示相同的概念,称为Synset而不是在表面单词层面上。

为了获得与Synset同义词的覆盖范围,您需要更多的WordNet,可能需要一些语义相似性方法来提取其他单词。

我无法给你一个关于以上意思的JAWS解释,但是从Python的NLTK界面中的WordNet中,你可以看到WN对于你想要的覆盖范围是不足的。

from nltk.corpus import wordnet as wn
for ss in wn.synsets('love'): # Each synset represents a diff concept.
  print ss.definition
  print ss.lemma_names
  print

上面的代码输出:

a strong positive emotion of regard and affection
['love']

any object of warm affection or devotion; 
['love', 'passion']

a beloved person; used as terms of endearment
['beloved', 'dear', 'dearest', 'honey', 'love']

a deep feeling of sexual desire and attraction
['love', 'sexual_love', 'erotic_love']

a score of zero in tennis or squash
['love']

sexual activities (often including sexual intercourse) between two people
['sexual_love', 'lovemaking', 'making_love', 'love', 'love_life']

have a great affection or liking for
['love']

get pleasure from
['love', 'enjoy']

be enamored or in love with
['love']

have sexual intercourse with
['sleep_together', 'roll_in_the_hay', 'love', 'make_out', 'make_love', 'sleep_with', 'get_laid', 'have_sex', 'know', 'do_it', 'be_intimate', 'have_intercourse', 'have_it_away', 'have_it_off', 'screw', 'fuck', 'jazz', 'eff', 'hump', 'lie_with', 'bed', 'have_a_go_at_it', 'bang', 'get_it_on', 'bonk']

定义和lemma_names可能需要括号。 - Meng Zhang

2

我已经查看了RiWordNet (RiTa) 代码(请参见getAllSynonyms方法),发现它通过给你同义词集下位词相似词也看到协调名称的所有词形来生成同义词。我没有包括协调名称,但是添加了反义词。此外,我向我的数据中添加了同义词集名称和“同义词类型”,以便利用其他Wordnet数据,例如定义和/或示例。以下是我的Python代码和输出:

'''Synonym generator using NLTK WordNet Interface: http://www.nltk.org/howto/wordnet.html
    'ss': synset
    'hyp': hyponym
    'sim': similar to
    'ant': antonym
    'also' also see

'''

from nltk.corpus import wordnet as wn


def get_all_synsets(word, pos=None):
    for ss in wn.synsets(word):
        for lemma in ss.lemma_names():
            yield (lemma, ss.name())


def get_all_hyponyms(word, pos=None):
    for ss in wn.synsets(word, pos=pos):
            for hyp in ss.hyponyms():
                for lemma in hyp.lemma_names():
                    yield (lemma, hyp.name())


def get_all_similar_tos(word, pos=None):
    for ss in wn.synsets(word):
            for sim in ss.similar_tos():
                for lemma in sim.lemma_names():
                    yield (lemma, sim.name())


def get_all_antonyms(word, pos=None):
    for ss in wn.synsets(word, pos=None):
        for sslema in ss.lemmas():
            for antlemma in sslema.antonyms():
                    yield (antlemma.name(), antlemma.synset().name())


def get_all_also_sees(word, pos=None):
        for ss in wn.synsets(word):
            for also in ss.also_sees():
                for lemma in also.lemma_names():
                    yield (lemma, also.name())


def get_all_synonyms(word, pos=None):
    for x in get_all_synsets(word, pos):
        yield (x[0], x[1], 'ss')
    for x in get_all_hyponyms(word, pos):
        yield (x[0], x[1], 'hyp')
    for x in get_all_similar_tos(word, pos):
        yield (x[0], x[1], 'sim')
    for x in get_all_antonyms(word, pos):
        yield (x[0], x[1], 'ant')
    for x in get_all_also_sees(word, pos):
        yield (x[0], x[1], 'also')

for x in get_all_synonyms('love'):
    print x

'love'和'brave'的输出结果:

(u'love', u'love.n.01', 'ss')
(u'love', u'love.n.02', 'ss')
(u'passion', u'love.n.02', 'ss')
(u'beloved', u'beloved.n.01', 'ss')
(u'dear', u'beloved.n.01', 'ss')
(u'dearest', u'beloved.n.01', 'ss')
(u'honey', u'beloved.n.01', 'ss')
(u'love', u'beloved.n.01', 'ss')
(u'love', u'love.n.04', 'ss')
(u'sexual_love', u'love.n.04', 'ss')
(u'erotic_love', u'love.n.04', 'ss')
(u'love', u'love.n.05', 'ss')
(u'sexual_love', u'sexual_love.n.02', 'ss')
(u'lovemaking', u'sexual_love.n.02', 'ss')
(u'making_love', u'sexual_love.n.02', 'ss')
(u'love', u'sexual_love.n.02', 'ss')
(u'love_life', u'sexual_love.n.02', 'ss')
(u'love', u'love.v.01', 'ss')
(u'love', u'love.v.02', 'ss')
(u'enjoy', u'love.v.02', 'ss')
(u'love', u'love.v.03', 'ss')
(u'sleep_together', u'sleep_together.v.01', 'ss')
(u'roll_in_the_hay', u'sleep_together.v.01', 'ss')
(u'love', u'sleep_together.v.01', 'ss')
(u'make_out', u'sleep_together.v.01', 'ss')
(u'make_love', u'sleep_together.v.01', 'ss')
(u'sleep_with', u'sleep_together.v.01', 'ss')
(u'get_laid', u'sleep_together.v.01', 'ss')
(u'have_sex', u'sleep_together.v.01', 'ss')
(u'know', u'sleep_together.v.01', 'ss')
(u'do_it', u'sleep_together.v.01', 'ss')
(u'be_intimate', u'sleep_together.v.01', 'ss')
(u'have_intercourse', u'sleep_together.v.01', 'ss')
(u'have_it_away', u'sleep_together.v.01', 'ss')
(u'have_it_off', u'sleep_together.v.01', 'ss')
(u'screw', u'sleep_together.v.01', 'ss')
(u'fuck', u'sleep_together.v.01', 'ss')
(u'jazz', u'sleep_together.v.01', 'ss')
(u'eff', u'sleep_together.v.01', 'ss')
(u'hump', u'sleep_together.v.01', 'ss')
(u'lie_with', u'sleep_together.v.01', 'ss')
(u'bed', u'sleep_together.v.01', 'ss')
(u'have_a_go_at_it', u'sleep_together.v.01', 'ss')
(u'bang', u'sleep_together.v.01', 'ss')
(u'get_it_on', u'sleep_together.v.01', 'ss')
(u'bonk', u'sleep_together.v.01', 'ss')
(u'agape', u'agape.n.01', 'hyp')
(u'agape', u'agape.n.02', 'hyp')
(u'agape_love', u'agape.n.02', 'hyp')
(u'amorousness', u'amorousness.n.01', 'hyp')
(u'enamoredness', u'amorousness.n.01', 'hyp')
(u'ardor', u'ardor.n.02', 'hyp')
(u'ardour', u'ardor.n.02', 'hyp')
(u'benevolence', u'benevolence.n.01', 'hyp')
(u'devotion', u'devotion.n.01', 'hyp')
(u'devotedness', u'devotion.n.01', 'hyp')
(u'filial_love', u'filial_love.n.01', 'hyp')
(u'heartstrings', u'heartstrings.n.01', 'hyp')
(u'lovingness', u'lovingness.n.01', 'hyp')
(u'caring', u'lovingness.n.01', 'hyp')
(u'loyalty', u'loyalty.n.02', 'hyp')
(u'puppy_love', u'puppy_love.n.01', 'hyp')
(u'calf_love', u'puppy_love.n.01', 'hyp')
(u'crush', u'puppy_love.n.01', 'hyp')
(u'infatuation', u'puppy_love.n.01', 'hyp')
(u'worship', u'worship.n.02', 'hyp')
(u'adoration', u'worship.n.02', 'hyp')
(u'adore', u'adore.v.01', 'hyp')
(u'care_for', u'care_for.v.02', 'hyp')
(u'cherish', u'care_for.v.02', 'hyp')
(u'hold_dear', u'care_for.v.02', 'hyp')
(u'treasure', u'care_for.v.02', 'hyp')
(u'dote', u'dote.v.02', 'hyp')
(u'love', u'love.v.03', 'hyp')
(u'get_off', u'get_off.v.06', 'hyp')
(u'romance', u'romance.v.02', 'hyp')
(u'fornicate', u'fornicate.v.01', 'hyp')
(u'take', u'take.v.35', 'hyp')
(u'have', u'take.v.35', 'hyp')
(u'hate', u'hate.n.01', 'ant')
(u'hate', u'hate.v.01', 'ant')

勇敢浏览器

(u'brave', u'brave.n.01', 'ss')
(u'brave', u'brave.n.02', 'ss')
(u'weather', u'weather.v.01', 'ss')
(u'endure', u'weather.v.01', 'ss')
(u'brave', u'weather.v.01', 'ss')
(u'brave_out', u'weather.v.01', 'ss')
(u'brave', u'brave.a.01', 'ss')
(u'courageous', u'brave.a.01', 'ss')
(u'audacious', u'audacious.s.01', 'ss')
(u'brave', u'audacious.s.01', 'ss')
(u'dauntless', u'audacious.s.01', 'ss')
(u'fearless', u'audacious.s.01', 'ss')
(u'hardy', u'audacious.s.01', 'ss')
(u'intrepid', u'audacious.s.01', 'ss')
(u'unfearing', u'audacious.s.01', 'ss')
(u'brave', u'brave.s.03', 'ss')
(u'braw', u'brave.s.03', 'ss')
(u'gay', u'brave.s.03', 'ss')
(u'desperate', u'desperate.s.04', 'sim')
(u'heroic', u'desperate.s.04', 'sim')
(u'gallant', u'gallant.s.01', 'sim')
(u'game', u'game.s.02', 'sim')
(u'gamy', u'game.s.02', 'sim')
(u'gamey', u'game.s.02', 'sim')
(u'gritty', u'game.s.02', 'sim')
(u'mettlesome', u'game.s.02', 'sim')
(u'spirited', u'game.s.02', 'sim')
(u'spunky', u'game.s.02', 'sim')
(u'lionhearted', u'lionhearted.s.01', 'sim')
(u'stalwart', u'stalwart.s.03', 'sim')
(u'stouthearted', u'stalwart.s.03', 'sim')
(u'undaunted', u'undaunted.s.02', 'sim')
(u'valiant', u'valiant.s.01', 'sim')
(u'valorous', u'valiant.s.01', 'sim')
(u'bold', u'bold.a.01', 'sim')
(u'colorful', u'colorful.a.02', 'sim')
(u'colourful', u'colorful.a.02', 'sim')
(u'timid', u'timid.n.01', 'ant')
(u'cowardly', u'cowardly.a.01', 'ant')
(u'adventurous', u'adventurous.a.01', 'also')
(u'adventuresome', u'adventurous.a.01', 'also')
(u'bold', u'bold.a.01', 'also')
(u'resolute', u'resolute.a.01', 'also')
(u'unafraid', u'unafraid.a.01', 'also')
(u'fearless', u'unafraid.a.01', 'also')

1
如何使用RitaWN代替JAWS?我发现它在http://wordnet.princeton.edu/wordnet/related-projects/#Java中列为可用API之一。我还看到它有"getAllSynonyms()"方法,他们提供了一个例子,它可以正常工作。
看看这个:
import java.io.IOException;
import java.util.Arrays;

import rita.*;

public class Synonyms {

public static void main(String[] args) throws IOException {

    // Would pass in a PApplet normally, but we don't need to here
    RiWordNet wordnet = new RiWordNet("C:\\Program Files (x86)\\WordNet\\2.1");

    // Get a random noun
    String word = "love";//wordnet.getRandomWord("n");
    // Get max 15 synonyms
    String[] synonyms = wordnet.getAllSynonyms(word, "v");

    System.out.println("Random noun: " + word);
    if (synonyms != null) {
        // Sort alphabetically
        Arrays.sort(synonyms);
        for (int i = 0; i < synonyms.length; i++) {
            System.out.println("Synonym " + i + ": " + synonyms[i]);
        }
    } else {
        System.out.println("No synyonyms!");
    }
}

请确保从http://www.rednoise.org/rita/wordnet-old/documentation/index.htm获取最新的下载和文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接