【问题标题】:How can I print out the main lemma of a WordNet synset? Python NLTK如何打印出 Wo​​rdNet 同义词集的主要引理? Python NLTK
【发布时间】:2015-12-18 03:59:42
【问题描述】:

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

提前谢谢..

【问题讨论】:

  • 所以你的数据是一个字符串列表,看起来像这样:"Synset('brutal.s.04')" ?

标签: python nltk wordnet


【解决方案1】:

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']

【讨论】:

  • +1。这正是我所希望的。也就是说,将字符串转换为实际的同义词集对象,然后得到同义词集词。我其实是希望你能回答这个问题,昨天就在等这个。这次真是万分感谢。 @alvas
  • 我很高兴答案有所帮助。
【解决方案2】:

如果我正确理解了您的数据,您可以遍历字符串列表并使用正则表达式来解析它们。

import re
synsnew=[]
for word in syns:
    try:
        synsnew.append(re.search(r"'(\w+)\.",word).group(1))
    except:
        pass

【讨论】:

  • 我收到以下错误:AttributeError: 'NoneType' object has no attribute 'group' @Charlie Haley
  • 这意味着您的某些数据格式不同或在同一位置没有单词。
  • 我使用了以下内容: syns=[re.search(r"'(\w+)\.", word) for word in syns] 这是没有组的。它可以工作,但输出类似于: <_sre.sre_match object span="(7," match="'smooth.">。我怎样才能只打印匹配项,就像在这种情况下,输出应该只是“平滑”@Charlie Haley
  • 我的意思是:你的一些同义词集没有引理吗?还是有些格式不同?
  • 它们都采用一种一致的格式。就像上面一样。 @查理海莉
猜你喜欢
  • 2014-08-31
  • 2015-09-22
  • 2014-07-24
  • 1970-01-01
  • 2017-04-18
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多