【问题标题】:comparing synonyms NLTK [duplicate]比较同义词NLTK [重复]
【发布时间】:2015-06-11 04:28:39
【问题描述】:

我想不出一个陌生的问题,猜你会帮助我。

for p in wn.synsets('change'):<br>
    print(p)

获取:

Synset('change.n.01')
Synset('change.n.02')
Synset('change.n.03')
Synset('change.n.04')
Synset('change.n.05')
Synset('change.n.06')
Synset('change.n.07')
Synset('change.n.08')
Synset('change.n.09')
Synset('variety.n.06')
Synset('change.v.01')
Synset('change.v.02')
Synset('change.v.03')
Synset('switch.v.03')
Synset('change.v.05')
Synset('change.v.06')
Synset('exchange.v.01')
Synset('transfer.v.06')
Synset('deepen.v.04')
Synset('change.v.10')

例如我有一个字符串:

a = 'transfer'

我希望能够识别单词 'change' 的各种同义词并知道 f.e. 'transfer' 就是其中之一。我怎样才能问我的程序: “'transfer'是'change'的同义词之一吗?”

【问题讨论】:

    标签: python nlp nltk wordnet synonym


    【解决方案1】:

    首先,wordnet 索引概念(又名 Synsets)并链接每个概念的可能单词,以下代码显示了与单词“change”的概念链接:

    >>> from nltk.corpus import wordnet as wn
    >>> wn.synsets('change')
    [Synset('change.n.01'), Synset('change.n.02'), Synset('change.n.03'), Synset('change.n.04'), Synset('change.n.05'), Synset('change.n.06'), Synset('change.n.07'), Synset('change.n.08'), Synset('change.n.09'), Synset('variety.n.06'), Synset('change.v.01'), Synset('change.v.02'), Synset('change.v.03'), Synset('switch.v.03'), Synset('change.v.05'), Synset('change.v.06'), Synset('exchange.v.01'), Synset('transfer.v.06'), Synset('deepen.v.04'), Synset('change.v.10')]
    

    同义词集有几个属性,它有:

    • 身份证号
    • 词性标签
    • 定义
    • 引理名称,即可用于实例化概念的可能单词
    • 通过 N-nymy 关系(例如上位词、下位词、meronym)链接到其他同义词集

    下面是如何在 NLTK 中接口上述属性:

    >>> wn.synsets('change')[0]
    Synset('change.n.01')
    >>> wn.synsets('change')[0].offset()
    7296428
    >>> wn.synsets('change')[0].pos()
    u'n'
    >>> wn.synsets('change')[0].definition()
    u'an event that occurs when something passes from one state or phase to another'
    >>> wn.synsets('change')[0].lemma_names()
    [u'change', u'alteration', u'modification']
    >>> wn.synsets('change')[0].hypernyms()
    [Synset('happening.n.01')]
    

    但同义词集不一定有同义词关系。如果我们将同义词定义为具有相似含义的词,那么具有同义关系的是词(即引理)。此外,词的上下文定义了一个词是否是另一个词的同义词。一个词的意义是有限的,它是包含意义的“概念”,并通过人类的语言将意义实例化。至少这是典型的语义理论,见http://goo.gl/ZHzlNF第2章

    所以当你想问'transfer'是'change'的同义词时,你得先:

    • 定义/选择您在此处引用的概念并提供使用“转移”的上下文,谷歌词义消歧
    • 定义您所指的变更概念。

    那么意义的比较是可能的。

    另见:

    【讨论】:

      【解决方案2】:

      您需要首先获取lemmas,然后遍历您的引理并获取名称,然后使用in 操作数检查成员资格:

      >>> a in [j.name() for i in wn.synsets('change') for j in i.lemmas()]
      True
      
      >>> [j.name() for i in wn.synsets('change') for j in i.lemmas()]
      [u'change', u'alteration', u'modification', u'change', u'change', u'change', u'change', u'change', u'change', u'change', u'change', u'variety', u'change', u'change', u'alter', u'modify', u'change', u'change', u'alter', u'vary', u'switch', u'shift', u'change', u'change', u'change', u'exchange', u'commute', u'convert', u'exchange', u'change', u'interchange', u'transfer', u'change', u'deepen', u'change', u'change']
      

      【讨论】:

        【解决方案3】:

        这些是这个词的不同含义。您可以使用synset('xxx').lemma_names 获取每种含义的同义词。然后,您可以比较其中是否存在该单词。

        【讨论】:

          【解决方案4】:

          wn.synsets 给你一个含义列表,每个含义都有一个单词列表。

          for sense in wn.synsets('change'):
              if "transfer" in sense.lemma_names:
                  print "'transfer' is synonym to 'change'"
                  break
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-11-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-24
            • 2012-06-15
            • 2016-11-09
            • 1970-01-01
            相关资源
            最近更新 更多