如何打印出 WordNet 同义词集的主要词条? Python NLTK
How can I print out the main lemma of a WordNet synset? Python NLTK
我有一大套 WordNet 同义词集。此集合的一小部分是:
syns = {"Synset('brutal.s.04')", "Synset('benignant.s.02')"}
我想打印出集合中每个同义词集的同义词集术语(同义词集的主要词条)。比如上面这组的输出应该是:
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,这是一个很好的方法,但我的同义词集是字符串形式的,实际上不是对象。
提前致谢..
如果我正确理解你的数据,你可以遍历字符串列表并使用正则表达式来解析它们。
import re
synsnew=[]
for word in syns:
try:
synsnew.append(re.search(r"'(\w+)\.",word).group(1))
except:
pass
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 类型 ast.literal_eval()
或 eval()
,https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L305 (but before that see 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
class 无法独立于 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'>
然后当你输入的伪字符串 synset syns
变成一个 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']
我有一大套 WordNet 同义词集。此集合的一小部分是:
syns = {"Synset('brutal.s.04')", "Synset('benignant.s.02')"}
我想打印出集合中每个同义词集的同义词集术语(同义词集的主要词条)。比如上面这组的输出应该是:
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,这是一个很好的方法,但我的同义词集是字符串形式的,实际上不是对象。
提前致谢..
如果我正确理解你的数据,你可以遍历字符串列表并使用正则表达式来解析它们。
import re
synsnew=[]
for word in syns:
try:
synsnew.append(re.search(r"'(\w+)\.",word).group(1))
except:
pass
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 类型 ast.literal_eval()
或 eval()
,https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L305 (but before that see 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
class 无法独立于 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'>
然后当你输入的伪字符串 synset syns
变成一个 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']