Искусственный интеллект

индекс
244,28

Заметки об NLP (часть 5)

Что ж, продолжим. (Первые части: 1 2 3 4). Долго выбирал, что будет лучше для следующей темы — пофилософствовать о прагматике языка или поговорить конкретно об алгоритмах разбора. Учитывая, что предыдущая часть была неформальной, решил всё-таки переключиться на конкретику, а там посмотрим.

Итак, синтаксический анализ предложения. Давайте сразу определимся, что речь пойдёт о разборе в рамках концепции dependency parsing, причём определяющей методологией разбора будет точный анализ (не статистический). Начнём с небольшого обзора происходящего вокруг.

Например, у меня на столе лежит книжка под названием Dependency parsing. По названию и аннотации можно подумать, что нас ждёт детальный обзор существующих методик, но это, к сожалению, не совсем так. Авторы сравнительно быстро «съезжают» к своей теме, и половина книги посвящена их подходу, в то время как многие другие методы даже не упомянуты.

Не подумайте, что я их критикую — в том и штука, что данная книга достаточно характерна для нашего времени. Нынешнее состояние отрасли я бы охарактеризовал как «разброд и шатание». Может, заблуждаюсь, хотелось бы верить в лучшее :) Тому есть масса причин. Каждый естественный язык «особен» по-своему. Можно взять какой-нибудь сомалийский и всю жизнь адаптировать для него известные методы, всегда найдётся место новизне. Сформировались солидные лаборатории со своими сложившимися инструментами — та же группа в Стэнфорде, написавшая Stanford parser. Они менять в своих идеях вряд ли что будут в скором времени. Ко всему прочему, качество подходов трудно оценивать. Целая приличного объёма диссертация моего коллеги посвящена методикам оценки и сравнения алгоритмов синтаксического анализа! А он не такой болтун как я, пишет сжато. (Кстати, диссер рекомендую — там содержится хороший обзор современных методов разбора. Да, текста много, но лишь потому, что методов много — в других источниках объём будет не меньше).

Если почитать книги, особенно старые (пусть год издания не вводит в заблуждение, это перепечатка текста начала восьмидесятых годов), складывается впечатление, что всё давным-давно сделано. Однако, видимо, многое желаемое выдаётся за действительное, либо не так отполировано, как хотелось бы. Например, поиск морфологического анализатора для финского языка убеждает, что всё сделано ещё в 1984 году известным в этой области специалистом Киммо Коскенниеми. Однако быстро находится и сайт проекта Omorfi — морфологического анализатора финского, который сейчас пишется (и ещё далёк от завершения) в Хельсинкском университете [имени Линуса Торвальдса] под руководством того же Коскенниеми! Это как бы намекает.

Разобраться в одних только формализмах, доступных на сегодняшний день, непросто. А уж понять, какой из них чего стоит — вообще невозможно. Думаю, это вопрос веры.

Вот они, теории синтаксического разбора:


За каждым подходом — своя школа, свои парсеры, проекты… И до сих пор трудно понять, где лидер. Мой любимчик — XDG, но и там не всё хорошо, и повального энтузиазма по поводу этой разработки в научных кругах пока не слышу. Сам пытался читать и про многие другие подходы. Много умного есть в разных теориях, и нередко они пересекаются.

Так что простите, полного обзора тут не будет. Читайте упомянутую диссертацию доктора Какконена. Рисунок я взял оттуда.

Лексикализация

Старые формализмы не спешат на пенсию. Как видно из рисунка, многие достаточно древние методы успешно развиваются и по сей день. Но один тренд чётко ясен: переход к лексикализованным (lexicalized) моделям. На рисунке они обозначены серым цветом.

Смысл этого термина достаточно прост: в записях синтаксических правил языка так или иначе фигурируют настоящие слова из словаря языка. В нелексикализованных моделях используются более общие понятия. Например, в лексикализованном правиле может быть сказано: здесь должно находиться слово «стол». В нелексикализованном правиле может быть написано разве что «существительное мужского рода», ну и какие-то уточняющие атрибуты.

В принципе, насколько я понимаю, грань достаточно тонка. С одной стороны, объект может быть так «зажат» условиями, что кроме слова «стол» под его определение ничего и не подойдёт. С другой стороны, в лексикализованных правилах также могут встречаться не только конкретные объекты, но и абстрактные понятия: «субъект», «наречие».

