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