Как SpaCy отслеживает смещение персонажа и токена во время токенизации? - PullRequest
3 голосов
/ 26 марта 2019

Как SpaCy отслеживает смещение персонажа и токена во время токенизации?

В SpaCy есть объект Span, который сохраняет начальное и конечное смещение токена / диапазона https://spacy.io/api/span#init

Существует метод _recalculate_indices, который, кажется, извлекает token_by_start и token_by_end, но похоже, что все пересчет делает.

Глядя на посторонние пространства, он делает умное выравнивание пролетов .

Пересчитывает ли он после каждого выполнения регулярного выражения, отслеживает ли он движение персонажа?Выполняет ли поиск по диапазону выполнения регулярных выражений?

1 Ответ

4 голосов
/ 27 апреля 2019

Сводка:
Во время токенизации эта является частью, которая отслеживает смещение и символ.

Простой ответ: в строке идет символ за символом.

TL; DR находится внизу.


Объяснение фрагмента по фрагменту:

Он принимает строку для токенизации и начинает перебирать ее по одной букве / пробелу за раз.

Это простой цикл for в строке, где ucявляется текущим символом в строке.

for uc in string:

Сначала проверяется, является ли текущий символ пробелом, и сравнивает его, чтобы увидеть, является ли последний параметр in_ws противоположным, является ли он пробелом илине.Если они одинаковы, он будет прыгать вниз и увеличиваться i += 1.

in_ws используется, чтобы узнать, должен ли он обрабатываться или нет.Они хотят работать с пробелами и персонажами, поэтому они не могут просто отслеживать isspace() и работать только с False.Вместо этого при первом запуске in_ws устанавливается равным результату string[0].isspace(), а затем сравнивается с самим собой.Если string[0] является пробелом, он будет оценивать то же самое, поэтому пропускает и увеличивает i (обсуждается позже) и переходит к следующему uc, пока не достигнет uc, которое не совпадает с первым,На практике это позволяет ему последовательно проходить через несколько пробелов после обработки первого пробела или нескольких символов, пока не достигнет следующей границы пробела.

    if uc.isspace() != in_ws:

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

Он отслеживает два значения индекса: start и i.start - это начало потенциального токена, на котором он включен, а i - это конечный символ, на который он смотрит.Когда скрипт запустится, start будет 0.После этого цикла start будет индексом последнего пробела плюс 1, что сделает его первой буквой текущего слова.

Сначала проверяется, меньше ли start iкоторый используется, чтобы узнать, должен ли он попытаться проверить кеш и токенизировать текущую последовательность символов.Это будет иметь смысл в дальнейшем.

        if start < i:

span - это слово, которое в настоящее время рассматривается для токенизации.Это строка, разрезанная по значению индекса start до значения индекса i.

            span = string[start:i]

Затем он берет хэш слова (от start до i) и проверяеткэшировать словарь, чтобы увидеть, было ли это слово уже обработано.Если этого не произойдет, он вызовет метод _tokenize для этой части строки.

            key = hash_string(span)
            cache_hit = self._try_cache(key, doc)
            if not cache_hit:
                self._tokenize(doc, span, key)

Затем он проверяет, является ли текущий символ uc точным пробелом.Если это так, он сбрасывается, начиная с i + 1, где i - индекс текущего символа.

        if uc == ' ':
            doc.c[doc.length - 1].spacy = True
            start = i + 1

Если символ не является пробелом, он устанавливает начало как индекс текущего символа.,Затем он переворачивает in_ws, указывая, что это символ.

        else:
            start = i
        in_ws = not in_ws

А затем увеличивается i += 1 и возвращается к следующему символу.

    i += 1

TL; DR
Итак, все это говорит о том, что он отслеживает символ в строке, для которой он используется с помощью i, и сохраняет начало слова с помощью start.start сбрасывается на текущий символ в конце обработки слова, а затем после пробелов устанавливается последний пробел плюс один (начало следующего слова).

...