【问题标题】:How can I retrieve the antonym synset of a target synset in NLTK's Wordnet?如何在 NLTK 的 Wordnet 中检索目标同义词集的反义词同义词集?
【发布时间】:2017-04-18 20:42:38
【问题描述】:

我已成功检索到通过其他语义关系连接到基本同义词集的同义词集,如下:

 wn.synset('good.a.01').also_sees()
 Out[63]: 
 [Synset('best.a.01'),
 Synset('better.a.01'),
 Synset('favorable.a.01'),
 Synset('good.a.03'),
 Synset('obedient.a.01'),
 Synset('respectable.a.01')]

wn.synset('good.a.01').similar_tos()
Out[64]: 
[Synset('bang-up.s.01'),
 Synset('good_enough.s.01'),
 Synset('goodish.s.01'),
 Synset('hot.s.15'),
 Synset('redeeming.s.02'),
 Synset('satisfactory.s.02'),
 Synset('solid.s.01'),
 Synset('superb.s.02'),
 Synset('well-behaved.s.01')]

但是,反义词关系似乎不同。我设法检索到连接到我的基本同义词集的引理,但无法检索实际的同义词集,如下所示:

wn.synset('good.a.01').lemmas()[0].antonyms()
Out[67]: [Lemma('bad.a.01.bad')]

如何获得通过反义词连接到我的基本同义词集的同义词集,而不是引理 - wn.synset('good.a.01') ? TIA

【问题讨论】:

  • 这很棘手,因为反义关系是通过引理而不是同义词组链接到同义词组的。
  • wordnetweb.princeton.edu/perl/… 上看到,S 表示 Synset,W 表示单词(即引理)
  • 嗨,阿尔瓦斯!我实际上是想获取您的电子邮件但找不到它.. 我该如何联系您?我记得你在这里对我所有的 Wordnet 问题提供了最大的帮助:)
  • Lemma 对象你应该能够做到x = Lemma('bad.a.01.bad'); x.synset()

标签: python nlp nltk wordnet lemmatization


【解决方案1】:

出于某种原因,WordNet 在引理级别而不是 Synset 级别索引 antonymy 关系(请参阅 http://wordnetweb.princeton.edu/perl/webwn?o2=&o0=1&o8=1&o1=1&o7=&o5=&o9=&o6=&o3=&o4=&s=good&i=8&h=00001000000000000000000000000000#c),所以问题是 SynsetsLemmas 是多对多还是一对多-一个关系。


在模棱两可的情况下,一字多义,我们在String-to-Synset之间是一对多的关系,例如

>>> wn.synsets('dog')
[Synset('dog.n.01'), Synset('frump.n.01'), Synset('dog.n.03'), Synset('cad.n.01'), Synset('frank.n.02'), Synset('pawl.n.01'), Synset('andiron.n.01'), Synset('chase.v.01')]

在一个含义/概念、多个表示的情况下,我们在Synset-to-String 之间存在一对多的关系(其中 String 指的是引理名称):

>>> dog = wn.synset('dog.n.1')
>>> dog.definition()
u'a member of the genus Canis (probably descended from the common wolf) that has been domesticated by man since prehistoric times; occurs in many breeds'
>>> dog.lemma_names()
[u'dog', u'domestic_dog', u'Canis_familiaris']

注意:到目前为止,我们比较的是String和Synsets而不是LemmasSynsets之间的关系。


“可爱”的是Lemma和String是一对一的关系:

>>> wn.synsets('dog')
[Synset('dog.n.01'), Synset('frump.n.01'), Synset('dog.n.03'), Synset('cad.n.01'), Synset('frank.n.02'), Synset('pawl.n.01'), Synset('andiron.n.01'), Synset('chase.v.01')]
>>> wn.synsets('dog')[0]
Synset('dog.n.01')
>>> wn.synsets('dog')[0].definition()
u'a member of the genus Canis (probably descended from the common wolf) that has been domesticated by man since prehistoric times; occurs in many breeds'
>>> wn.synsets('dog')[0].lemmas()
[Lemma('dog.n.01.dog'), Lemma('dog.n.01.domestic_dog'), Lemma('dog.n.01.Canis_familiaris')]
>>> wn.synsets('dog')[0].lemmas()[0]
Lemma('dog.n.01.dog')
>>> wn.synsets('dog')[0].lemmas()[0].name()
u'dog'

Lemma 对象的 _name 属性返回一个 unicode 字符串,而不是一个列表。从代码点:https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L202https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L444

似乎引理与 Synset 是一对一的关系。来自https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L220的文档字符串:

引理属性,可通过同名方法访问::

  • name:此引理的规范名称。
  • synset:此引理所属的同义词集。
  • syntactic_marker:对于形容词,WordNet 字符串标识 句法位置相对修饰名词。看: http://wordnet.princeton.edu/man/wninput.5WN.html#sect10 对于所有其他词性,此属性为无。
  • count:这个引理在 wordnet 中出现的频率。

所以我们可以这样做并以某种方式知道每个 Lemma 对象只会返回我们 1 个同义词集:

>>> wn.synsets('dog')[0].lemmas()[0]
Lemma('dog.n.01.dog')
>>> wn.synsets('dog')[0].lemmas()[0].synset()
Synset('dog.n.01')

假设您正在尝试进行一些情感分析,并且您需要 WordNet 中每个形容词的反义词,您可以轻松地执行此操作来接受反义词的同义词:

>>> from nltk.corpus import wordnet as wn
>>> all_adj_in_wn = wn.all_synsets(pos='a')
>>> def get_antonyms(ss):
...     return set(chain(*[[a.synset() for a in l.antonyms()] for l in ss.lemmas()]))
...
>>> for ss in all_adj_in_wn:
...     print ss, ':', get_antonyms(ss)
... 
Synset('unable.a.01') : set([Synset('unable.a.01')])

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
相关资源
最近更新 更多