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

индекс
244,28

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

Хотя в первой части я и говорил, что не собираюсь останавливаться на морфологии, видимо, совсем без неё не получится. Всё-таки обработка предложений сильно завязана на предшествующий морфологический анализ.

Лирическое отступление. Наш с вами родной русский язык очень хорош (для нас) и труден (для иностранцев) богатой фонетикой и разнообразием грамматических средств. Поэтому нам, в принципе, должно быть не очень сложно изучать иностранные языки. Во-первых, в них не так много незнакомых нам фонем. Окей, надо потратить некоторое время на тренировку «th», «w» и «r» в английском, но представьте себе изучающего русский иностранца, в родном языке которого нет различия между «б» и «п» или, скажем, между «р» и «л»! Ещё многих страшат сочетания согласных («Кржижановский»), которые мы практически без труда щёлкаем. Во-вторых, обилие грамматических явлений редко сталкивает нас с чем-либо непонятным. А для американца, например, само понятие рода или падежа совершенно неочевидно. Есть языки без личных форм глаголов, есть языки без предлогов.

И всё же морфология

Теперь о морфологии. В принципе, на первый взгляд тут говорить особо не о чем. Автоматические морфологические анализаторы работают хорошо. Разумеется, они не могут самостоятельно определить контекст, и выдают все возможные варианты трактовок (например, слово «русский» может быть как существительным, так и прилагательным). Если кому интересно посмотреть, как работает автоматический анализатор — можно поэкспериментировать на сайте С.А. Старостина. Смею предположить, что едва ли не все морфологические анализаторы русского так или иначе опираются на Грамматический словарь Зализняка. Кроме того, модуль так или иначе должен принимать во внимание регулярность структуры языка, и «угадывать» (по возможности) новые слова. В регулярности русского нетрудно убедиться с помощью известной фразы «глокая куздра штеко будланула бокра и кудрячит бокрёнка». В ней без труда угадываются части речи и словоформы, хотя понятно, что ни одного слова данной фразы в словарях не найти. В общем, не дудонь бутявку.

Существуют и загружаемые модули. Сам я пользуюсь разработками Алексея Сокирко, «обёрнутыми» в удобный интерфейс на сайте Lemmatizer. Хочу обратить внимание на то, что здесь доступен не только анализатор форм, но и синтезатор, позволяющий автоматически сгенерировать требуемую форму слова. Есть, конечно, и некоторые огрехи. Например, меня слегка раздражает нелюбовь анализатора к букве «ё», а также некоторые технические особенности генерации атрибутов. Анализатор умеет и угадывать неизвестные слова, хотя иногда смешно ошибается. Например, он считает, что слово «крокодилица» есть словоформа начальной формы «крокодилицо» :)

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

Впрочем, я, наверно, нарисовал слишком радужную картину морфологического анализа :) Есть и трудности. Первая — техническая. Далеко не все языки одинаково легко анализируются. Судите сами: упомянутый русский морфологический анализатор Алексея Сокирко оперирует базой данных в 18,5 мегабайт. Его же версия для английского требует лишь 1,6 мегабайт.

Вторая проблема связана с терминологией. Как ни странно звучит (все ведь в школе учились) в морфологии слов не всё так однозначно. Да, все мы знаем, что «стол» — это существительное, «красный» — прилагательное, в русском языке шесть падежей и так далее. Но существует и масса тонкостей, в которых «среди товарищей согласья нет». Например, всё тот же анализатор считает, что «о лесе» и «в лесу» — формы предложного падежа. Хотя многие лингвисты будут настаивать, что вторая форма — это локатив, практически вымерший в русском языке падеж. Есть и другие «реликтовые формы». Например, звательный падеж («Гриш! А Гриш!») Насколько знаю, он достаточно активен в украинском. Есть и частичный падеж, он же партитив: «официант, ещё чаю!» (вместо «чая»). Партитив буйным цветом цветёт в финском, доставляя изучающим массу радостных моментов.

Нет единства по поводу отнесения некоторых слов к той или иной части речи. Например, что такое «нельзя», «пора», «жаль»? На Грамоте предлагают относить их к «предикативам», но общепринятого подхода нет.

Можно спросить, а какая, собственно, разница. Ну разбирает анализатор и разбирает. Считает предикативом — отлично, наречием — замечательно. Видит разницу между «лесу» и «лесе», не видит — это всё игры филологов. К сожалению, с выбранным анализатором вам ещё жить и жить. Если в дальнейшем, допустим, вы будете считать, что в данном контексте предложения может появиться только предложный падеж, сработает ваше утверждение или нет — зависит и от морфологического анализатора. Обзовёт он «локативом» сочетание «в лесу», и плакал ваш предложный падеж :)

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

Всё, если по морфологии не будет изобилия вопросов, перейдём в следующей части к предложениям.
+36
1 января 2010, 07:59
36

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

+6
bobry #
я вами восхищаюсь «1 января 2010, 07:59» ;)
+8
rg_software #
Не все живут в ДС :)
+2
bask #
У меня тоже есть подобная реализация морфологического анализа на .NET, в т.ч. и с предсказанием.
Желающие могут потестировать здесь samodum.ru/demo.aspx
+1
rg_software #
«крокодилицу» знает ;)
0
kmike #
Кстати, странно, что у lemmatizer проблемы с крокодилицей. Я писал pymorphy на словарях с aot.ru (чтоб получить простую реализацию анализатора, которую легко модифицировать), сейчас проверил — проблем с крокодилицей у него нет.
+1
Error_403_Forbidden #
«глокая куздра штеко будланула бокра и кудрячит бокрёнка» тоже понимает.
Круто :)
Это у меня основной тест для морфологических анализаторов.
+1
chukharev #
А для синтаксических анализаторов красив знаменитый пример Р.Г.Пиотровского: «Об этом уже уже можно сказать, что он не уже молодого ужа». Судя по материалам aot.ru, у них в синтаксическом анализаторе предусмотрено отдельное правило (они называют синтаксические правила «форматками») для «борьбы» с «ужами».
+1
eugenius_nsk #
Синтаксический анализатор в моей голове сломался на «уже уже» %-)
0
alno #
А проект lemmatizer.org жив? Я около полугода назад им писал что-то, но не получил ответа…
0
alno #
По поводу глаголов в анализаторе Сокирко — не замечал такой особенности, у меня все распознается одинаково. Правда я использую родную реализацию с сайта aot.ru, а не с lemmatizer.org.
0
rg_software #
По поводу лемматайзера — не знаю. Сайт жив :)

А по поводу анализатора Сокирко — не могу согласиться. Зайдите на aot.ru/demo/morph.html
Если ввести «прыгать», он пишет, что это инфинитив, а если «прыгаю» — Г[лагол].
0
alno #
Да, согласен =)

Забыл что провожу обработку результатов)
+2
chukharev #
Что касается «массы тонкостей», которых очень много в любой естественной грамматике и с которыми неизбежно сталкиваешься при попытке выучить иностранный язык, выйдя из сензитивного возраста (лет так после 12-ти), не думаю, что здесь проблема в отсутствии «согласия в товарищах». В частности, вопрос о том, выделять или нет местный падеж (локатив) из предложного падежа (препозитива) — с теоретической точки зрения есть вопрос определения падежа, а выбор конкретной теории определяется задачей, которая изначально ставится при описании грамматики. Например, задача, которую ставит перед собой учитель в средней школе (научить учеников правильно писать безударные окончания существительных) требует теории с шестью падежами, задача автоматического построения parse tree требует морфологической теории уже как минимум с 12-ю падежами.

Перечень морфологических классов, которые могут быть приписаны слову конкретным морфологическим анализатором, обычно в явном виде приводится в документации к последнему, что помогает сделать правильный выбор лингвисту, выбирающему модуль морфологического анализа для конкретного проекта.
+2
Error_403_Forbidden #
Сокирко зовут Алексей. Алексей Сокирко.
0
rg_software #
Ой, виноват. Исправлю.
0
qmax #
подскажите, доступны ли где-нибудь исходные грамматические таблицы аффиксов словаря Зализняка в электронном машинночитабельном виде?

я находил только веб-интерфейс к словарю и прочие всяческие реализации типа яндексового.
0
rg_software #
Эм, вот так сходу не скажу, но посмотрите исходники на вышеупомянутых лемматайзере и аот.ру
У Сокирко есть статьи на эту тему.
Так или иначе, анализатор аот.ру основан на словаре Зализняка, стало быть, таблицы должны присутствовать.
0
qmax #
в том виде, как они есть у Зализняка в aot они не присутствуют.

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

видимо, это оптимизировано для задач парсинга,
а для задач синтеза (например, для образования нужной категории слова «ёжик») уже малопотребно.

0
kmike #
С ежиком, думаю, это никакая не оптимизация, а просто случайность, связанная с не самой удачной попыткой поддержки буквы ё или каким-то неправильным использованием GUI-оболочки кем-то из наполнителей словаря.

Но синтезу это совсем не обязательно мешает, к слову. Проверил, конкретно с ежиком у pymorphy (который базируется на словарях с aot.ru) проблем не было. Есть запись «ЕЖИК», у нее прописана правильная парадигма, больше ничего и не надо для синтеза, дополнительный мусор не мешает.

Что же касается основ/аффиксов и баз/флексий: если честно, с терминологией очень туго у меня, поискал в гугле, нашел «Формообразующими являются все флексии и некоторые суффиксы:...». В словарях с aot.ru флексии в этом смысле не хранятся.

Нашел какое-то определение аффикса («типовая необязательная морфема, повторяющаяся в целых разрядах слов, не самостоятельная, а сопровождающая корень с целью выполнения либо словообразовательной, либо формообразующей функции») — судя по этому определению, в словарях aot.ru хранятся именно аффиксы.
0
qmax #
общепринятой терминологией я тоже не очень владею.
аффиксами я назвал имнно формообразующие относительно самостоятельные элементы — суффиксы, окончания.
«флексия» в нагугленном определении, возможно, синоним «окончаний»

в aot флексии включают и куски основы/корня, (например, для нивелирования чередующихся гласных).

порядка ~30000 флексий длиннее 6 букв, ~13000 длиннее 7
например:
«ившегося», «ьевичами», «ерстаемыми», «озмёмтесь», «зотрёмтесь»

тоесь это нифига не минимальные элементы, несущие синтаксические характеристики.
а у Зализняка именно минимальные, если я ничего не путаю.
0
qmax #
возможно, это минимальные элементы _однозначно_ идентифицирующие синтаксическую категорию в контексте данной парадигмы.
0
kmike #
Вы правы в том, что традиционного разбиения на приставку-основу-суффикс-окончание в словарях с aot.ru нет. Там слова могут разбиваться на 2 части (назовем их основой и аффиксом) любым образом, который обеспечит потом нужное словообразование и получение морфологической информации (при этом желательно максимальное повторное использование аффиксов). Термин «основа слова» используется там не в «школьном» понимании, а в сугубо утилитарном, разбиению на части не приписывается еще какой-либо дополнительны смысл.

Не очень сейчас представляю, как, словари, основанные на «классических» основах, суффиксах и окончаниях можно использовать для построения морфологического анализатора. А с таким «утилитарным» словарем простейший морфологический анализатор (без наворотов) можно уместить строк в 30 кода (коротких, включая комментарии и работу с вводом-выводом).
0
qmax #
согласен, что такое «утилитарное» дробление вполне оправдано для анализатора.

но вот в рамках синтеза привязывать сюда семантику становится сложнее.

могу ошибаться, но мне кажется что в aot ещё и не полные парадигмы,
тоесть то, что в таблице с одним id не всегда охватывает все формы одного «слова».
(я сконвертил всё это в sqlite и не помню уже как называется эта таблица в оригинале)
0
kmike #
А что понимается под синтезом? Просто изменение формы слова или что-то еще?

Если изменение формы слова, то дело упирается только в правильное перечисление всех правил в парадигмах. Задачи вроде смены части речи — да, там правильно не решить, только эмпирически. Ну и особенность насчет инфинитива, не знаю, как это себя проявит.

Я не встречал там неполных парадигм, но никакого автоматического тестирования на размеченном корпусе не проводил (нет у меня такого корпуса, а самому делать — квалификация не та и времени нет), поэтому, возможно, мне просто везет. Есть примеры какие-то?
0
qmax #
под синтезом я понимаю трансляцию какой-нибудь семантической структуры в естественный язык.
например, для веб2.0ности, «рендеринг» RDF/OWL структур в естественный русский язык.

