Python的SpaCy EntityRuler不会返回任何结果

2024-03-29 06:27:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想制作一个能够识别组织名称的SpaCy模型。每个组织名称有1到4个单词,可以用标题或大写。 我已经添加了3500多个这样的组织名称:

patterns = []
for organisation in organisations_list:
    patterns.append({"label": "ORG", "pattern": organisation.strip()})

现在我有一个模式列表,如下所示:

for p in patterns:
   print(p)

结果:

{'label': 'ORG', 'pattern': 'BLS AG'}
{'label': 'ORG', 'pattern': 'Chemins de fer du Jura'}
{'label': 'ORG', 'pattern': 'Comlux'}
{'label': 'ORG', 'pattern': 'CRH Gétaz Group'}
{'label': 'ORG', 'pattern': 'DKSH Management AG'}
{'label': 'ORG', 'pattern': 'Ferdinand Steck Maschinenfabrik'}
{'label': 'ORG', 'pattern': 'Galenica'}
{'label': 'ORG', 'pattern': 'Givaudan'}
{'label': 'ORG', 'pattern': 'Heliswiss'}
{'label': 'ORG', 'pattern': 'Jet Aviation'}
{'label': 'ORG', 'pattern': 'Kolmar'}
...
...

因此,对象的模式如下所示:

patterns = [{'label': 'ORG', 'pattern': 'BLS AG'}
{'label': 'ORG', 'pattern': 'Chemins de fer du Jura'}
{'label': 'ORG', 'pattern': 'Comlux'}
{'label': 'ORG', 'pattern': 'CRH Gétaz Group'}
{'label': 'ORG', 'pattern': 'DKSH Management AG'}
{'label': 'ORG', 'pattern': 'Ferdinand Steck Maschinenfabrik'}
{'label': 'ORG', 'pattern': 'Galenica'}
{'label': 'ORG', 'pattern': 'Givaudan'}
{'label': 'ORG', 'pattern': 'Heliswiss'}
{'label': 'ORG', 'pattern': 'Jet Aviation'}
{'label': 'ORG', 'pattern': 'Kolmar'}....]

然后我创建了一个空白模型:

nlp = spacy.blank("en")
nlp.add_pipe('entity_ruler')
ruler.add_patterns(patterns)

然后,我对它进行了如下测试:

for full_text in list_of_texts:
    doc = nlp(full_text)
    print(doc.ents.text, doc.ents.label_)

而且它什么也认不出来(即使我用一句有确切组织名称的句子来测试它)。我还尝试用entity_rulertaggerparser添加到我的空白模型中,但总是一样的

以下是我用于测试的一些文本示例(测试文本中的每个公司名称也采用相同的大写和拼写模式):

t1 = "I work in company called DKSH Management AG its very good company"
t2 = "I have stayed in Holiday Inn Express and I really liked it"
t3 = "Have you head for company named AKKA Technologies SE"
t4 = "what do you think about ERYTECH Pharma"
t5 = "did you get an email from ESI Group"
t6 = "Esso S.A.F. sent me an email last week"

我做错了什么? 我注意到,如果我这样做,它会起作用:

ruler = EntityRuler(nlp)
ruler.add_patterns(patterns)
nlp = spacy.load("en_core_web_trf")
nlp.add_pipe('entity_ruler', before = 'tagger')
#if i do print(nlp.pipeline) i can see entity_ruler added before tager.

但是,我不知道这是因为我的entity_ruler还是因为预先训练好的模型。我已经在20个示例文本上测试了它,它给了我相同的结果,有实体_标尺和没有实体_标尺,所以我无法判断它是否工作得更好

我做错了什么


Tags: inorg模型名称addfornlp模式
1条回答
网友
1楼 · 发布于 2024-03-29 06:27:05

您没有正确添加EntityRuler。您从头开始创建EntityRuler并向其添加规则,然后告诉管道创建一个完全无关的EntityRuler

这是问题代码:

ruler = EntityRuler(nlp)     # ruler 1
ruler.add_patterns(patterns) # ruler 1
nlp = spacy.blank("en")
nlp.add_pipe('entity_ruler') # this creates an unrelated ruler 2

这就是你应该做的:

nlp = spacy.blank("en")
ruler = nlp.add_pipe("entity_ruler")
ruler.add_patterns(patterns)

这应该行得通


在spaCy v2中,创建管道组件的流程是创建对象,然后将其添加到管道中,但在v3中,流程是要求管道创建组件,然后使用返回的对象


根据您更新的示例,下面是使用EntityRuler匹配第一句的示例代码

nlp = spacy.blank("en")
ruler = nlp.add_pipe("entity_ruler")
patterns = [
  {"label": "ORG", "pattern": "DKSH Management AG"},
  {"label": "ORG", "pattern": "Some other company"},
]
ruler.add_patterns(patterns)

doc = nlp("I work in company called DKSH Management AG its very good company")
print([(ent.text, ent.label_) for ent in doc.ents])
# output: [('DKSH Management AG', 'ORG')]

这是否说明了应该如何构造代码

查看您更新的问题代码,您的代码与空白模型几乎是正确的,但请注意<强> AddiPi管返回EntyGrand对象。< /强>您应该将您的模式添加到该对象。

相关问题 更多 >