当我使用默认的令牌生成器创建流水线以说英语时,然后可以调用添加特殊情况的方法:
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,而如果该模式不匹配,则正常的英语规则仍应适用。
这是可以通过增加现有令牌生成器以某种方式完成的工作,还是我必须首先令牌生成,然后找到与相应令牌模式匹配的实体,然后合并实体令牌?
答案 0 :(得分:0)
如您所见,Tokenizer.add_special_case()
对处理包含空格的令牌不起作用。那是为了添加字符串,例如“ o'clock”和“ :-)”,或扩展例如“不要”到“不要”。
修改前缀,后缀和中缀规则(通过在现有标记器上设置它们或使用自定义参数创建新的标记器)也不起作用,因为它们是在空格分割后应用的。
要覆盖空白分割行为,您有四个选项:
令牌化后合并。您使用Retokenizer.merge()
,或者使用merge_entities
或merge_noun_chunks
。相关文档在这里:
https://spacy.io/usage/linguistic-features#retokenization和https://spacy.io/api/pipeline-functions#merge_entities和https://spacy.io/api/pipeline-functions#merge_noun_chunks
这是保持尽可能多的默认行为的最佳选择。
子类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)
实现一个全新的令牌生成器(不包含子类Tokenizer
)。这里的相关文档:https://spacy.io/usage/linguistic-features#custom-tokenizer-example
在外部进行标记并使用Doc
实例化words
。这里的相关文档:https://spacy.io/usage/linguistic-features#own-annotations
要回答问题的第二部分,如果您不需要需要更改空格分割行为,则还有其他两个选择:
添加到默认前缀,后缀和中缀规则。相关文档在这里:https://spacy.io/usage/linguistic-features#native-tokenizer-additions
来自https://stackoverflow.com/a/58112065/594211的注释:“您可以在不定义自定义标记器的情况下添加新模式,但是在没有定义自定义标记器的情况下无法删除模式。”
使用自定义前缀,后缀和中缀规则实例化Tokenizer
。相关文档在这里:https://spacy.io/usage/linguistic-features#native-tokenizers
要获取默认规则,请阅读现有令牌生成器的属性(如上所示)或使用nlp
对象的Defaults
。在https://stackoverflow.com/a/47502839/594211和https://stackoverflow.com/a/58112065/594211中有用于后一种方法的代码示例。
答案 1 :(得分:0)
使用令牌匹配将多个令牌组合为单个令牌