簡體   English   中英

如何在 NLTK 的 Wordnet 中檢索目標同義詞集的反義詞同義詞集?

[英]How can I retrieve the antonym synset of a target synset in NLTK's Wordnet?

我已成功檢索到通過其他語義關系連接到基本同義詞集的同義詞集,如下所示:

 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

出於某種原因,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對於所有其他詞性,此屬性為 None。
  • 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')])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM