在 Python 中使用 'in' 关键字查找集合中的项目时遇到问题



这里有这段代码。

import spacy
nlp = spacy.load('en')
a = set(nlp('This is a test'))
b = nlp('is')
if b in a:
print("Success")
else:
print("Failed")

由于某种原因,此输出打印出"失败"。我期望它能成功。我是新使用spacy框架的,所以我不太确定如何正确地做到这一点。我该怎么做?

type(b)<class 'spacy.tokens.doc.Doc'>,您正在与作为集合<class 'set'>的变量进行比较。因此,尝试将这两个变量都转换为set,然后尝试in方法。并且nlp令牌中的每个项都是<class 'spacy.tokens.token.Token'>类,而不是字符串。因此,在尝试使用in运算符之前,必须将它们转换为兼容的类型。

a = set(nlp('This is a test'))
a = {str(token) for token in a} # convert all token type to str
b = nlp('is')
b = str(set(b).pop()) # convert token to str, effectively same as b = 'is'
if b in a:
print("Success")
else:
print("Failed")

我认为您不能依赖令牌的哈希来进行设置操作您可以深入查看.text属性

import spacy
nlp = spacy.load('en')
a = set(x.text for x in nlp('This is a test'))
b = nlp('is').text
if b in a:
print("Success")
else:
print("Failed")

证明。。。

>>> import spacy
>>> nlp = spacy.load('en')
>>> a = set(x.text for x in nlp('This is a test'))
>>> b = nlp('is').text
>>> if b in a:
...   print("Success")
... else:
...   print("Failed")
... 
Success

@bboyjacks:感谢您高度重视这个有趣的问题

我只是想让你知道,它与spaCy框架无关,它更多地与python概念有关。

上面@John La Rooy提供的答案是正确的,但我把我的版本放在了spaCy社区中,正如你所问的一样(这可能会为解决方案增加一些清晰度(。

请在下面查看我的答案:

print(a) # prints -> {This, test, is}
print(b) # prints -> is

因此,看起来"in"操作员应该工作,但问题如下:

print(type(a))          # prints -> <class 'set'>
print(type(a.pop()))    # prints -> <class 'spacy.tokens.token.Token'>
print(type(b))          # prints -> <class 'spacy.tokens.doc.Doc'>

类型为[spacy.tokens.doc.doc]==类型为的对象[spacy.tokens.token.token]将始终返回">错误">

我们需要以某种方式将它们转换为相同的类型,因为我们不确定spaCy提供的Token或Doc类中定义的相等方法,所以只需将两者转换为str类即可。

这个转换可以如@John La Rooy所示进行,也可以尝试下面完整的运行代码。

import spacy
nlp = spacy.load('en')
a = set(nlp('This is a test'))
b = nlp('is')
if b.text in map(lambda token: token.text, a):
print("Success")
else:
print("Failed")

如需进一步澄清,请随时发表评论,我的回复可能会有一些延迟,但我会尽力回复。

最新更新