На практике нелексикализованные своды правил («грамматики») ассоциируются с чем-то небольшим по объёму и, вероятно, статистически выведенным. Лексикализованные грамматики — это толстые словари, по уровню детализации доходящие до описания отдельных слов.

Проблемы проективности и множественности деревьев разбора

Как видите, хоть обещал разбор, но до разбора всё никак не дойдём. Будем считать, что мы итеративно к нему приближаемся :)
Я уже упоминал, что граф разбора может быть не только деревом (то есть может быть графом общего вида), но это ситуация специфическая, и при чистом синтаксическом анализе она не возникает. Так что, может быть, вернёмся к этому сценарию позже, а пока что будем считать, что при разборе получается дерево.

Так вот, если мне кто-то захочет показать новый парсер (dependency-парсер), первое, что я у него спрошу — поддерживает ли алгоритм построение непроективных деревьев и умеет ли строить всё многообразие вариантов разбора.

Проективными называются деревья, ветви которых не перекрещиваются с проекциями на слова исходного предложения. Такое получается, если всегда объединять в общий узел только соседние элементы. В принципе, в большинстве случаев именно так и происходит:


Но бывает, что надо соединять между собой слова, «перепрыгивая» через третье слово:


(Признаюсь, глагольные «колбасы» типа «хочет помочь кормить» в разных теориях обрабатываются по-разному. На рисунке приведён лишь один из вариантов.)
Насколько понимаю, при phrase-structure-разборе такие ситуации вообще не обрабатываются. Потому что грамматики Хомского по определению описывают лишь непосредственно примыкающие друг к другу элементы. Когда апологеты dependency parsing стали говорить, что этот подход позволяет работать с более свободным порядком слов (чем в английском), хомскианцы ответили: а вы сначала парсер напишите, который умеет строить непроективные деревья — без них выгоды от потенциальной свободы невелики.

Насколько же актуальна проблема? В одной статье пишут, что при анализе реальных текстов на чешском языке «непроективность» была выявлена в 23% случаев. Часто. Проблема непроективных деревьев в том, что если разрешено пытаться клеить любое слово к любому другому, мы тут же выходим за все предусмотренные вежливостью нормы по объёму вычислений. Фактически, в худшем случае получается полный перебор всех возможных графов с N вершинами-словами, то есть задача экспоненциальной сложности.

Тут подключились теоретики и доказали, что ценой небольших ограничений возможностей парсера можно свести его вычислительную сложность к «приемлемой» (я не изучал детали, точные выкладки привести не могу). При этом для той же чешской коллекции документов «не по зубам» этому ограниченному анализатору будет уже всего лишь 0.5% предложений.

Кстати, первые упоминания о непроективном разборе предложений достаточно свежи — примерно 1997 год. Это к вопросу о том, насколько можно в принципе доверять литературе в нашей области. Особенно этим замечательным книжкам из восьмидесятых, в которых «уже всё решено».

Теперь о множественности разбора. В принципе, это та же самая проблема, но с другой стороны. Если пытаться построить все допустимые деревья разбора, мы проваливаемся в ту же «экспоненциальную яму». Понятно, что вариантов разбора будет два-три, ну четыре. Однако в процессе попыток склеить что угодно с чем угодно возникают очевидные накладные расходы :)

Понятно, что многие слова неоднозначны, но их трактовка не влияет на вид дерева, то есть на синтаксический анализ: «я держу деньги в банке». Здесь разбор однозначен: держу деньги (где?) — в банке. При этом неважно, стеклянная банка у меня или каменное здание банка.

Есть «промежуточные» варианты. «По улице шла девушка с косой». Можно всегда разбирать так: девушка (с чем?) — с косой. А можно выбирать: девушка (какая?) — с косой (если речь о причёске); девушка (с чем?) — с косой (если речь о металлической косе).

Бывают и очевидные случаи совершенно разных деревьев. Мой любимый пример: «он увидел её перед своими глазами».
Первый вариант ясен: он увидел (кого?) её (где?) перед своими глазами.
Но есть и «маргинальная» трактовка: он увидел (что?) её перед (т.е. переднюю часть) (чем/как?) — своими глазами.

