【问题标题】:How do I print out just the word itself in a WordNet synset using Python NLTK?如何使用 Python NLTK 在 WordNet 同义词集中打印出单词本身?
【发布时间】:2014-08-31 02:28:03
【问题描述】:

有没有办法在 Python 2.7 中使用 NLTK 来获取单词而不是包含 "synset" 和括号以及 "n.01" 等的额外格式?

例如,如果我这样做了

        wn.synsets('dog')

我的结果如下:

[Synset('dog.n.01'), Synset('frump.n.01'), Synset('dog.n.03'), Synset('cad.n.01'), Synset('frank.n.02'), Synset('pawl.n.01'), Synset('andiron.n.01'), Synset('chase.v.01')]

我怎样才能得到这样的列表?

dog
frump
cad
frank
pawl
andiron
chase

有没有办法使用NLTK 来做到这一点,还是我必须使用regular expressions?我可以在 python 脚本中使用regular expressions 吗?

【问题讨论】:

  • 根据规则 includes "synset" and the parentheses and the "n.01" frankchase 不应成为所需输出的一部分?
  • 与问题无关,但 frankfrankfurter 的同义词/简写,hot dogdog 的同义词。同样dog作为动词表示chase
  • 我看到一个微弱的讽刺失败,没有遇到微妙的讽刺色彩......

标签: python regex nltk wordnet


【解决方案1】:

如果您想在不使用正则表达式的情况下执行此操作,可以使用列表推导式。

[synset.name.split('.')[0] for synset in wn.synsets('dog') ]

您在这里所做的就是说,对于每个同义词集,返回句点之前的第一个单词。

【讨论】:

  • 请务必使用 name() 而不是 name,NLTK 对这个函数做了些微改动。
【解决方案2】:

试试这个:

for synset in wn.synsets('dog'):
    print synset.lemmas[0].name

您想遍历 dog 的每个同义词集,然后打印出同义词集的词条。请记住,多个单词可以附加到同一个同义词集,因此如果您想获取与 dog 的所有同义词集关联的所有单词,您可以这样做:

for synset in wn.synsets('dog'):
    for lemma in synset.lemmas:
        print lemma.name

【讨论】:

  • 唉,第一次剪断抛出 'instancemethod' object is not subscriptable 和第二次 sn-p 抛出 TypeError: 'instancemethod' object is not iterable 与 NLTK 3.0
  • @duhaime 以前的属性变成了方法。你需要做synset.lemmas()[0].name()
【解决方案3】:

使用引理名称可能有效,但 Synset 对象的同义词集名称有一个规范变量,请尝试:

>>> from nltk.corpus import wordnet as wn
>>> wn.synset('dog.n.1')
Synset('dog.n.01')
>>> wn.synset('dog.n.1').name
'dog.n.01'
>>> wn.synset('dog.n.1').name.partition('.')[0]
'dog'
>>> for ss in wn.synsets('dog'):
...     print ss.name.partition('.')[0]
... 
dog
frump
dog
cad
frank
pawl
andiron
chase

【讨论】:

  • 您是否知道在 NLTK 3.0 中是否有类似的方法可用?我在运行分区线 'function' object has no attribute 'partition' 时遇到错误
  • @duhaime,请使用 wn.synset('dog.n.1').name(),因为 NLTK 更改了 Synset 属性以获取函数。见github.com/alvations/pywsd/issues/6
【解决方案4】:

很简单,只需创建一个列表,然后获取第一个值

from nltk.corpus import wordnet as wn
syn=[]
for s in wn.synsets('dog'):
   syn.appned(s)
return syn[0]

【讨论】:

    【解决方案5】:

    aelfric5578 你已经接近了:属性名称是一个函数,而不是一个字符串。
    [synset.name().split('.')[0] for synset in wn.synsets('dog') ]

    【讨论】:

      猜你喜欢
      • 2015-09-22
      • 2017-04-18
      • 2013-10-16
      • 2013-02-26
      • 2023-03-11
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 2015-12-18
      相关资源
      最近更新 更多