有没有一种简单的方法可以从字符索引中获取令牌?对于每个文档,我都有一个由字符索引(开始、结束)标识的目标单词或短语。该doc.char_span()方法可以从这些范围返回一个范围,并且在大多数情况下都可以正常工作,但是当索引由于不匹配的标记化而未映射到有效范围时(即索引落在标记的中间),就会出现问题。
明显的解决方案是迭代令牌以获得有效的跨度作为备份,这应该没问题,因为这种情况很少发生,但我想知道是否有更聪明的方法来解决它。
你也可以这样做,但我不确定这是否更有效:
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]
Run Code Online (Sandbox Code Playgroud)
请注意,这只是一个简单的示例,您仍然必须处理超出范围的错误以及字符索引是在Token.whitespace标记化过程中折叠到的空格的情况。目前,这些情况将回退到空白所附加的标记(这实际上可能不是一个糟糕的解决方案)。
为了获得最终效率,您可能还可以考虑直接通过spaCy 的 Cython API实现上述内容。如果您需要对此函数进行大量调用,您还可以将字符索引及其标记索引映射存储在字典中,这样您只需为每个索引计算一次。
| 归档时间: |
|
| 查看次数: |
3242 次 |
| 最近记录: |