SpaCy:如何从字符索引获取标记

7
有没有一种简单的方法从字符索引中获取令牌?对于每个文档,我都有一个目标单词或短语,它们是通过字符索引(start, end)来确定的。 doc.char_span() 方法可以从中返回范围,这在大多数情况下都可以正常工作,但当索引由于标记化不匹配(即索引位于标记的中间位置)而无法映射到有效范围时,就会出现问题。
明显的解决方案是迭代标记以获得一个有效的备用范围,因为这是一个罕见的情况,这应该是可以接受的,但我想知道是否有更聪明的方法。
1个回答

4
您也可以这样做,但我不确定是否更有效率:
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 的Cython API来实现上述功能。如果您需要频繁调用此函数,则还可以在字典中存储字符索引及其标记索引映射,这样您每次只需计算一次即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接