python - 如何打印出 Wo​​rdNet 同义词集的主要词条? Python NLTK

标签 python nltk wordnet

我有一大套 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 ,这是一个很好的方法,但我的同义词集是字符串形式,而不是实际对象。

提前致谢..

最佳答案

长话短说

>>> 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 (但在此之前请参阅 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 对象将如下所示:

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 - 如何打印出 Wo​​rdNet 同义词集的主要词条? Python NLTK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32695446/

相关文章:

python - 如何查找列表中句子列表中每个单词的引理和频率计数?

python - NLTK 中的 Wordnet 选择限制

python - virtualenv 中的 IPython Notebook,使用 Python 3.3

python - 我怎样才能杀死我用 python 启动的进程

Python 执行和 __name__

python - 在 setup.py 脚本中安装 nltk 数据依赖项

python - res_similarity() 函数的参数

python来自自定义模块ModuleNotFoundError : No module named 'activity'

python - NLTK:过滤具有特定结构的句子

python - 从字符串中解析始发城市/目的地城市