spacy tokenizer:有没有办法在 update_exc 的自定义异常中使用正则表达式作为键

spacy tokenizer: is there a way to use regex as a key in custom exceptions for update_exc

可以向 spacy 分词器添加自定义异常。这些异常工作正常。 但是,据我所知,可以只使用字符串作为键来匹配这些异常。这样做的:

import spacy
from spacy.tokens import Doc, Span, Token
from spacy.util import update_exc
from spacy.lang.tokenizer_exceptions import BASE_EXCEPTIONS
from spacy.symbols import ORTH, NORM, LEMMA, POS, TAG

CUSTOM_EXCEPTIONS = {
    # prevent '3g' to be splitted into ['3', 'g']
    "3g": [{ORTH: "3g", LEMMA: "3g"}],
}
spacy.lang.tokenizer_exceptions.BASE_EXCEPTIONS = update_exc(BASE_EXCEPTIONS, CUSTOM_EXCEPTIONS)

有没有办法添加正则表达式键入的异常,例如匹配 phone 号码?

类似这样的内容(以粗体突出显示):

CUSTOM_EXCEPTIONS = {
    # prevent '3g' to be splitted into ['3', 'g']
    "3g": [{ORTH: "3g", LEMMA: "3g"}],

    r'([\(]?\+[\(]?\d{2}[\)]?[ ]?\d{2} \d{2} \d{2} \d{2})': [{LEMMA: match_result} for match_result in match_results]

}

我找到的唯一线索是: https://github.com/explosion/spaCy/issues/840

在 tokenizer_exceptions.py 的修订版中,有一些方法可以使用正则表达式作为标记器异常的键(但是,我还没有找到任何这样做的例子)

但在目前的修订中,至少初步分析没有显示任何方法

那么有没有办法解决这个任务呢?

(输入:正则表达式作为异常的键,输出 - phone 内部有空格的数字)

不,没有办法将正则表达式作为分词器例外。分词器只查找与字符串完全匹配的异常,主要是出于速度原因。这种示例的另一个困难是分词器异常目前不能包含空格。 (计划在未来版本的 spacy 中支持空格,但不支持正则表达式,这仍然太慢。)

我认为最好的方法是在管道的开头添加一个自定义管道组件,该组件使用 retokenizer 重新标记文档:https://spacy.io/api/doc#retokenize。您可以在重新标记时提供任何必需的属性,例如引理。