如何在 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 在 Lemma 级别而不是 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),所以问题是 Synsets
和 Lemmas
具有多对多或一对一的关系。
对于有歧义的词,一词多义,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')]
在一个meaning/concept,多重表示的情况下,我们在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
之间的关系,而不是Lemmas
和Synsets
.
"cute" 的事情是 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
属性 return 是一个 unicode 字符串,而不是列表。来自代码点:https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L202 and https://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:
的文档字符串
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
对象只会 return 我们 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')])
我已成功检索到通过其他语义关系连接到基本同义词集的同义词集,如下所示:
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 在 Lemma 级别而不是 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),所以问题是 Synsets
和 Lemmas
具有多对多或一对一的关系。
对于有歧义的词,一词多义,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')]
在一个meaning/concept,多重表示的情况下,我们在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
之间的关系,而不是Lemmas
和Synsets
.
"cute" 的事情是 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
属性 return 是一个 unicode 字符串,而不是列表。来自代码点:https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L202 and https://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:
的文档字符串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
对象只会 return 我们 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')])