在我的代码的某个地方,我需要知道令牌所属的句子数是多少,因此我按如下方式分配自定义属性:
from spacy.tokens import Token
Token.set_extension('number', default=0)
之后,我想使用Cython对令牌使用快速循环,并在C ++级别访问此属性。我知道我们有:
Token.get_struct_attr
但它似乎无法通过以下方式工作:
def traverse_doc(Doc doc):
cdef int n_tokens = len(doc)
cdef tokens = []
cdef attr_hash = doc.vocab.strings.add('number')
for token in doc.c[:n_tokens]:
tokens.append(Token.get_struct_attr(&token, attr_hash))
此代码为每个令牌生成以下元组:
(0, None, None, None)
0似乎是该属性的默认值,但它并不注意我分配给该属性的值。
访问自定义属性的正确方法是什么?
答案 0 :(得分:0)
Token.get_struct_attr
默认为0
(或更确切地说,它委托给Lexeme.get_struct_attr
,该属性默认为0
– {{3} }。扩展名的默认值为0
,这只是一个令人困惑的巧合。用户定义的自定义扩展属性不会存储为C数据,因为它们可以任何内容,因此无法键入。
因此,您需要在给定的令牌索引下检查 Python doc.c
,而不是doc
:
for i in range(n_tokens):
# Option 1: Use the ._ attribute
number = doc[i]._.number
# Option 2: Use the .get method with string attribute
number = doc[i]._.get('number')