Nlp 如何提取某个单词后面有空格的人称实体?

Nlp 如何提取某个单词后面有空格的人称实体?,nlp,extract,spacy,matcher,ner,Nlp,Extract,Spacy,Matcher,Ner,我有这个文本(代码中的text2),它有3个“by”字,我想用Spacy来提取这个人的名字(全名,即使是3个字,有些种族使用长名字,在本例中是2)。代码如下,我的模式显示错误。我的意图是:首先用ORTH修复“by”这个词,然后告诉程序接下来发生的事情就是被称为PERSON的词性实体。如果有人帮助我,我会很高兴: import spacy from spacy.matcher import Matcher matcher = Matcher(nlp.vocab) text2 = 'All is d

我有这个文本(代码中的text2),它有3个“by”字,我想用Spacy来提取这个人的名字(全名,即使是3个字,有些种族使用长名字,在本例中是2)。代码如下,我的模式显示错误。我的意图是:首先用ORTH修复“by”这个词,然后告诉程序接下来发生的事情就是被称为PERSON的词性实体。如果有人帮助我,我会很高兴:

import spacy
from spacy.matcher import Matcher
matcher = Matcher(nlp.vocab)
text2 = 'All is done by Emily Muller, the leaf is burned by fire. we were not happy, so we cut     relations by saying bye bye'
def extract_person(nlp_doc):
     pattern = [{'ORTH': 'by'}, {'POS': 'NOUN'}}]
     # second possible pattern:
     #pattern = [{"TEXT": "by"}, {"NER": "PERSON"}]
     matcher.add('person_only', None, pattern)
     matches = matcher(nlp_doc)
     for match_id, start, end in matches:
         span = nlp_doc[start:end]
         return span.text
target_doc = nlp(text2)
extract_person(target_doc)

我认为这个问题可以用另一种方式来回答:如何在spacy的Matcher中的pattern中使用NER标记?

如果要使用全名,应该在开始时合并实体。您可以通过调用:
nlp.add\u管道(“merge\u entities”,after=“ner”)

然后按照您的模式,而不是:

pattern = [{"TEXT": "by"}, {"NER": "PERSON"}]
使用:

完整代码:

nlp.add_pipe("merge_entities", after="ner")

text2 = 'All is done by Emily Muller, the leaf is burned by fire. we were not happy, so we cut relations by saying bye bye'

doc = nlp(text2)

pattern = [{"TEXT": "by"}, {"ENT_TYPE": "PERSON"}]

matcher = Matcher(nlp.vocab)

matcher.add('person_only', [pattern])
matches = matcher(doc)
for match_id, start, end in matches:
    print(doc[start:end])


我这样做了:data='TEXT PREVIOUS'doc=nlp(data)for ent in doc.ents:print(ent.TEXT,ent.start\u char,ent.end\u char,ent.label\u char)nlp.add\u pipe(nlp.create\u pipe('merge\u entities'))\nlp.add\u pipe(“merge\u entities”,after=“ner”)\35; after='ner”显示错误模式=[{“TEXT”:“by”;“by”},{“ent\u TYPE”:“PERSON”}]matcher.addmatches=matcher(doc)print(“matches:,[doc[start:end].matche的文本,开始,结束在matches中])#结果:#Emily Muller 15 27人#matches:['by Emily']你能提供一些你正在处理的数据吗?您也可以尝试将名词短语与以下内容合并:
nlp.add\u pipe(“merge\u noon\u chunks”,last=True)
谢谢,我会尝试。这是数据。目标是在“by”之后提取人名(有时有3-4个人名,大多数情况下是2):text2='所有这些都是由Emily Muller完成的,树叶被火焚烧。我们不高兴,所以我们通过说再见来切断关系。在这里,合并名词块可能没有帮助,但合并实体应该注意这一点。我在这里给出的答案适用于您的示例文本
nlp.add_pipe("merge_entities", after="ner")

text2 = 'All is done by Emily Muller, the leaf is burned by fire. we were not happy, so we cut relations by saying bye bye'

doc = nlp(text2)

pattern = [{"TEXT": "by"}, {"ENT_TYPE": "PERSON"}]

matcher = Matcher(nlp.vocab)

matcher.add('person_only', [pattern])
matches = matcher(doc)
for match_id, start, end in matches:
    print(doc[start:end])