SpaCy:从字符索引获取令牌

时间:2019-03-11 19:58:59

标签: spacy

是否有一种简单的方法可以从字符索引中获取令牌?对于每个文档,我都有一个由字符索引(开始,结束)标识的目标单词或短语。 doc.char_span()方法可以从中返回一个跨度,并且在大多数情况下都可以正常工作,但是当索引由于不匹配的标记化而无法映射到有效跨度(即索引落在中间)时,就会出现问题令牌)。

显而易见的解决方案是遍历令牌以获取有效的跨度作为备份,这应该很好,因为这种情况很少见,但是我想知道是否有更聪明的方法来解决此问题。

1 个答案:

答案 0 :(得分:0)

您也可以这样做,但是我不确定这是否更有效:

def get_token_for_char(doc, char_idx):
    for i, token in enumerate(doc):
        if char_idx > token.idx:
            continue
        if char_idx == token.idx:
            return token
        if char_idx < token.idx:
            return doc[i - 1]

请注意,这只是一个简单的示例,您仍然必须处理超出范围的错误以及字符索引是在标记化过程中折叠到Token.whitespace中的空格的情况。目前,这些情况将退回到空白附加到的令牌上(毕竟这实际上可能不是一个糟糕的解决方案)。

为了获得最高效率,您可能还可以考虑直接通过spaCy's Cython API来实现上述功能。如果需要对该函数进行大量调用,则还可以将字符索引及其标记索引映射存储在dict中,这样您就不必为每个索引计算一次。