首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法将撇号从spaCy的NER组件中的实体中排除?

有没有办法将撇号从spaCy的NER组件中的实体中排除?
EN

Stack Overflow用户
提问于 2022-06-06 16:41:48
回答 1查看 98关注 0票数 1

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

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

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

代码语言:javascript
复制
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
代码语言:javascript
复制
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”作为返回的命名实体的一部分包括在内:

代码语言:javascript
复制
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
代码语言:javascript
复制
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”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-07 05:07:17

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

代码语言:javascript
复制
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

有关如何使用它的信息,请参见医生们

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72520863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档