Разрешение Coreference в Python NLTK с использованием Stanford CoreNLP

Как уже упоминалось, Stanford CoreNLP обеспечивает разрешение ссылок, а также этот поток, который дает некоторые сведения о его реализации в Java.

Однако я использую Python и NLTK, и я не уверен, как я могу использовать функциональность разрешения Coreference CoreNLP в моем коде Python. Я смог настроить StanfordParser в NLTK, это мой код до сих пор.

from nltk.parse.stanford import StanfordDependencyParser
stanford_parser_dir = 'stanford-parser/'
eng_model_path = stanford_parser_dir  + "stanford-parser-models/edu/stanford/nlp/models/lexparser/englishRNN.ser.gz"
my_path_to_models_jar = stanford_parser_dir  + "stanford-parser-3.5.2-models.jar"
my_path_to_jar = stanford_parser_dir  + "stanford-parser.jar"

Как я могу использовать разрешение CoreNLP в Python?

3 ответа

Решение

Как уже упоминалось @Igor, вы можете попробовать оболочку Python, реализованную в этом репозитории GitHub: https://github.com/dasmith/stanford-corenlp-python

Этот репозиторий содержит два основных файла: corenlp.py client.py

Выполните следующие изменения, чтобы заставить coreNLP работать:

  1. В файле corenlp.py измените путь к папке corenlp. Укажите путь, по которому ваша локальная машина содержит папку corenlp, и добавьте путь в строку 144 файла corenlp.py.

    if not corenlp_path: corenlp_path = <path to the corenlp file>

  2. Номер версии файла JAR в "corenlp.py" отличается. Установите его в соответствии с версией corenlp, которая у вас есть. Измените его в строке 135 файла corenlp.py

    jars = ["stanford-corenlp-3.4.1.jar", "stanford-corenlp-3.4.1-models.jar", "joda-time.jar", "xom.jar", "jollyday.jar"]

В этом случае замените 3.4.1 на версию jar, которую вы скачали.

  1. Запустите команду:

    python corenlp.py

Это запустит сервер

  1. Теперь запустите основную клиентскую программу

    python client.py

Это обеспечивает словарь, и вы можете получить доступ к coref, используя 'coref' в качестве ключа:

Например: Джон - специалист по информатике. Он любит кодировать.

{
     "coref": [[[["a Computer Scientist", 0, 4, 2, 5], ["John", 0, 0, 0, 1]], [["He", 1, 0, 0, 1], ["John", 0, 0, 0, 1]]]]
}

Я пробовал это на Ubuntu 16.04. Используйте версию Java 7 или 8.

Стэнфордский CoreNLP теперь имеет официальную привязку Python под названием StanfordNLP, о чем вы можете прочитать на веб-сайте StanfordNLP.

Собственный API , похоже, еще не поддерживает процессор coref, но вы можете использовать интерфейс CoreNLPClient для вызова "стандартного" CoreNLP (оригинального программного обеспечения Java) из Python.

Итак, следуя инструкциям по настройке оболочки Python здесь, вы можете получить такую ​​цепочку кореференций:

from stanfordnlp.server import CoreNLPClient

text = 'Barack was born in Hawaii. His wife Michelle was born in Milan. He says that she is very smart.'
print(f"Input text: {text}")

# set up the client
client = CoreNLPClient(properties={'annotators': 'coref', 'coref.algorithm' : 'statistical'}, timeout=60000, memory='16G')

# submit the request to the server
ann = client.annotate(text)    

mychains = list()
chains = ann.corefChain
for chain in chains:
    mychain = list()
    # Loop through every mention of this chain
    for mention in chain.mention:
        # Get the sentence in which this mention is located, and get the words which are part of this mention
        # (we can have more than one word, for example, a mention can be a pronoun like "he", but also a compound noun like "His wife Michelle")
        words_list = ann.sentence[mention.sentenceIndex].token[mention.beginIndex:mention.endIndex]
        #build a string out of the words of this mention
        ment_word = ' '.join([x.word for x in words_list])
        mychain.append(ment_word)
    mychains.append(mychain)

for chain in mychains:
    print(' <-> '.join(chain))

stanfordcorenlp, относительно новая оболочка, может работать на вас.

Предположим, что текст "Барак Обама родился на Гавайях. Он президент. Обама был избран в 2008 году".

введите описание изображения здесь

Код:

# coding=utf-8

import json
from stanfordcorenlp import StanfordCoreNLP

nlp = StanfordCoreNLP(r'G:\JavaLibraries\stanford-corenlp-full-2017-06-09', quiet=False)
props = {'annotators': 'coref', 'pipelineLanguage': 'en'}

text = 'Barack Obama was born in Hawaii.  He is the president. Obama was elected in 2008.'
result = json.loads(nlp.annotate(text, properties=props))

num, mentions = result['corefs'].items()[0]
for mention in mentions:
    print(mention)

Каждое "упоминание" выше - это голос Python:

{
  "id": 0,
  "text": "Barack Obama",
  "type": "PROPER",
  "number": "SINGULAR",
  "gender": "MALE",
  "animacy": "ANIMATE",
  "startIndex": 1,
  "endIndex": 3,
  "headIndex": 2,
  "sentNum": 1,
  "position": [
    1,
    1
  ],
  "isRepresentativeMention": true
}

Может быть, это работает для вас? https://github.com/dasmith/stanford-corenlp-python Если нет, вы можете попытаться объединить эти два самостоятельно, используя http://www.jython.org/

Другие вопросы по тегам