Не буду врать, но кроме XDG/XDK мне не приходит на ум проектов, умеющих строить всё множество допустимых деревьев.

Пожалуй, на сегодня закончим. Спать хочется :)
+27
2 января 2010, 19:02
27

комментарии (41)

+2
cronfy #
С нетерпением жду следующих частей. Спасибо, очень интересно!
+1
nuzgul #
«Маша Саше хочет помочь кормить крокодила» будет правильнее записать как «Маша хочет помочь Саше кормить крокодила», и тогда с алгоритмом всё будет в порядке :)

А вот случай с «он увидел её перед своими глазами» действительно завораживает. Спасибо!
0
qmax #
голландский: «ik Cecilia Henk de nijlpaarden zag helpen voeren»
досл: «я Цецилия Хенк гиппопотамы видел помочь кормить»
русский: «я видел (как) Цецилия помогает Хенку кормить гиппопотамов»

15.55 КБ

я тут хомского курить думаю что :)
0
qmax #
цитата и картинка из диссертации
Ralph Debusmann — «Extensible Dependency Grammar:
A Modular Grammar Formalism Based OnMultigraph Description»
0
rg_software #
Да, эта фраза в разном виде гуляет по источникам.
Тут вот какая штука: в русском проблема непроективности, насколько я чувствую, не столь важна (непроективные конструкции довольно странно звучат по-русски).
Но в немецком и родственных языках это актуально. Может, тут есть специалисты… в статьях, которые я читал, описывается такая проблема. В придаточных предложениях (Х в фразах вида «Я видел как X») субъекты, объекты и обстоятельства сбрасываются в левую часть в определённом порядке, а в правую часть (называемую «глагольным кластером») идут все глаголы в почти произвольном порядке. Оттуда и непроективность.
+1
qmax #
да, это и есть пример глагольного кластера.

в немецком также существует явление глаголов с отделяемыми приставками:
приставка таких глаголов ставится в конец предложения, но образует с глаголом практически фактически одно слово.
www.studygerman.ru/online/manual/verb3.html

тут тоже большая проблема с проективностью.
0
nuzgul #
Я, конечно, абсолютно не знаком с голландским, но рискну предположить, что это типовая последовательность слов тамошнего предложения. Отталкиваясь от этих данных уже можно совершенствовать алгоритм. А я говорил о том, что русское «правильное» (в прямом порядке) правописание совпадает с оптимальным для алгоритма раскладом, не совпадает лишь слегка некорректно приведенная фраза :)
0
rg_software #
Я тоже не знаком, но если понял из источников, проблема в том, что в некоторых случаях там порядок слов очень свободный (см. мой коммент выше). Поэтому выбрать чёткие правила трудно.
+1
qmax #
я привёл пример, где фраза переписанная в прямом порядке не является «более правильной».
аналогичный случай см в комменте выше с немецкими разделяемыми глаголами —
одно _слово_ раскидывается по разным местам в предложении, и это грамотно.

кроме того,
«Маша Саше хочет помочь кормить крокодила» — это вполне понятная фраза на русском.
и парсер должен уметь её отпарсить.

такчто «переписать фразу более правильно» — это вообще не выход.
+2
qmax #
ну и ещё один мой любимый пример непроективных предложений:
Знаменитое немецкое явление “глагола-в-конце”, о котором забавные истории о рассеянных профессорах, начинающих фразу, продолжающуюся всю лекцию, и под завязку выдающих цепочку глаголов, в которой аудитория, давно потерявшая нить в этом стеке, не видит никакого смысла, часто рассказываются, представляет из себя прекрасный пример лингвистического проталкивания и выталкивания.
Замешательство в аудитории, которое неправильное выталкивание из стека, куда были сложены глаголы пофессора, забавно вообразить, может произвести.

[Douglas R. Hofstadter, “Гёдель, Эшер, Бах”]
0
allter #
На самом деле, мне кажется, не стоит привязывать слова/понятия к узлам дерева — узлами дерева должны быть анонимные объекты — абстрактные отношения. Т.е. вариант с машей и сашей в таком случае должен легко парситься в проективное дерево:

