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)
然而,这会返回
[]
[]
究竟是什么导致了这个问题,我该如何解决它。
答案 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
。