Нахождение отношений между местоимениями и существительными в предложениях

Я работаю над проектом НЛП, и мне нужна следующая функциональность, проиллюстрированная примером. Скажи, что есть предложение

Скажите Сэму, что ему придется уйти без Артура, так как он болен.

В этом заявлении первый he должен быть помечен как Сэм, а второй he как Артур. Я работаю в Питоне. Любые предложения о том, что я могу использовать, чтобы получить следующие функции?


person Ameet Deshpande    schedule 23.06.2017    source источник
comment
Просим вас добавить код, который вы пробовали.   -  person Dinesh Pundkar    schedule 23.06.2017
comment
Я еще не написал никакого кода, так как не совсем понимаю, что мне нужно использовать. Я посмотрел на nltk-chunkers, чтобы попытаться сгруппировать местоимения ближе к существительным, используя регулярное выражение ‹NN›‹*›‹PR›, которое будет соответствовать существительному, за которым следует местоимение. Но это не будет работать во всех случаях.   -  person Ameet Deshpande    schedule 23.06.2017
comment
Пример, приведенный здесь, не очень хорош, так как его можно прочитать по-разному: - Скажите Сэму, что Сэму придется уйти без Артура, так как Сэм болен - Скажите Сэму, что Сэму придется уйти без Артура, поскольку Сэм болен На самом деле , любое предложение в такой структуре имеет тот же эффект.   -  person LTPCGO    schedule 17.09.2019


Ответы (3)


Эта задача называется разрешением кореферентности. Чтобы анализировать сложные случаи, подобные упомянутому вами, вам необходимо использовать систему разрешения корреференций, большинство из которых (бесплатно/OOS) разработаны на Java. Есть несколько способов легко использовать их из Python. Одной из самых известных является эта оболочка Standford CoreNLP: https://github.com/dasmith/stanford-corenlp-python

person Josep Valls    schedule 23.06.2017

Обновлять:

Теперь есть нативные инструменты Python с разрешением кореференции, такие как:

  • AllenNLP от AllenAI.

  • Huggingface, который является почти пространственным расширением.

  • StanfordNLP от Стэнфорда.

Эти ссылки были в основном получены из этого прекрасного руководства по RASA (решение для чат-бота на основе NLU): https://github.com/RasaHQ/tutorial-knowledge-base

person Tiago Duque    schedule 11.09.2019

Как и другие предполагали, это разрешение кореферентности, которое является активной темой исследования НЛП.

Попробуйте следующий код от Huggingface(spacy):

import spacy
nlp = spacy.load('en')
import neuralcoref

neuralcoref.add_to_pipe(nlp,greedyness=0.52)
doc = nlp("Tell Sam that he will have to leave without Arthur, as he is sick.")
print(doc._.coref_resolved)

Вы можете настроить жадность алгоритма, чтобы получить больше разрешений (замен местоимений). Имейте в виду, что увеличение жадности может привести к неправильным разрешениям, это будет зависеть от вашего варианта использования.

person hawk    schedule 13.09.2019