Есть ли элегантный способ получить индекс слова / токена в его предложении?
Мне известны атрибуты токенов https://spacy.io/api/token#attributes
Атрибут i возвращает индекс во всем родительском документе. Но родительский документ может содержать несколько предложений.
Пример:
"This is an example. This is another example."
Мне нужно, чтобы оба "This" возвращались как индекс 0, оба "is" возвращались как индекс 1 и т. д.

Объект spaCy Doc также позволяет вам перебирать doc.sents, которые являются Span объекты отдельного предложения. Чтобы получить индекс начала и конца диапазона в родительском документе, вы можете посмотреть атрибуты start и end. Итак, если вы перебираете предложения и вычитаете индекс начала предложения из token.i, вы получаете относительный индекс токена в предложении:
for sent in doc.sents:
for token in sent:
print(token.text, token.i - sent.start)
Сегментация предложений по умолчанию использует синтаксический анализ зависимостей, который обычно более точен. Однако вы также можете подключить основанное на правилах или полностью индивидуальное решение (глянь сюда для подробностей).