我可以将自定义令牌规则应用于由 spaCy 中的前缀拆分的令牌吗?

Posted

技术标签:

【中文标题】我可以将自定义令牌规则应用于由 spaCy 中的前缀拆分的令牌吗?【英文标题】:Can I apply custom token rules to tokens split by prefixes in spaCy? 【发布时间】:2020-05-13 15:37:43 【问题描述】:

我自定义了一个 spaCy Tokenizer 附加规则和前缀,以将 w/f/ 分别视为 withfor。前缀正确地将它们分开,但在这种情况下没有应用引理和规范的自定义规则。

这是代码的摘录。

def create_tokenizer(nlp):
    rules = dict(nlp.Defaults.tokenizer_exceptions)
    rules.update(
        'w/': [ORTH: 'w/', LEMMA: 'with', NORM: 'with'],
        'W/': [ORTH: 'W/', LEMMA: 'with', NORM: 'with'],
        'f/': [ORTH: 'f/', LEMMA: 'for', NORM: 'for'],
        'F/': [ORTH: 'F/', LEMMA: 'for', NORM: 'for'],
    )

    custom_prefixes = (
        r"[wW]/",
        r"[fF]/",
    )

    prefix_re = spacy.util.compile_prefix_regex(nlp.Defaults.prefixes + custom_prefixes)

    return Tokenizer(
        nlp.vocab,
        rules=rules,
        prefix_search=prefix_re.search,
    )

这是结果。

>>> doc = nlp("This w/ that")
>>> doc[1]
w/
>>> doc[1].norm_
'with'
>>> doc = nlp("This w/that")
>>> doc[1]
w/
>>> doc[1].norm_
'w/'

This w/that 的情况下,w/ 被拆分,但它没有应用自定义规则(即,NORMw/ 而不是 with)。我需要做什么才能将自定义规则应用于按前缀/中缀/后缀拆分的标记?

【问题讨论】:

【参考方案1】:

不幸的是,在 spacy v2 中,无法将前缀和后缀也分析为异常。 Tokenizer 异常将在即将发布的 spacy v3 版本中得到更普遍的处理,以支持此类情况,但我不知道此时可能何时发布。

我认为在 spacy v2 中你能做的最好的事情就是拥有一个快速的后处理组件,如果它们与正交模式匹配,则将词条/规范分配给各个标记。

【讨论】:

啊,太糟糕了。相反,我将为这些异常创建一个自定义管道组件。谢谢!

以上是关于我可以将自定义令牌规则应用于由 spaCy 中的前缀拆分的令牌吗?的主要内容,如果未能解决你的问题,请参考以下文章

FxCop 中的自定义规则仅适用于由特定类型的方法调用的方法

Spacy - 自定义停用词不起作用

如何将自定义数据添加到 Laravel Passport API 令牌?

将自定义验证规则作为字符串传递并获取所有验证消息

将自定义 Fxcop 规则与现有 Fxcop 规则集成

身份服务器 - 将自定义参数添加到来自令牌端点的 JSON 响应