{ кто: Маша, кому: Саше, что_делает: { что_делает: хочет, что: { что_делать: помочь, что: { что_делать: кормить, кого: крокодила } } } }

А про «пе'ред»: если бы в речи не было случаев, когда только ударением или интонацией уточнялся бы смысл, не возникло бы бытовых жаргонизмов наподобие слова «доку'менты», означающего не произвольные документы в ассортименте, а только правоустанавливающие документы.
0
rg_software #
Видите ли, в чём проблема — в памяти компьютера можно держать сколь угодно абстрактную модель, но ведь создавать её приходится на основе реальных слов фразы. И если предполагать, что любое слово фразы может соотноситься с любым анонимным объектом — мы выходим на ту же NP-complete задачу.

Жаргонизмы и прочее, конечно, затрудняют разбор, но и без них в языке хватает неоднозначностей. Это называется «каламбур», целый пласт юмора на этом явлении построен :)
0
allter #
> мы выходим на ту же NP-complete задачу

Собственно, видимо, поэтому надо решать конкретные задачи, не пытаясь построить обобщённую модель: для языков со склонениями один подход использовать, для языков, комбинирующих слова — другие. Всегда будут случаи, когда, например, как в русском, в языке присутствует куча слов из родственных языков с морфологией по правилам того языка, либо устаревшая морфология.

Кстати, практический вопрос: а существующие NLP системы уже научились правильно склонять любые фразы, включая иностранные имена?
+1
rg_software #
Смотря что вы понимаете под «обобщённой моделью». Если это «универсальный парсер», который берётся анализировать что угодно от норвежского до суахили — конечно, такого не будет. Если же речь идёт о теоретическом формализме, в рамках которого строится модель данного конкретного языка — в это я как раз верю. Языки слишком разообразны для одного алгоритма, но слишком похожи, чтобы им требовался радикально разный подход. Скажем, все компиляторы построены на более-менее одних принципах, хотя языки программирования могут существенно отличаться.

«Склонять фразы» — не берусь судить.
«Склонять имена» — умеют, см. часть про морфологический анализ. В русском языке иностранные имена склоняются так же, как и все прочие слова. Ну, может, с отдельными исключениями :)
+2
alno #
Недавно встретил: «эти типы стали есть на складе»
0
intelligenceAgent #
Вот эти две фразы, как мне кажется, о многом говорят: «если разрешено пытаться клеить любое слово к любому другому, мы тут же выходим за все предусмотренные вежливостью нормы по объёму вычислений»
«При этом для той же чешской коллекции документов «не по зубам» этому ограниченному анализатору будет уже всего лишь 0.5% предложений.»
Я думаю, что здесь и кроется одна из главных проблем. Формализовать знания о языке в принципе можно. Но для использования на практике этой формализованной системы нужно будет слишком уж неприличные объемы вычислительных ресурсов, особенно в сравнении с системами, использующими мягкие вычисления, коими являются статистические и обучаемые системы.
0
rg_software #
По правде говоря, я не думаю, что здесь лежит основное поле битвы между статистикой и правилами. В конце концов, никакая статистика не поможет понять, что подразумевается под «девушкой с косой». Если фраза неоднозначна, она неоднозначна что по правилам, что по статистике.

Вообще критикуя статистику, я говорил прежде всего о «наивной статистике». Грамматические правила тоже могут быть извлечены статистическим путём. Но потом парсеру всё равно надо с ними работать, и проблемы у него будут те же самые (ему-то какая разница, написаны правила вручную или извлечены из наблюдений).
0
sunnybear #
угу-угу, видимо слово «стекло» и прочее относится как раз к тем 0,5%.

Все же интересно, какое практическое значение этих «неразбираемых» предложений — там и индусов можно подключить, и ручные словари составить :)
0
rg_software #
а что не так со «стеклом»? ну многозначное слово, это ерунда :)

