как извлечь объект с именем PERSON после определенного слова с пространством?

У меня есть этот текст (текст 2 в коде), в нем 3 слова, я хочу использовать Spacy для извлечения имени человека (полное имя, даже если это 3 слова, некоторые расы используют длинные имена, в данном случае 2) . Код ниже, мой шаблон показывает ошибку. Мое намерение: сначала исправить слово «по» с помощью ORTH, а затем сообщить программе, что все, что будет дальше, является сущностью Part of Speech, называемой 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)

Я думаю, что этот вопрос можно задать иначе: как использовать теги NER в шаблоне в Matcher in spacy?


person tursunWali    schedule 29.03.2021    source источник


Ответы (1)


Если вы хотите использовать полные имена, вам следует сначала объединить объекты. Вы можете сделать это, позвонив: nlp.add_pipe("merge_entities", after="ner")

Тогда в вашем шаблоне вместо:

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

Использовать:

pattern = [{"TEXT": "by"}, {"ENT_TYPE": "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])

person krisograbek    schedule 29.03.2021
comment
Я сделал это: data = 'TEXT PREVIOUS' doc = nlp (data) для ent в doc.ents: print (ent.text, ent.start_char, ent.end_char, ent.label_) nlp.add_pipe (nlp.create_pipe (' merge_entities ')) # nlp.add_pipe (merge_entities, after = ner) # after =' ner 'показывает шаблон ошибки = [{TEXT: by}, {ENT_TYPE: PERSON}] matcher.add (by, None, pattern) matches = matcher (doc) print (Соответствует :, [doc [start: end] .text для match_id, start, end в совпадениях]) # Результат: #Emily Muller 15 27 PERSON #Matches: ['by Emily'] - person tursunWali; 29.03.2021
comment
Не могли бы вы предоставить данные, с которыми вы работаете? Вы также можете попробовать объединить словосочетания с существительными: nlp.add_pipe("merge_noun_chunks", last=True) - person krisograbek; 29.03.2021
comment
Спасибо, попробую. Это данные. цель состоит в том, чтобы извлечь имя ПЕРСОНА после 'by' (иногда есть 3-4 имени, чаще всего 2): text2 = 'Все сделано Эмили Мюллер, лист сожжен огнем. мы не были счастливы, поэтому мы разорвали отношения, попрощавшись » - person tursunWali; 29.03.2021
comment
Слияние частей существительных здесь, вероятно, не поможет, но слияние сущностей должно позаботиться об этом. - person polm23; 30.03.2021
comment
Ответ, который я дал здесь, работает для меня с вашим примером текста - person krisograbek; 30.03.2021
comment
не могли бы вы поместить сюда весь код! Потому что, когда я пытался, эта часть вызывает ошибку: nlp.add_pipe (merge_entities, after = ner) - person tursunWali; 31.03.2021
comment
Krigograbek, Как я уже сказал, при запуске выдает ошибку. Пожалуйста, поделитесь своим кодом, пожалуйста! - person tursunWali; 07.04.2021
comment
Обновил мой ответ - person krisograbek; 10.04.2021