如何在NLTK的Wordnet中检索目标synset的反义词synset?

2024-10-02 02:37:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经成功地检索到通过其他语义关系连接到基synset的synsets,如下所示:

 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')]

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

^{pr2}$

我怎么能得到语法集,而不是引理,它通过反义词连接到我的基本语法集-wn.synset公司('good.a.01')?TIA公司


Tags: 关系语义语法公司outalsobestgood
1条回答
网友
1楼 · 发布于 2024-10-02 02:37:36

由于某些原因,WordNet在引理级别索引antonymy关系,而不是Synset(参见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),所以问题是Synsets和{}是多对多还是一对一关系。在


在歧义词的情况下,一个词多个意思,我们在字符串到-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-到String之间有一对多的关系(其中String指的是引理名):

^{pr2}$

注意:到目前为止,我们比较的是字符串与Synsets而不是{}和{}之间的关系。在


“可爱”的是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的docstring:

Lemma attributes, accessible via methods with the same name::

  • name: The canonical name of this lemma.
  • synset: The synset that this lemma belongs to.
  • syntactic_marker: For adjectives, the WordNet string identifying the syntactic position relative modified noun. See: http://wordnet.princeton.edu/man/wninput.5WN.html#sect10 For all other parts of speech, this attribute is None.
  • count: The frequency of this lemma in wordnet.

所以我们可以这样做,并且知道每个Lemma对象只会返回1个synset:

>>> 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')])

相关问题 更多 >

    热门问题