【问题标题】:Using WordNet with nltk to find synonyms that make sense使用带有 nltk 的 WordNet 查找有意义的同义词
【发布时间】:2020-08-31 07:02:00
【问题描述】:

我想输入一个句子,然后输出一个简单的单词。

我正在使用 Nltk 来标记句子和标记单词,但是我在使用 WordNet 来查找我想要的单词的特定含义的同义词时遇到了麻烦。

例如:

输入: "我拒绝去捡拒绝"

也许垃圾#1 是拒绝的最简单的词,但垃圾#2 意味着垃圾,还有更简单的词可以去那里。

Nltk 可能能够将垃圾#2 标记为名词,但是我如何从 WordNet 中获取垃圾(垃圾)的同义词?

【问题讨论】:

    标签: python nltk wordnet


    【解决方案1】:

    听起来您想要基于词的词性(即名词、动词等)的词同义词

    Follows 根据词性为句子中的每个单词创建同义词。 参考资料:

    1. Extract Word from Synset using Wordnet in NLTK 3.0
    2. Printing the part of speech along with the synonyms of the word

    代码

    import nltk; nltk.download('popular') 
    from nltk.corpus import wordnet as wn
    
    def get_synonyms(word, pos):
      ' Gets word synonyms for part of speech '
      for synset in wn.synsets(word, pos=pos_to_wordnet_pos(pos)):
        for lemma in synset.lemmas():
            yield lemma.name()
    
    def pos_to_wordnet_pos(penntag, returnNone=False):
       ' Mapping from POS tag word wordnet pos tag '
        morphy_tag = {'NN':wn.NOUN, 'JJ':wn.ADJ,
                      'VB':wn.VERB, 'RB':wn.ADV}
        try:
            return morphy_tag[penntag[:2]]
        except:
            return None if returnNone else ''
    

    示例用法

    # Tokenize text
    text = nltk.word_tokenize("I refuse to pick up the refuse")
    
    for word, tag in nltk.pos_tag(text):
      print(f'word is {word}, POS is {tag}')
    
      # Filter for unique synonyms not equal to word and sort.
      unique = sorted(set(synonym for synonym in get_synonyms(word, tag) if synonym != word))
    
      for synonym in unique:
        print('\t', synonym)
    

    输出

    请注意基于 POS 的不同组的拒绝。

    word is I, POS is PRP
    word is refuse, POS is VBP
         decline
         defy
         deny
         pass_up
         reject
         resist
         turn_away
         turn_down
    word is to, POS is TO
    word is pick, POS is VB
         beak
         blame
         break_up
         clean
         cull
         find_fault
         foot
         nibble
         peck
         piece
         pluck
         plunk
    word is up, POS is RP
    word is the, POS is DT
    word is refuse, POS is NN
         food_waste
         garbage
         scraps
    

    【讨论】:

    • 应该是 pos=pos_to_wordnet_pos(pos) 而不是 pos=pos_to_wordnet_pos(tag)?感谢您的帮助
    • @lajlskjdlfjlatemp——是的,你是对的。在这种情况下,在示例用法中,由于函数参数 pos 等于来自父调用,所以它解决了。但是,更新了功能更正确。这是你要找的还是别的什么?
    • @lajlskjdlfjlatemp——还更新了代码,只显示不等于单词的唯一同义词。
    • 这似乎非常适合我想用它来做什么。感谢您的彻底帮助!
    • 有没有办法获得接近的同义词?例如,对于“discombobulate”,同义词列表包括“throw”,这显然是一个更简单的词,但不一定是 discombobulate 的良好替代品。
    猜你喜欢
    • 2023-03-11
    • 2013-07-14
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多