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
.Будет ли это?