这里有这段代码。
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")
如需进一步澄清,请随时发表评论,我的回复可能会有一些延迟,但我会尽力回复。