TL;DR
>>> syns = {"Synset('brutal.s.04')", "Synset('benignant.s.02')"}
>>> [wn.synset(i[8:-2]) for i in syns]
[Synset('benignant.s.02'), Synset('brutal.s.04')]
>>> syns = [wn.synset(i[8:-2]) for i in syns]
>>> syns[0].lemma_names()
[u'benignant', u'gracious']
首先要获得一个以字符串形式打印出来的输入是很奇怪的。因此,第一种直观的方法是使用 Synset 类型 https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L305 执行类似 ast.literal_eval() 或 eval() 的操作(但在此之前请参阅 http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html):
>>> from nltk.corpus.reader.wordnet import Synset
>>> from nltk.corpus import wordnet as wn
>>> syns = {"Synset('brutal.s.04')", "Synset('benignant.s.02')"}
>>> [eval(i) for i in syns]
[Synset('None'), Synset('None')]
显然,Synset 类不能独立于 nltk.corpus.wordnet 工作。所以我们来看看wordnet.synset() 函数(https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1217)。似乎它只需要Synset 对象的预分配名称,所以:
>>> wn.synset('brutal.s.04')
Synset('brutal.s.04')
>>> type(wn.synset('brutal.s.04'))
<class 'nltk.corpus.reader.wordnet.Synset'>
之后,当您输入syns 中的伪字符串synset 变为Synset 时,您可以轻松控制Synset,如How do I print out just the word itself in a WordNet synset using Python NLTK? 所示
回到你奇怪的输入syns,执行以下操作将为我提供同义词集的名称:
>>> syns = {"Synset('brutal.s.04')", "Synset('benignant.s.02')"}
>>> list(syns)[0]
"Synset('benignant.s.02')"
>>> list(syns)[0][8:-2]
'benignant.s.02'
回到将其转换为 Synset:
>>> syns = {"Synset('brutal.s.04')", "Synset('benignant.s.02')"}
>>> [wn.synset(i[8:-2]) for i in syns]
[Synset('benignant.s.02'), Synset('brutal.s.04')]
>>> syns = [wn.synset(i[8:-2]) for i in syns]
>>> syns[0].lemma_names()
[u'benignant', u'gracious']
但是让我们完全回滚,你会得到一个奇怪的输入 syns,因为有人通过简单地将 str() 转换为 Synset 对象来保存他们的输出:
>>> syns[0]
Synset('benignant.s.02')
>>> str(syns[0])
"Synset('benignant.s.02')"
这个人本来可以做的:
>>> syns[0].name()
u'benignant.s.02'
然后您的输入 syns 对象将如下所示:
syns = {u'brutal.s.04', u'benignant.s.02'}
要阅读它,您只需这样做:
>>> from nltk.corpus import wordnet as wn
>>> syns = {u'brutal.s.04', u'benignant.s.02'}
>>> syns = [wn.synset(i) for i in syns]
>>> syns[0]
Synset('brutal.s.04')
>>> syns[0].lemma_names()
[u'brutal']