首页 > 解决方案 > 在 Spacy 中,如何匹配一个特定的实体类型,就在一个特定的单词之后,不管它们之间有什么关系?

问题描述

我想用以下模式匹配 Spacy 中的文本:

例如在:

text=" Some texte about a company, company number: 254455, Dénomination\n (entire name): NAME_OF_THE_COMPANY , \n, some other informations of the... "

我想提取 Spacy 识别为实体 MISC 的“NAME_OF_COMPANY”

为了获得 Spacy 的实体,我这样做:

for txt in text_file:
    doc = nlp(txt)
    for token_french in doc_french:
    for ent in doc.ents:
         print(ent.label_, ent.text)

但是后来我尝试了许多模式,如下所示,但没有任何成功:

    matcher=Matcher(nlp.vocab)
    pattern = [{"REGEX" : "[D|d][é|e]nomination\s{0,}"},{"REGEX" : "[A-Za-z\n\r\s:)]{1,}"},{"ENT_TYPE" : "MISC"}]
    matcher.add('company_name', None, pattern)
    matches = matcher(doc)

标签: pythonregexspacy

解决方案


要记住几件事:

  • 模式中的每个 dict 对应一个不带空格的标记。

  • 您可以将任意数量的中间标记与{"OP": "*"}.

  • validate=True在处理新模式时,使用withMatcher()获得更多反馈很有用。

我认为您的模式可能看起来更像:

pattern = [{"LOWER": {"REGEX" : "d[é|e]nomination"}}, {"OP": "*"}, {"ENT_TYPE": "MISC"}]

Matcher 会查看整个文档,因此如果您的文档很长,它不仅会提供下一个 MISC,还会提供一个匹配“面额”的匹配项,然后是每个后续 MISC。您必须分别从结果中选择最短的匹配项。


推荐阅读