Verbnet:vn.classids()返回2个列表,但我需要删除其中的1个

时间:2015-03-08 02:31:03

标签: python nlp nltk

metaphor1 = " I run a race" 
from nltk.corpus import verbnet as vn
for word in metaphor1.split():
    if vn.classids(word) != []:
        start = set(vn.classids(word))
        print (start)

以上代码将打印出来

['meander-47.7', 'preparing-26.3-1', 'run-51.3.2', 'swarm-47.5.1-1']
['run-51.3.2']

第一个是" run"的所有动词意义列表。但是第二个列表是给出句子中使用的意义的列表。我想删除第一个列表,我尝试使用

metaphor1 = " I run a race" 
from nltk.corpus import verbnet as vn

for word in metaphor1.split():
    if vn.classids(word) != []:
        start = set(vn.classids(word))
        remove = set(vn.classids('run'))
        final = list(set(vn.classids(word))-set(vn.classids('run')))
        print (final)

然而,这会返回

[]
[]

究竟是什么导致了这个问题,我该如何解决它。

1 个答案:

答案 0 :(得分:1)

循环返回一个空列表[],因为集合与其自身的对称差异是空集。

您想删除synset的第三个元素run-51.3.2。您错误地将变量remove分配给run的整个同义词集,而不只是一个元素。

试试这个

import nltk
metaphor1 = STRING HERE
for word,pos in nltk.pos_tag(nltk.word_tokenize(metaphor1):
    if 'V in pos: #Another way to focus on only verbs
       return [sense for sense in vn.classids(word) if 'run' not in sense]

我使用pos_tag作为显式动词。 VerbNet可能会返回一个空列表,即使单词不在VerbNet数据库中,即使单词作为动词起作用。

我使用word_tokenize来使代码更通用。

代码返回一个列表。如果您只想将变量打印到控制台,请将return更改为print