从Cython访问自定义属性

时间:2019-03-01 12:48:20

标签: cython spacy

在我的代码的某个地方,我需要知道令牌所属的句子数是多少,因此我按如下方式分配自定义属性:

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似乎是该属性的默认值,但它并不注意我分配给该属性的值。

访问自定义属性的正确方法是什么?

1 个答案:

答案 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')
相关问题