Вы также можете сделать что-то подобное, но я не уверен, что это более эффективно:
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, так что вам придется вычислять это только один раз для каждого индекса.