总结:
在标记化过程中,this 是跟踪偏移量和字符的部分。
简单的答案:它在字符串中逐个字符。
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
如果字符不是空格,则设置 start 为当前字符的索引。然后它反转in_ws,表示它是一个字符。
else:
start = i
in_ws = not in_ws
然后它增加i += 1 并循环到下一个字符。
i += 1
TL;DR
综上所述,它使用i 跟踪字符串中的字符,并使用start 保持单词的开头。 start 在单词处理结束时重置为当前字符,然后在空格之后设置为最后一个空格加一(下一个单词的开头)。