Принудительно использовать синтаксический анализатор Stanford CoreNLP для определения приоритета метки «S» на корне - PullRequest
0 голосов
/ 28 ноября 2018

Greetings NLP Experts,

Я использую программный пакет Stanford CoreNLP для проведения анализа числа участников, используя самую последнюю версию (3.9.2) англоязычных моделей JAR, загруженную с CoreNLPСтраница загрузки .Я получаю доступ к парсеру через интерфейс Python из модуля NLTK nltk.parse.corenlp.Вот фрагмент из верхней части моего основного модуля:

import nltk
from nltk.tree import ParentedTree
from nltk.parse.corenlp import CoreNLPParser

parser = CoreNLPParser(url='http://localhost:9000')

Я также запускаю сервер, используя следующий (довольно общий) вызов с терминала:

java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer
-annotators "parse" -port 9000 -timeout 30000

ПарсерCoreNLP выбирает по умолчанию (когда доступна полная английская модель) синтаксический анализатор Shift-Reduce (SR), который иногда считается более точным и быстрым, чем парсер CoreNLP PCFG.Импрессионистически, я могу подтвердить это своим собственным опытом, где я имею дело почти исключительно с текстом Википедии.

Однако я заметил, что часто анализатор ошибочно выбирает синтаксический анализ того, что на самом деле является полным предложением (то естьконечное матричное предложение) вместо субстанциональной составляющей, часто NP.Другими словами, синтаксический анализатор должен выводить метку S на корневом уровне (ROOT (S ...)), но что-то в сложности синтаксиса предложения заставляет синтаксический анализатор сказать, что предложение не является предложением (ROOT (NP ...)) и т. Д.

Разборы для таких проблемных предложений также всегда содержат другую (обычно явную) ошибку ниже в дереве.Ниже приведены несколько примеров.Я просто вставлю несколько верхних уровней каждого дерева, чтобы сэкономить место.Каждое предложение является вполне приемлемым английским предложением, и поэтому все разборки должны начинаться (ROOT (S ...)).Однако в каждом случае какой-то другой ярлык заменяет S, а остальная часть дерева искажается.

NP: По оценкам, 22–189 миллионов учебных днейпропускаются ежегодно из-за простуды.(ROOT (NP (NP An estimated 22) (: --) (S 189 million school days are missed annually due to a cold) (. .)))

FRAG: Более трети людей, обратившихся к врачу, получили рецепт на антибиотик, что имеет значение для устойчивости к антибиотикам.(ROOT (FRAG (NP (NP More than one-third) (PP of people who saw a doctor received an antibiotic prescription, which has implications for antibiotic resistance)) (. .)))

UCP: Кофе - это сваренный напиток, приготовленный из жареных кофейных зерен, семян ягод определенных сортов кофе.(ROOT (UCP (S Coffee is a brewed drink prepared from roasted coffee beans) (, ,) (NP the seeds of berries from certain Coffea species) (. .)))

Наконец, вот мой вопрос, который, как я полагаю, приведенные выше доказательства доказывают, является полезным: Учитывая, что мои данные содержат незначительное количество фрагментов или иным образом плохосформированные предложения, как я могу наложить высокоуровневое ограничение на синтаксический анализатор CoreNLP так, чтобы его алгоритм отдавал приоритет назначению S узла непосредственно ниже ROOT?

Мне интересно узнать,наложение такого ограничения при обработке данных (которое известно для его удовлетворения) также излечит другие многочисленные недуги, наблюдаемые в произведенных синтаксических анализах.Из того, что я понимаю, решение не будет заключаться в указании ParserAnnotations.ConstraintAnnotation.Будет ли это?

1 Ответ

0 голосов
/ 03 декабря 2018

Можно указать определенный диапазон, должен быть отмечен определенным образом.Таким образом, вы можете сказать, что весь диапазон должен быть «S».Но я думаю, что вы должны сделать это в коде Java.

Вот пример кода, который показывает ограничения установки.

https://github.com/stanfordnlp/CoreNLP/blob/master/itest/src/edu/stanford/nlp/parser/shiftreduce/ShiftReduceParserITest.java

...