如何在Spacy nlp中定义新实体

时间:2019-05-28 19:51:37

标签: python spacy

我想在Spacy中定义一个新实体。

我的代码需要实现以下目标:

  • 在文本中搜索特定关键字(此处为“ Streitwert”)

  • 如果关键字在文本中找到单词出现的句子

  • 在该句子中查找数字

  • 此数字应为带有标签“关键字”的实体

这是我的代码,但是不起作用:

def get_keyword_value(token):
    if "Streitwert" in token.doc.text: 
        for sent in token.doc.sents:
            if "Streitwert" in sent.text:
                for token in sent:
                    if token.pos_ == "NUM":
                        return token.text


import spacy
from spacy.tokens import Token
nlp = spacy.load("de_core_news_sm")
Token.set_extension("Streitwert", getter=get_keyword_value, force=True)

text = "Die ist ein langer Text. Der Streitwert wird auf EUR 12.000 EUR festgesetzt"
doc = nlp(text)

[(token.text, token._.Streitwert) for token in doc]

代码无法正常工作,并且有两个问题

  1. 每个令牌都具有令牌。_。Streitwert = 12.000(但应仅是令牌12.000

  2. 如何定义标签为“ Streitwert”的新文档。

我真正想要的是当我这样做时将“ 12.000”标记为“ Streitwert”

[(ent.text, ent.label_) for ent in doc.ents]

1 个答案:

答案 0 :(得分:0)

关于定义新的自定义实体,您可以轻松地将其添加到实体列表:ents。要了解如何做到这一点,我建议看一下这个相对简短的SpaCy示例,该示例所做的事情与您想做的非常相似: https://spacy.io/usage/rule-based-matching#on_match

在此示例中,他们匹配一个单词,并根据匹配项添加一个自定义实体。他们在这里使用ORTH属性,但是您可以使用{“ POS”:“ NUM”}来满足您的需求。另外,您可能会发现使用Rule-based Matcher Explorer在友好的用户界面中处理问题很有帮助。在此示例中,无需设置自定义属性。

但是,如果您选择走定制属性路线,那么您正确地需要使用Token.set_extension(...)来启用令牌级别的定制属性。我想您想将默认值设置为False,然后如果令牌为“ Streitwert”,则用False覆盖True。您可以通过添加默认参数来做到这一点。

Token.set_extension("Streitwert", default=None, force=True)

此外,我注意到您的get_key_word(...)方法在大多数情况下不会返回任何内容。即,如果任何条件为False,应返回什么值?