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

spaCy: custom infix regex rule to split on `:` for patterns like mailto:johndoe@gmail.com is not applied consistently

使用默认分词器,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]

我想知道是否有办法解决这种不一致?

URLs 有一个分词器异常模式,它将 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.