【问题标题】:Spacy tokenizer rule for exceptions that contain whitespace?针对包含空格的异常的 Spacy 标记器规则?
【发布时间】:2019-07-25 16:41:33
【问题描述】:

当我使用英语的默认标记器创建管道时,我可以调用添加特殊情况的方法:

tokenizer.add_special_case("don't", case)

分词器很乐意接受包含空格的特殊情况:

tokenizer.add_special_case("some odd case", case)

但它似乎并没有真正改变分词器的行为或者永远不会匹配?

更一般地说,扩展现有标记器的最佳方法是什么,以便通常会导致多个标记的某些模式只创建一个标记?例如,[A-Za-z]+\([A-Za-z0-9]+\)[A-Za-z]+ 之类的东西不应该因为括号而导致三个标记,而是一个标记,例如对于 asdf(a33b)xyz,如果该模式不匹配,则仍应适用正常的英语规则。

这是否可以通过扩充现有的分词器以某种方式完成,还是我必须先进行分词,然后找到与相应令牌模式匹配的实体,然后合并实体令牌?

【问题讨论】:

    标签: spacy


    【解决方案1】:

    如您所见,Tokenizer.add_special_case() 不适用于处理包含空格的标记。那是为了添加像“o'clock”和“:-)”这样的字符串,或者扩展例如“不要”到“不要”。

    修改前缀、后缀和中缀规则(通过在现有分词器上设置它们或使用自定义参数创建新分词器)也不起作用,因为这些是在空格拆分后应用的。

    要覆盖空格拆分行为,您有四个选项:

    1. 标记化后合并。您使用Retokenizer.merge(),或者可能使用merge_entitiesmerge_noun_chunks。相关文档在这里: https://spacy.io/usage/linguistic-features#retokenizationhttps://spacy.io/api/pipeline-functions#merge_entitieshttps://spacy.io/api/pipeline-functions#merge_noun_chunks

      这是您尽可能多地保留默认行为的最佳选择。

    2. 子类Tokenizer 并覆盖__call__。示例代码:

      from spacy.tokenizer import Tokenizer
      
      def custom_tokenizer(nlp):
      
          class MyTokenizer(Tokenizer):
              def __call__(self, string):
                  # do something before
                  doc = super().__call__(string)
                  # do something after
      
                  return doc
      
          return MyTokenizer(
              nlp.vocab,
              prefix_search=nlp.tokenizer.prefix_search,
              suffix_search=nlp.tokenizer.suffix_search,
              infix_finditer=nlp.tokenizer.infix_finditer,
              token_match=nlp.tokenizer.token_match,
          )
      
      # usage:
      nlp.tokenizer = custom_tokenizer(nlp)
      
    3. 实现一个全新的分词器(没有子类化 Tokenizer)。相关文档:https://spacy.io/usage/linguistic-features#custom-tokenizer-example

    4. 在外部进行标记并用words 实例化Doc。相关文档在这里:https://spacy.io/usage/linguistic-features#own-annotations

    要回答您问题的第二部分,如果您不需要更改空格拆分行为,您还有另外两个选择:

    1. 添加到默认前缀、后缀和中缀规则。相关文档在这里:https://spacy.io/usage/linguistic-features#native-tokenizer-additions

      https://stackoverflow.com/a/58112065/594211 的注释:“您可以在不定义自定义分词器的情况下添加新模式,但如果不定义自定义分词器,则无法删除模式。”

    2. 使用自定义前缀、后缀和中缀规则实例化 Tokenizer。相关文档在这里:https://spacy.io/usage/linguistic-features#native-tokenizers

      要获取默认规则,您可以读取现有标记器的属性(如上所示)或使用nlp 对象的Defaults。在https://stackoverflow.com/a/47502839/594211https://stackoverflow.com/a/58112065/594211 中有后一种方法的代码示例。

    【讨论】:

      【解决方案2】:

      使用令牌匹配将多个令牌组合成一个

      【讨论】:

        猜你喜欢
        • 2019-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多