0,5% — это непроективные конструкции, которые остаются формально недоступными для «ограниченного» парсера, но по-прежнему доступны «неограниченному» (NP-полному).
0
sunnybear #
ну, попробуйте прогнать «стекло аморфное тело» :)
+1
rg_software #
Ну это то же самое, что «он увидел её перед своими глазами» :)
Проблема множественного разбора — но непроективности тут нет, к счастью!
0
mephisto #
Спасибо за топики, очень интересно, читается на одном дыхании :)
0
qmax #
(пока дочитал только до финского)
всвязи с чем возникло любопытство об особенностях синтаксического и морфологического разбора
агглютинативных языков.
тогоже финского.
0
qmax #
про лексикализацию както не до конца понятно…
в чём принципиалное отличие то, кроме размеров словаря/грамматики?
0
rg_software #
Принципиальная разница:

В правилах лексикализованной грамматики В ЯВНОМ ВИДЕ присутствуют слова языка.
В нелексикализованных грамматиках слова не фигурируют, есть лишь абстрактные понятия.
0
qmax #
«абстрактные понятия» это уже как-то ближе к семантике

нельзяли пример грамматического разбора в двух «системах»?
0
rg_software #
Да вроде ближе… это чисто грамматические понятия. Например, «существительное мужского рода».
На выходе получаются деревья одного и того же вида, различия лишь в том, как парсер устроен изнутри. Классический нелексикализованный анализатор описан здесь. Он изучает размеченный корпус текстов (трибанк), и далее для входной фразы пытается построить дерево, статистически наиболее близкое к деревьям в трибанке, если я правильно понимаю механику. Например, изучив трибанк, парсер может для себя вывести следующие правила (по Хомскому):

S → NP VP
NP → pron
VP → v NP
NP → det n

Т.е. тут нет конкретных слов, есть только части речи, синтаксические составляющие и т.п.

Лексикализованный парсер так или иначе опирается на конкретные свойства конкретных слов языка.
В диссере Какконена об этом хорошо написано (поиск по слову unlexicalized, а про лексикализацию тоже много где есть, см. стр. 35, к примеру)
0
rg_software #
гм, в первой фразе опечатка: «да вроде НЕ ближе» :)
0
cronfy #
[отвлечённо от темы конкретно этой части]

А когда парсер пытается определить смысл, каким образом он его «запоминает»? Как вообще вглядит в теории осознание и перевод с одного языка на другой?

Возможно ли первоначальное возведение смысла текста в некий абстрактный универсальный язык, не имеющий живых аналогов, чтобы потом уже привести этот смысл к требуемому языку? Или при переводе всегда используются пары (язык X) <=> (язык Y)?
0
rg_software #
Парсер не пытается определить смысл. Его задача — это выявление связи между словами, семантика слов — это не по его части. Впрочем, об этом ещё поговорим. Возможность перевести на «универсальный» язык есть. Например, для этого существует Интерлингва. Но на практике это всё достаточно плохо работает. Представьте себе, что «сёгун и его самураи» будет переведено как «князь и его дружина» :)
0
nepster #
Есть еще такой язык как аймара

цитата: «Так вот, можно ли гарантировать, что открытия масштаба неевклидовой геометрии не появятся на суахили? Почему бы и нет. Скажем, для составления карты климатов Африки, прямо связанных с долгосрочными прогнозами погоды и для нашей страны, сотрудникам Института географии Академии наук СССР пришлось обработать записи на 25 языках, в том числе и совсем редких.
Сообщений такого рода в последнее время появляется все больше. Так, в 1985 году группа боливийских электронщиков программистов под руководством А. Гусман де Рохаса объявила о создании высокоэффективной системы перевода с одного из 5 мировых языков на другой. Ее окрестили ЭВМ аймара – по названию одного из языков индейцев Боливии и Перу. В прошлом он считался неперспективным, однако внутренняя четкость и простота построения подали ученым идею использовать его в качестве посредника. Скажем, английский текст переводится на язык аймара, чтобы уже с него быть переведенным на французский. Выяснилось, что индейский язык в данном случае не только превосходит общепринятый в этих странах испанский, но и может сравниться со специально созданными для перевода искусственными языками программирования.»

Дмитрий Леонидович Спивак
«Как стать полиглотом»
+1
cronfy #
«сёгун и его самураи» будет переведено как «князь и его дружина»

Ну почему же, согласно википедии, в Интерлингву включаются слова, заимствованные основными языками, то есть «сёгун», «самурай», «гейша», а также «сауна» в языке есть. По идее и «борщ» должен быть, но в словаре не обнаружил :)

