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

标签 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)

但是这会返回

[]
[]

到底是什么导致了这个问题以及如何解决它。

最佳答案

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

您想要删除同义词集的第三个元素,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

关于python - Verbnet : vn. classids() 返回 2 个列表,但我需要删除其中 1 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28922423/

相关文章:

python - 导入 nltk 时 Flask WSGI 应用程序挂起

regex - Python 3 中最快的标记化函数是什么?

Python dateutil 解析器,忽略字符串的非日期部分

python - 在当前进程中通过 python 运行 bat 文件

python - 使用 numpy 创建许多随机棒坐标的省时方法

machine-learning - 对产品描述杂乱文本数据进行分类的最佳方法

python - 每行最小值,Python Pandas

java - 未知单词的 IDF 分数?

nlp - 如何处理我从 syntaxnet 获得的树?(conll 格式)

python - 如何使用雪球的加泰罗尼亚语词干分析器?