Разрешение анафоры в Стэнфорде-НЛП с использованием Python - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь выполнить разрешение анафоры, и ниже приведен мой код.

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

java -mx4g -cp "*;stanford-corenlp-full-2017-06-09/*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000

После этого я выполняю приведенный ниже код на Python

from pycorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP('http://localhost:9000')

Я хочу изменить предложение Tom is a smart boy. He know a lot of thing. на Tom is a smart boy. Tom know a lot of thing. и в Python нет учебника или какой-либо справки.

Все, что я могу сделать, это комментировать нижеследующим кодом в Python

разрешение coreference

output = nlp.annotate(sentence, properties={'annotators':'dcoref','outputFormat':'json','ner.useSUTime':'false'})

и при разборе для coref

coreferences = output['corefs']

я получаю ниже JSON

coreferences

{u'1': [{u'animacy': u'ANIMATE',
   u'endIndex': 2,
   u'gender': u'MALE',
   u'headIndex': 1,
   u'id': 1,
   u'isRepresentativeMention': True,
   u'number': u'SINGULAR',
   u'position': [1, 1],
   u'sentNum': 1,
   u'startIndex': 1,
   u'text': u'Tom',
   u'type': u'PROPER'},
  {u'animacy': u'ANIMATE',
   u'endIndex': 6,
   u'gender': u'MALE',
   u'headIndex': 5,
   u'id': 2,
   u'isRepresentativeMention': False,
   u'number': u'SINGULAR',
   u'position': [1, 2],
   u'sentNum': 1,
   u'startIndex': 3,
   u'text': u'a smart boy',
   u'type': u'NOMINAL'},
  {u'animacy': u'ANIMATE',
   u'endIndex': 2,
   u'gender': u'MALE',
   u'headIndex': 1,
   u'id': 3,
   u'isRepresentativeMention': False,
   u'number': u'SINGULAR',
   u'position': [2, 1],
   u'sentNum': 2,
   u'startIndex': 1,
   u'text': u'He',
   u'type': u'PRONOMINAL'}],
 u'4': [{u'animacy': u'INANIMATE',
   u'endIndex': 7,
   u'gender': u'NEUTRAL',
   u'headIndex': 4,
   u'id': 4,
   u'isRepresentativeMention': True,
   u'number': u'SINGULAR',
   u'position': [2, 2],
   u'sentNum': 2,
   u'startIndex': 3,
   u'text': u'a lot of thing',
   u'type': u'NOMINAL'}]}

Любая помощь по этому поводу?

Ответы [ 2 ]

0 голосов
/ 09 августа 2018

Вот одно из возможных решений, в котором используется структура данных, выводимая CoreNLP. Вся информация предоставлена. Это не предназначено как полное решение, и расширения, вероятно, требуются для решения всех ситуаций, но это хорошая отправная точка.

from pycorenlp import StanfordCoreNLP

nlp = StanfordCoreNLP('http://localhost:9000')


def resolve(corenlp_output):
    """ Transfer the word form of the antecedent to its associated pronominal anaphor(s) """
    for coref in corenlp_output['corefs']:
        mentions = corenlp_output['corefs'][coref]
        antecedent = mentions[0]  # the antecedent is the first mention in the coreference chain
        for j in range(1, len(mentions)):
            mention = mentions[j]
            if mention['type'] == 'PRONOMINAL':
                # get the attributes of the target mention in the corresponding sentence
                target_sentence = mention['sentNum']
                target_token = mention['startIndex'] - 1
                # transfer the antecedent's word form to the appropriate token in the sentence
                corenlp_output['sentences'][target_sentence - 1]['tokens'][target_token]['word'] = antecedent['text']


def print_resolved(corenlp_output):
    """ Print the "resolved" output """
    possessives = ['hers', 'his', 'their', 'theirs']
    for sentence in corenlp_output['sentences']:
        for token in sentence['tokens']:
            output_word = token['word']
            # check lemmas as well as tags for possessive pronouns in case of tagging errors
            if token['lemma'] in possessives or token['pos'] == 'PRP$':
                output_word += "'s"  # add the possessive morpheme
            output_word += token['after']
            print(output_word, end='')


text = "Tom and Jane are good friends. They are cool. He knows a lot of things and so does she. His car is red, but " \
       "hers is blue. It is older than hers. The big cat ate its dinner."

output = nlp.annotate(text, properties= {'annotators':'dcoref','outputFormat':'json','ner.useSUTime':'false'})

resolve(output)

print('Original:', text)
print('Resolved: ', end='')
print_resolved(output)

Это дает следующий вывод:

Original: Tom and Jane are good friends. They are cool. He knows a lot of things and so does she. His car is red, but hers is blue. It is older than hers. The big cat ate his dinner.
Resolved: Tom and Jane are good friends. Tom and Jane are cool. Tom knows a lot of things and so does Jane. Tom's car is red, but Jane's is blue. His car is older than Jane's. The big cat ate The big cat's dinner.

Как вы можете видеть, это решение не имеет дело с исправлением случая, когда местоимение имеет предшествующее предложению предложение (название-случай) ("большой кот" вместо "большой кот" в последнем предложении) , Это зависит от категории антецедента - обычные существительные антецеденты нуждаются в нижнем регистре, в то время как правильные существительные антецеденты не будут. Может потребоваться некоторая другая специальная обработка (как для притяжений в моем тестовом предложении). Это также предполагает, что вы не захотите повторно использовать исходные выходные токены, так как они модифицируются этим кодом. Обходным путем было бы сделать копию исходной структуры данных или создать новый атрибут и соответственно изменить функцию print_resolved. Исправление любых ошибок разрешения - еще одна проблема!

0 голосов
/ 13 июля 2018

У меня была похожая проблема.Я решил это с помощью нейронного coref после попытки сделать с core nlp.Вы можете легко выполнить работу через нейронный ядро, используя следующий код:

spacy import

nlp = spacy.load ('en_coref_md')

doc = nlp (u«Телефонный код будет действителен только при соблюдении всех перечисленных ниже условий. Его нельзя оставлять пустым. Он должен быть числовым. Он не может быть меньше 200. Минимальное количество цифр должно быть 3».)

print (doc ._. coref_clusters)

print (doc ._. coref_resolved)

Вывод вышеуказанного кода: [Телефонный код города: [Код телефонной линии, It, It,Это]]

Телефонный код города будет действителен только при соблюдении всех перечисленных ниже условий.Код города не может быть пустым.Телефонный код города должен быть цифровым.Код города не может быть меньше 200. Минимальное количество цифр должно быть 3.

. Для этого вам понадобится spacy вместе с английскими моделями, которые могут быть en_coref_md или en_coref_lg или en_coref_sm.Вы можете обратиться к следующей ссылке для лучшего объяснения:

https://github.com/huggingface/neuralcoref

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...