【问题标题】:How does SpaCy keeps track of character and token offset during tokenization?SpaCy 如何在标记化过程中跟踪字符和标记偏移量?
【发布时间】:2019-03-26 01:43:44
【问题描述】:

SpaCy 如何在标记化过程中跟踪字符和标记偏移量?

在 SpaCy 中,有一个 Span 对象,用于保存令牌/span https://spacy.io/api/span#init的开始和结束偏移量@

有一个_recalculate_indices 方法似乎正在检索token_by_starttoken_by_end,但看起来所有重新计算都在进行。

当查看无关空间时,它正在做一些smart alignment of the spans

它是否在每次执行正则表达式后重新计算,是否跟踪角色的移动?它是否进行后正则表达式执行跨度搜索?

【问题讨论】:

    标签: python algorithm nlp cython spacy


    【解决方案1】:

    总结:
    在标记化过程中,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

    它跟踪两个索引值:startistart 是它所在的潜在标记的开始,i 是它正在查看的结束字符。当脚本启动时,start 将是 0。如此循环之后,start 将成为最后一个空格的索引加 1,使其成为当前单词的第一个字母。

    它首先检查start 是否小于i,后者用于知道它是否应该尝试检查缓存并标记当前字符序列。这将更有意义。

            if start < i:
    

    span 是当前正在查看用于标记化的单词。就是start索引值通过i索引值切片的字符串。

                span = string[start:i]
    

    然后它会获取单词的哈希值(starti)并检查缓存字典以查看该单词是否已被处理。如果没有,它将在字符串的该部分调用_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 在单词处理结束时重置为当前字符,然后在空格之后设置为最后一个空格加一(下一个单词的开头)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多