是否有办法从space的NER组件中的实体中排除撇号"s"?



我正在使用spaCy 3.2在自定义实体链接组件的上下文中执行命名实体识别(NER)(我在最新的3.3版本中也遇到了相同的问题)。

当对包含撇号"s"的文本(例如Apple's)执行命名实体识别时,我希望从组件返回的命名实体中排除撇号"s"。

在命名实体除了撇号"s"之外还包含单个令牌的情况下,NER组件正确地只返回命名实体令牌(例如Apple而不是Apple's):

import spacy
nlp = spacy.load("en_core_web_sm")
s = u"Apple's looking at buying U.K. startup for $1 billion"
doc = nlp(s)
for ent in doc.ents:
print(f"{ent.text} (lemma={ent.lemma_}): {ent.label_}n")
Apple (lemma=Apple): ORG
U.K. (lemma=U.K.): GPE
$1 billion (lemma=$1 billion): MONEY
for token in doc:
print(f"{token.text} (IOB={token.ent_iob_}): {token.ent_type_}")
Apple (IOB=B): ORG
's (IOB=O): 
...

但是,当我对命名实体跨越多个令牌的文本执行命名实体识别时(例如,Apple Inc.而不是Apple),单引号"s"被包括作为返回的命名实体的一部分:

s = u"Apple Inc.'s looking at buying U.K. startup for $1 billion"
doc = nlp(s)
for ent in doc.ents:
print(f"{ent.text} (lemma={ent.lemma_}): {ent.label_}n")
Apple Inc.'s (lemma=Apple Inc.'s): ORG
U.K. (lemma=U.K.): GPE
$1 billion (lemma=$1 billion): MONEY
for token in doc:
print(f"{token.text} (IOB={token.ent_iob_}): {token.ent_type_}")
Apple (IOB=B): ORG
Inc. (IOB=I): ORG
's (IOB=I): ORG
...

在这些文本之间的标记化没有区别(即's部分在两种情况下都被分割为自己的标记)。我不希望像Apple Inc.'s这样的实体在命名实体中包含撇号"s",并且希望NER组件只返回这个命名实体的Apple Inc.部分。

是否有一种方法来配置NER组件,以防止使用多令牌命名实体的这种行为,并排除撇号"s"?

没有办法简单地配置组件不这样做。你能做的是使用一个小的自定义组件从任何实体中删除's

def my_component(doc):
out = []
for ent in doc.ents:
if ent[-1].text == "'s":
out.append(ent[0:-1])
else:
out.append(ent)
doc.ents = out
return doc

关于如何使用它,请参阅文档。

最新更新