【问题标题】:Adding REGEX entities to SpaCy's Matcher将 REGEX 实体添加到 SpaCy 的 Matcher
【发布时间】:2019-10-25 06:27:40
【问题描述】:

我正在尝试将由正则表达式定义的实体添加到 SpaCy 的 NER 管道。理想情况下,我应该能够使用从具有已定义实体类型的 json 文件加载的任何正则表达式。例如,我正在尝试执行下面的代码。

下面的代码显示了我正在尝试做的事情,遵循 Spacy 关于使用正则表达式的自定义属性的讨论中给出的示例。我曾尝试以各种方式(对 Doc、Span、Token)调用“set_extension”方法,但无济于事。我什至不确定我应该将它们设置为什么。

    nlp = spacy.load("en_core_web_lg")
    matcher = Matcher(nlp.vocab)
    pattern = [{"_": {"country": {"REGEX": "^[Uu](\.?|nited) ?[Ss](\.|tates)$"}}}]
    matcher.add("US", None, pattern)
    doc = nlp(u"I'm from the United States.")
    matches = matcher(doc)
    for match_id, start, end in matches:
        string_id = nlp.vocab.strings[match_id]
       span = doc[start:end]
       print(match_id, string_id, start, end, span.text)

我希望match_id, string_id 3 4 United States 被打印出来。

相反,我收到的是AttributeError: [E046] Can't retrieve unregistered extension attribute 'country'. Did you forget to call the 'set_extension' method?

【问题讨论】:

    标签: regex spacy


    【解决方案1】:

    这里有关于扩展属性的文档:https://spacy.io/usage/processing-pipelines#custom-components-attributes

    基本上,您必须将这个 country 变量定义为扩展属性,如下所示:

    Token.set_extension("country", default="")
    

    但是,在您引用的代码中,您实际上从未将 _.country 属性设置为任何标记(或跨度),因此它们仍处于默认值,并且匹配器将永远无法获得匹配在他们。你引用的那一行:

    pattern = [{"_": {"country": {"REGEX": "^[Uu](\.?|nited) ?[Ss](\.?|tates)$"}}}]
    

    尝试在自定义属性值上匹配美国正则表达式,而不是在文档文本上,如您所料(我认为)。

    一种解决方案是直接在文本上运行正则表达式:

    nlp = spacy.load("en_core_web_lg")
    matcher = Matcher(nlp.vocab)
    pattern = [{"TEXT": {"REGEX": "^[Uu](\.?|nited)$"}},
               {"TEXT": {"REGEX": "^[Ss](\.?|tates)$"}}]
    matcher.add("US", None, pattern)
    doc = nlp(u"I'm from the United States.")
    matches = matcher(doc)
    for match_id, start, end in matches:
        string_id = nlp.vocab.strings[match_id]
        span = doc[start:end]
        print(match_id, string_id, start, end, span.text)
    

    哪些输出

    15397641858402276818 美国 4 6 美国

    然后您可以使用这些匹配项,例如在 Span 或 Token 上设置自定义属性(在本例中为 Span,因为您的匹配可能涉及多个令牌)

    【讨论】:

    • 在声明pattern 变量之前放置我引用的代码行后,您能否粘贴完整代码和新错误?我假设这将是一个不同的错误,然后我们可以从那里开始工作。
    • 我已经试过了。我在pattern 变量之前和之后都设置了Token/Doc/Span.set_extension。在这两种情况下,我都会收到TypeError: expected string or byte-like object。此外,链接spacy.io/processing-pipelines#custom-components-attributes 的页面不会退出。
    • 嗨,苏菲 VL。我不知道如何从我最初的问题中复制代码。但正如我上面所说,无论我将 Token.set_extension("country", default=True) 放在 pattern 变量之前还是之后,我都会得到同样的错误。
    • 我在原始答案中引用的页面在 URL 中有 /usage/ 部分并且确实存在 - 您引用的 URL 不同且不存在
    • 非常感谢,Sofie VL。这确实有效,我根本不知道如何解决我遇到的错误。现在我可以尝试其他正则表达式来更好地了解正在发生的事情。但是,我希望有一个不需要我更改输入正则表达式的解决方案,因为我希望能够处理给定的任何正则表达式,而不必先对其进行解析以适应 SpaCy 的处理方式。但是,至少我有一些工作要做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 2022-08-15
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多