我有一大组WordNet语法集。这一套的一小部分是:

syns = {"Synset('brutal.s.04')", "Synset('benignant.s.02')"}

我想打印出集合中每个synset的synset项(synset的主引理)。例如,上述集合的输出应为:
brutal, benignant

这是我使用的代码:
    from nltk.corpus import wordnet as wn
    for s in syns:
        print(wn.s.lemmas[0])

但这不起作用,因为s被认为是一个字符串,而不是一个对象。我得到以下错误:
AttributeError: 'WordNetCorpusReader' object has no attribute 's'

这是因为s被看作一个字符串,而不是一个对象。我试图将s改为字节形式,如下所示:
    s = bytes(s)

但那不管用。我怎样才能用最简单的方法只打印出上面提到的引理呢?
我检查了here,这是一个很好的方法,但是我的语法集是字符串形式的,实际上不是对象。
提前谢谢。。

最佳答案

TL;博士

>>> 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,执行以下操作将给出synset的名称:
>>> 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 = {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']

关于python - 如何打印WordNet同义词集的主要引理? Python NLTK,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32695446/

10-13 02:17