使用默认的令牌生成器,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]
我想知道是否有办法解决这种矛盾?
答案 0 :(得分:2)
URL有一个令牌生成器异常模式,该模式将mailto:johndoe@gmail.com
之类的内容作为一个令牌进行匹配。它知道顶级域至少有两个字母,因此它与gmail.co
和gmail.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
。