SpaCy: получить токен из индекса персонажа - PullRequest
1 голос
/ 11 марта 2019

Есть ли простой способ получить токен из индекса персонажа?Для каждого документа у меня есть целевое слово или фраза, идентифицируемая индексами символов (начало, конец).Метод doc.char_span() может возвращать диапазон из этих, и он работает нормально большую часть времени, но проблема возникает, когда индексы не отображаются в допустимый диапазон из-за несовпадения токенизации (то есть индекс падает в серединемаркер).

Очевидным решением является итерация по токенам для получения действительного диапазона в качестве резервной копии, что должно быть хорошо, так как это редкое явление, но мне интересно, есть ли более разумный способ сделать это.

1 Ответ

0 голосов
/ 21 марта 2019

Вы также можете сделать что-то подобное, но я не уверен, что это более эффективно:

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

...