Spacy标记器规则是否包含空格?

时间:2019-07-25 16:41:33

标签: spacy

当我使用默认的令牌生成器创建流水线以说英语时,然后可以调用添加特殊情况的方法:

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,而如果该模式不匹配,则正常的英语规则仍应适用。

这是可以通过增加现有令牌生成器以某种方式完成的工作,还是我必须首先令牌生成,然后找到与相应令牌模式匹配的实体,然后合并实体令牌?

2 个答案:

答案 0 :(得分:0)

如您所见,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. 在外部进行标记并使用Doc实例化words。这里的相关文档: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中有用于后一种方法的代码示例。

答案 1 :(得分:0)

使用令牌匹配将多个令牌组合为单个令牌