SpaCy:从角色索引中获取令牌

问题描述 投票:1回答:1

有没有一种从字符索引中获取令牌的简单方法?对于每个doc,我都有一个由字符索引(start,end)标识的目标词或短语。 doc.char_span()方法可以从这些方法返回一个范围,并且大部分时间都可以正常工作,但是当索引由于不匹配的标记化而未映射到有效范围时(即索引位于标记的中间),就会出现问题。

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

spacy
1个回答
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中,这样您每个索引只需要计算一次。

© www.soinside.com 2019 - 2024. All rights reserved.