在Spacy中,如何在特定字词之后匹配特定的实体类型,无论两者之间是什么?

时间:2019-09-13 07:28:07

标签: python regex spacy

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

  • 如果有单词“dénomination”或“衡量单位”,我想匹配下一个“ MISC”实体(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... "

我想提取“ NAME_OF_COMPANY”,Spacy将其识别为实体MISC

要获取具有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)

1 个答案:

答案 0 :(得分:0)

请记住以下几点:

  • 模式中的每个字典对应一个令牌,没有空格。

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

  • 在开发新模式时,将validate=TrueMatcher()结合使用会获得更多反馈。

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

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

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