А вот аймара — это интересно. Говорится, что в этом языке тройственная логика, что приводит к образованию любопытных неологизмов. К сожалению, примеров не нашёл, может быть, Вы поясните, как это?

Нашёл малую толику уроков по аймаре. Оказывается, например, чтобы спросить, не находится ли некто в определённом месте, необходимо это место (существительное) сделать глаголом (!), придать ему несовершённый вид, настоящее время, лицо и привести к вопросительному наклонению. Вместо «Вы в комнате?» получается что-то вроде «Вы вкомнатуетели?».

Зато пишут, что аймара очень логичен по постоению, что и позволяет ему тягаться со специально созданными для перевода языками, как указал nepster.
0
qmax #
тоже хотел бы увидеть примеры «тройственной логики»
да и вообще как «разрядность» логики проявляется в языке?
0
rg_software #
привёл ссылку в ответе cronfy.
0
rg_software #
Про логику аймары… Там довольно сложное описание, но я так понимаю, что ничего сверъестественного, просто есть категория «возможности» на том же уровне, что и «да/нет».

По поводу «языка посередине». Понятно, что такой язык поможет бороться с комбинаторным взрывом, но я всё равно слабо верю в такую штуку. В конце концов, вспомним известные шутки лингвистов про «цепочечный перевод», когда в конце цепочки автор фразы даже близко не может её узнать (было «ах вы сени мои, сени», а стало «ох, вестибюль мой, вестибюль»).

Абстрактно рассуждая, у каждого языка есть своё ментальное поле. И перевод — это отображение ментального поля одного языка на ментальное поле другого. С неизбежными потерями и искажениями смысла. Потому что любое слово вызывает какие-либо ассоциации, оно имеет окраску, другие значения, оттенок архаики или модерна. Формализовать все эти признаки попросту невозможно, потому что даже хороший переводчик выбирает слово на уровне интуиции и чувства, а не формального соответствия признакам. Даже перевод с одного языка на другой труден, если слово имеет (или должно вызывать) какие-либо коннотации. А если мы сначала кастрируем слово переводом на третий язык, а потом переведём на целевой язык это рафинированный остаток, качества не будет. Да и ошибки перевода множатся, это важно. Если постараться, можно привести кучу примеров, где третий язык всё сломает.

Например, диалектное слово в одном языке должно быть переведено не просто диалектным словом в другом языке, но и вызывающим правильные (требуемые) ассоциации.

0
qmax #
а вы дочитали статью до конца?
нет?
значит, недочитали.

в бинарной логике отрицание означает «противоположное значение», которое всего одно.
неправда, что дочитали — значит недочитали.

в троичной логике «противоположных значений» два. и, соответственно, отрицаний два.
«нeправда, что дочитали» — может означать:
либо «недочитали»
либо «наврядли дочитали»

в аймара на вопрос «а вы дочитали?» три варианта ответа:
«jisa» (да, дочитал), «jani»(нет, недочитал), «ina»(типа того)

если я вас спрошу «а вы разьве[возможность] не[отрицание]дочитали статью до конца?»
и вы ответите «типа того»
мне сложно не только выразить словами что на самом деле,
но даже как-то представить это в голове :)
0
rg_software #
Я думаю, по-русски это тоже работает, хотя и несколько иначе:

— ты дочитал статью?
— иди на ...!

В технике тернарной логикой можно назвать обработку исключительных ситуаций. В Википедии приводят пример из языка SQL:

выражение «City = 'Paris'» по идее, равно TRUE или FALSE. Но если поле city не заполнено (NULL), возникает третье логическое значение UNKNOWN.

Причём значение UNKNOWN действительно логическое, и оно дальше может участвовать в выражениях языка («City = 'Paris' OR Balance < 0.0»)
0
qmax #
всегда подозревал, но не знал этого факта.

кстати, хороший пример, практического применения троичной логики.
+1
qmax #
— ты дочитал статью?
— inna!
0
qmax #
наверно, в контексте NLP более уместен будет другой раздел:
The Logical Suffixes of the Aymara Language
там какраз разбор суффиксов и их значений.
+1
zencd #
Вы удивительно ладно пишете. Респектую и читаю с удовольствием :)

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