spaCy:自定义中缀正则表达式规则在`:`上分割,用于mailto:johndoe@gmail.com之类的模式未始终应用

时间:2019-08-15 03:42:43

标签: tokenize spacy

使用默认的令牌生成器,spaCy将mailto:johndoe@gmail.com视为一个令牌。

我尝试了以下操作:

nlp = spacy.load('en_core_web_lg') infixes = nlp.Defaults.infixes + (r'(?<=mailto):(?=\w+)', ) nlp.tokenizer.infix_finditer = spacy.util.compile_infix_regex(infixes).finditer

但是,上述自定义规则似乎并没有在一致的事情上做我想做的事情。例如,如果我将令牌生成器应用于mailto:johndoe@gmail.c,它将执行我想要的操作:

nlp("mailto:johndoe@gmail.c")
# [mailto, :, johndoe@gmail.c]

但是,如果我将标记符应用于mailto:johndoe@gmail.com,则它不能按预期工作。

nlp("mailto:johndoe@gmail.com")
# [mailto:johndoe@gmail.com]

我想知道是否有办法解决这种矛盾?

1 个答案:

答案 0 :(得分:2)

URL有一个令牌生成器异常模式,该模式将mailto:johndoe@gmail.com之类的内容作为一个令牌进行匹配。它知道顶级域至少有两个字母,因此它与gmail.cogmail.com匹配,但与gmail.c不匹配。

您可以通过设置以下内容来覆盖它:

nlp.tokenizer.token_match = None

那么您应该得到:

[t.text for t in nlp("mailto:johndoe@gmail.com")]
# ['mailto', ':', 'johndoe@gmail.com']

[t.text for t in nlp("mailto:johndoe@gmail.c")]
# ['mailto', ':', 'johndoe@gmail.c']

如果您希望URL标记化除mailto:以外的其他默认设置,则可以从URL_PATTERN修改lang/tokenizer_exceptions.py(另请参见下面如何定义TOKEN_MATCH) ),而不要使用None