我想在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]
代码无法正常工作,并且有两个问题
每个令牌都具有令牌。_。Streitwert = 12.000(但应仅是令牌12.000
如何定义标签为“ Streitwert”的新文档。
我真正想要的是当我这样做时将“ 12.000”标记为“ Streitwert”
[(ent.text, ent.label_) for ent in doc.ents]
答案 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
,应返回什么值?