на последнем (или предпоследнем) этапе потребуется согласование синтаксических характеристик. тоесть таки постановка слова в нужную форму.
0
kmike #
Какие-то препятствия, наверное, будут с любым морфологическим анализатором, под это дело не заточенным.

Но раз только согласовывать форму слова, то препятствия все преодолимые. В том же pymorphy уже есть метод inflect_ru, который умеет выборчно менять у слова какие-то морфологические характеристики, сохраняя остальные. Во всех анализаторах, основанных на словарях с aot.ru, будут проблемы с преобразованием инфинитива в глагол (обратное преобразование — без проблем). Но, думаю, все решается.

Вообще говоря, морфологический анализатор — сравнительно простая штука, и затачивать ее под какие-то конкретные цели должно быть совсем не сложно.
0
qmax #
размеченный корпус вроде есть у «института русского языка».
искать лень.

про неполные парадигмы мог попутать.

примеров сейчас не найду,
возился с этим довольно давно и результатов не сохранял.
0
kmike #
www.ruscorpora.ru/index.html — это оно? На него тоже натыкался, но там доступ очень ограничен: только онлайн-поиск (насколько я понимаю, бесполезный для моей задачи), скачать размеченные тексты нельзя.
0
qmax #
да. именно оно.

там где-то в «использовании» написано, что оффлайновая работа с корпусом вроде как будет возможна.
ну и намекается, что если очень надо можно к ним постучаться в индивидуальном порядке.
0
kmike #
Ага, Вы правы, можно постучаться, не занимался этим по 2м причинам.

Делаю open-source проект (в свободное время, это причина 1), хочу прикрутить к нему автоматический мониторинг качества. По идее, это значит написать скрипт, который будет прогонять текст через анализатор и сравнивать результат с разметкой. Чтоб тест могли запускать все, кто правит код, текст должен быть в свободном скачивании. Вот тут-то индивидуальный порядок с идеологией open-source не очень вяжется, это причина 2) Сомневаюсь, что если они не выложили все в открытый доступ сами, то позволят сделать это мне.

А вообще, закрытость научных разработок (даже спонсируемых государством), расстраивает нередко. Поворчал немного)
0
qmax #
в принципе, можно сделать чтобы тест лазил в сеть и проверял интерактивно.
0
kmike #
Можно было бы, но в ruscorpa только бесполезный поиск по фразе или грамм. характеристикам — текст для анализа не получить, и у обработанного текста правила не проверить.
0
kmike #
0
qmax #
см.выш.
0
gasyoun #
Тема интересная. Говорю как бывший аспирант Зализняка и к.ф.н.
0
FTM #
Слежу за этим циклом статей и поражаюсь автору, не жалеющему себя в праздники.

Слежу, в основном, как большой поклонник языка русского, интересно, что же будет в конце :).

Спасибо, много нового.
+1
lugansk #
Спасибо за интересные материалы.

> Например, звательный падеж («Гриш! А Гриш!») Насколько знаю, он достаточно активен в украинском.

В отличии от русского, где звательный является новообразованием (нулевая флексия: мам! Тань! Вась! и т.д.) в украинском сохранился старый вокатив (на -ю, -о, -е, -є: мамо! Таню! Олеже! Юліє Володимирівно! :) и т.д.).

Так что явления хоть и параллельные, но не идентичные, тем более в русском звательный до сих пор имеет оттенок разговорности, что может понадобиться учитывать в контекте при переводе на украинский.
0
eugenius_nsk #
Т.е. получается, что в русском языке звательный падеж был, потом отмер, а сейчас образуется вторично, причём другим способом? Интересно, не знал.
0
qmax #
«Отче наш»
0
eugenius_nsk #
То, что звательный падеж был, я в курсе. Я не задумывался, что он сейчас заново образуется, и именно про это я и сказал «интересно».
0
qmax #
у вас в комменте получилась довольно неоднозначная синтаксическая конструкция :)
поэтому что именно вас удивило не очевидно :)
0
lugansk #
>> а сейчас образуется вторично

Уже образовался, причём, думаю, довольно давно. Сейчас новообразованный звательный падеж используется только в разговорной речи, так что осталось дождаться официального признания Институтом русского языка.
Уважаемые Василь Петрович и Ирин Ивановна! В ответ на ваш запрос сообщаем...

Своеобразно звучит :)
0
Indalo #
Очень интересно и легко читается.

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