Комментарии 52
и всёже для изучающего язык гораздо важнее «как говорят» и «как не говорят», чем разбираться в грамматических категориях
А вот не скажите. Важно понять не только, как не говорят, но и почему так не говорят. Человек (явно или неявно) формирует в голове правила. ОК, я знаю, что нельзя сказать «я съел пирожному». А можно сказать «я съел мясу»? А «я съел морковке»? :) Всего не перечислишь, и объяснить общее правильно, насколько понимаю, необходимо.
в случае с обучением языку живого человека этот метод вполне оправдан.
категориальная ассоциация между «пирожному» «мясу» и «морковке» вполне может образоваться на основе одной только эмпирики (тойже статистики), и потом «чувствоваться интуитивно».

в конце концов, мало кто из адекватно говорящих по русски знает сколько в русском падежей и склонений.

мне кажется, гугловцы примерно такими соображениями и руководствовались в своём статистическом переводчике.

ну и, надо сказать, для проверки орфографии метод вполне работает
(реализован агентом Spelly в гугловолне)
это потому, что мозг сам находит эти правила и сохраняет их, не всегда облекая их в словесную форму.
а последующие «интуитивные чувства», появляются при приложении этих правил ко входным данным.
то есть правила, как ни крути есть.
когда стоит задача повторить поведение человека, надо либо создавать систему, саму выводящую правила, наподобие человеческого мозга, или же выделять правила и вкладывать их в систему, чем тут, как я понял и занимаются :)
правила есть в теории. только когда они облечены в словесную форму.
и причём покрутить можно ещё поразному, и получатся разные правила.
в первой части об этом говорилось. (можно считать что в русском 3 склонения и 6 падежей, а можно считать что 13 склонений и 8 падежей. явление склонения имён при этом не меняется)

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

наличие правил не теория, это следствие вполне определённого поведения системы на более высоких порядках по правилам более высоких порядков. подозреваю, поправьте меня, если я неправ, что статистика позволяет выявить только правила самого низкого порядка.
Честно говоря, я не совсем понимаю, как с помощью decision trees можно решать проблемы NLP.
Хотя сама по себе штука весьма полезная, конечно, но в других задачах! :)
если коротко, то с помощью data mining можно делать следующее:
— предсказание морфологии слова
— автоматическое создание базы морфологических признаков
— предсказание синтаксической роли слов
— автоматическое создание базы синтаксических признаков
короче, при наличие большой базы, все задачи составления лингвистической информации можно сложить на компьютер.
decision trees употреблено здесь как одна из часто используемых технологий data mining.
этот метод (или его альтернативы) можно использовать для всех перечисленных выше действиях, так как они сводятся к задачам автоматического построения и использования классификаций.
кстати, именно этим я хотел бы заняться для русского языка через несколько месяцев.
также меня интересует автоматическое создание базы транскрипций, аналогичной CMUDICT, для разных естественных языков.
Ну вообще в NLP обычно используются методы машинного обучения коорые как раз пытаются вывести нечто наподобие правил из статистики.
Наиболее очевидно это в случае использования деревьев решений (decision trees).
Я думаю что как и человеку изучающему язык, так и программе нужно использовать комбинацию как теории (строгих грамматических правил) так и практики (статистических данных) для достижения хорошего результата.

Человеку проще правда еще тем что у него есть жизненный опыт помогающий извлечь смысл из текста, программам такого пока не дано.
>Человеку проще правда еще тем что у него есть жизненный опыт помогающий извлечь смысл из текста, программам такого пока не дано.

Почему же, OpenCYC и некоторые другие базы данных как раз занимаются этим «жизненным опытом», под названием Common Sense.
Например, там есть данные такого плана «в доме человека обычно есть мебель»,
«фрукт — съедобное», «фрукт — объект физического мира, разные фрукты не пересекают друг друга» (SpatiallyDisjointObjectType), итп.
или вот вам, например, транспортное средство: sw.opencyc.org/2009/04/07/concept/en/TransportationDevice
или дом:
sw.opencyc.org/2008/06/10/concept/en/HumanResidence
Заниматься то они занимаются, только толку мало, собирать по крупицам вручную данные такого плана очень кропотливое занятие которое врядли когда нибудь обеспечит достаточную полноту (проект то уже очень старый). Да и практических применений особо не наблюдается пока (наверное как раз в виду сильной ограниченности базы знаний.)
нет, тут вы не совсем правы.
в основном используются алгоритмы массового извлечения Common Sense из текстов.
просто большинство подобных проектов своей задачей ставит сверх-высокую степень очистки знаний, поэтому знания накапливаются достаточно медленно.
— в OpenCyc всего 47,000 concepts and 306,000 facts (http://en.wikipedia.org/wiki/Cyc),
— в основанном на нём Umbel — 20,000 subject concepts and relationships distilled from OpenCyc, a further 1.5 million named entities are mapped to that structure,
— в DBPedia — 2.9 million things,
— во FreeBase — десятки миллионов табличных фактов.
Итого, знаний о вещах уже больше, чем у отдельных людей :), но всё ещё меньше, чем у человечества в целом. Кроме этого, ещё есть менее структурированные базы данных второго порядка (wikipedia, энциклопедии итп).
Мало только знаний в базах данных логических правил вывода. Вот эту информацию абсолютно непонятно как заполнять автоматически.

кроме того, я подозреваю, что альтернативы семантическим подходам парсинга текстов просто нет. огромную неоднозначность понимания текста без базы знаний устранить невозможно.
Я, к сожалению, слабо верю в эти проекты, потому что факты — это хорошо, но их явно недостаточно. Например, с помощью фактов и логических операций трудно описывать события во времени (есть темпоральная логика, но это другая история). Скажем, я не совсем чётко представляю себе, как описать то, что если мальчик пошёл в школу в 8 утра и вернулся в 14 часов дня — значит, в 11 утра он, скорее всего, был в школе.
ну, я, наоборот, представляю чётко, как описать такую систему правил и логического вывода. более того, для некоторых задач в Cyc уже сформирована подобная система логического вывода, и Cyc способен решать такие задачи.
проблема, на мой взгляд, совершенно в другом.
1) как обойтись без объяснения компьютеру, что имеется в виду под «пошёл в 8 утра в школу» и «вернулся в 14 часов дня». скажем, как компьютер поймёт, что всё происходит в один день? человек решает данную задачу, основываясь на том, что ему дано достаточное количество данных.
2) как обойтись без объяснения компьютеру подобных правил вывода, работы с интервалами, логического вывода на основе ограничений, возможно, даже потребуется что-то типа моделирования ситуации в виртуальном мире.

если данные проблемы не рассматривать, то система должна работать примерно следующим образом: на основании входных данных и ограничений формируется задача (М пошёл в школу в 8 утра, М вернулся в 14 дня, где был М в 11 дня, ответ к задаче существует, данных для решения достаточно). constraint solver её решит.
подобным образом уже решаются даже текстовые геометрические задачи.
>Я, к сожалению, слабо верю в эти проекты, потому что факты — это хорошо, но их явно недостаточно.
Я предлагаю не рассматривать Cyc как самостоятельное полноценное решение проблемы слабого AI. Он создавался как самодостаточная база данных для вывода фактов на основе других фактов и предоставляемой ему внешней информации.
«The project was started in 1984» И с того времени таки нет действительно работающего применения. По-моему Cyc проект из той же серии что литература 80-х в которой все проблемы уже были решены.

А насчет баз вроде DBPedia / FreeBase — от них как раз меньше всего толку для задачи понимания текста. Ясное дело что в них больше фактов чем в голове у человека. Вот только они и для программы будут иметь такое значение как для человека справочники — можно при необходимости подсмотреть сухие факты о чем то известном, но уже при наличии понимания о чем идет речь (а проблема как раз в том чтоб получить понимание).

Семантический анализ текстов ясное дело необходимо проводить рано или поздно, и судя по тому что синтаксический анализ до сих пор слишком плох без учета семантики, то наверное таки да, будущее за совмещенным семантическим и синтаксическим анализом.

Вот только Cyc мне кажется тут совсем не при делах. «The Knowledge Base (KB) contains over one million human-defined assertions, rules or common sense ideas.» — их факты таки набраны вручную и пока они сами не в состоянии были их применить для чего-то действительно полезного. К тому же изза проприетарности и дороговизны базы врядли третья сторона сделает что-то на основе их работы.

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

один из методов дал точность угадывания в ~60% (проверялось на корпусе тогоже словаря)

«исследования» были заброшены после того как ознакомился с работой Зализняка на тему акцентуации.

То есть получается, что где-то статистика работает хорошо, а где-то плохо… В принципе, что и требовалось доказать :)

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

А уж про синтаксис дело ясное — кто из нас не вбивал спорную фразу в поисковик, чтобы убедиться, что другие так говорят?..
Роль статистики в данной статье явно недооценивается. Существуют работы, показывающие определяющую роль вероятностного математического анализа при разборе предложения, особенно для так называемых «далеких зависимостей» (long distance dependencies). Ссылка на одну из работ

Синтаксические структуры для LP
А по-моему, ваша ссылка только подтверждает мою точку зрения. На первой же странице они пишут, что наивный статистический подход (3-грамм) явно уступает попытке построить синтаксическое дерево зависимостей.
Да, дерево они строят с помощью статистических методов, но они и не пытаются доказать, что это лучше подходов, основанных на правилах/грамматиках.
Вы не совсем уловили основную мысль этого исследования. Они как раз таки это и доказывают.
Если на примере, то в предложении:

Какая птица, вы считаете, возможно не умеет летать?

Просто опираться на граф составляющих или зависимостей нельзя. Вероятностный анализ, основанный на том, что вероятность связи «птица — летать» гораздо выше, чем другие даст результаты гораздо точнее. Машина заранее имеет статистику типичных, наиболее вероятных зависимостей. Нечто вроде своебразной математической базы «объект — действие — признак»
Виноват. Впрочем, я всё равно не понимаю, почему здесь не сработают обычные правила. Как раз в этом примере всё очевидно: субъект глагола «считаете» будет «вы» (мало того, что ближе всего, так ещё и согласуется морфологически).
А «умеет» хочет третье лицо, ед. число — кроме «птицы» туда просто нечего присоединить, так что любой парсер на правилах должен делать это вообще без проблем.
Да, ещё, «умеет летать» — это единая глагольная конструкция, думаю, тоже собирается любым парсером без проблем.
единственное известное мне решение для русского языка (от Dictum): 85.143.5.220:3020/cgi-bin/dictascope3_rus/dictascopeserverrus3 не сработало для вашего предложения с птичкой. =(
Возможно, Irkin хочет сказать, что если бы автор фразы не проставил бы запятые, как нужно, то задача распарсить его с помощью правил бы резко осложнилась, тогда как статистическим разбором что-то можно было бы исправить.
Единые конструкции далеко не всегда единые. Этот пример достаточно простой — для иллюстрации мысли. Если подбирать сложности для парсера, то его можно легко модифицировать.

Птица не человек, умеет самостоятельно летать.

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

Актуальное членение предложения

Хм… Вот странные ощущения у меня от набора этих статей. Потому что лежит вот у меня один том журнала Journal of NLP. Так там в статьях люди какие-то модели формальные описывают, грамматики, алгоритмы, примеры приводят. Это типа я от автора таких вещей слишком рано жду, или этот цикл просто общефилософский обзор проблематики?
Ну я не знаю, чего вы хотите… Можно, конечно, взять все тома Journal of NLP за последние десять лет и изложить здесь все статьи с формальными моделями и грамматиками. Материя неисчерпаема вглубь — каждый автор статьи из упомянутого журнала чего-то новое да сказал своей статьей, иначе не напечатали бы.
Дойдём до dependency parsing, напишу подробнее, потому что это меня интересует.
Ну. Если говорить о моих желаниях, то мне хотелось бы подробностей алгоритмических о том, как морфологический разбор работает. Какие там подходы есть к выделению корней, суффиксов. Или там всё работает вообще без разбора на части слова. Ну, и т.д. и т.п.
Понятно. Ну по поводу морфологии я честно скажу, что не специалист. Для меня это вроде как «решённая задача» в том смысле, что есть хорошие готовые модули, а я их юзер. Вот парсинг — это другое…

Я только знаю, что Зализняк для русского действительно всё по полочкам разложил, и любой программер, прочитав его монографию, может написать приличный анализатор.
А что за монография? Я смог отыскать только словарь. Речь о нём?
Я так понимаю, что в самом словаре приведено достаточно обширное описание сути дела. Но есть и целенаправленная книга:

А. А. Зализняк. «Русское именное словоизменение» с приложением избранных работ по современному русскому языку и общему языкознанию. М.: Языки русской культуры, 2002.
Корни, суффиксы не выделяют. Части слова в обычном понимании почти бесполезны для машинного морфологического разбора (они излишне сложны и неоднозначны). Один из алгоритмов, примерно то же самое используется в lemmatizer: packages.python.org/pymorphy/algo.html
Я правильно понимаю, что делается так: разбиваем слово на четыре части, потому что так получилось разбить, когда анализировался словарь полностью, а потом руками приписываем смысл каждому префиксу, приставке и окончанию?
Если вкратце:

1. Все слова разбиты на 2 части: «основа» («лемма») и «окончание».
2. Считается, что все слова можно склонять, осталяя «основу» и меняя «окончание».
3. В словаре есть набор правил. Правило — это значит, что какому-то «окончанию» сопоставлена какая-то грамматическая форма. Например, может быть такое правило: «ЫЙ» — «П мр, ед, им, од, но».
4. В словаре есть набор парадигм. Парадигма — это просто группа правил. Она определяет, как может склоняться какой-то класс слов.
5. Каждой «основе» сопоставлены одна или несколько парадигм. Через парадигму можно получить все правила, по которым может строиться слово, а зная правила, можно составить сами слова.

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

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

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

Я год назад про это писал ( habrahabr.ru/blogs/python/49421/ ), скоро еще немного напишу, наверное)
за последнее время это лучший цикл статей, который я читаю на хабре, и очень жду продолжения. спасибо!
Прежде всего спасибо за статьи, очень интересно, хотя тема и не совсем моя.
По делу. Согласен во многом с gmax, но хотел бы добавить.
Выше речь шла о том, что мол в мозгу есть на самом деле правила, которые просто не облечены в словесную форму и поэтому имеет смысл, делая разбор предложений, пытаться разгадать эти правила.
Но давайте не забывать, что язык порожден человеком и его мозгом. А мозг, тем и отличается от компьютера, что хорошо работает с трудноформализуемыми задачами. Именно поэтому в большинстве языков нет стройных и красивых правил, как в компиляторах, зато есть куча исключений и неоднозначностей. Так вот в чем хороша статистика, и вообще говоря machine learning — это в извлечении трудноформализуемых знаний. Поэтому мое мнение таково — обучаемая система могла бы лучше производить анализ текстов благодаря способности обобщать. Но это должна быть система глубокой архитектуры, способная оперировать паттернами различных уровней абстракции.
У статистики есть одна приятная и полезная особенность: она даёт «слепок» текста (потоков текста). Например, в языке со свободным порядком слов смысл фразы может передаваться несколькими вариантами: разный порядок, одни и те же слова. Тогда статистика может помочь определить наиболее вероятный из них. Где это может быть полезно? Например, при генерации фраз со предопределённым стилем.

Если говорить о машинном переводе, то одним из интересных подходов с применением статистики является machine learning: www.aclweb.org/anthology/D/D09/D09-1107.pdf. Здесь и красота математики и элегантность модели. Кстати, по показателям система догнала Moses.
«Наиболее вероятный» :)
Если подходить с позиции грамматик, проблема порядка слов вообще не стоит — всё определяется однозначно.

Я повторюсь, давайте начнём с языка Паскаль. Когда напишут статистический компилятор Паскаля, я поверю в этот подход.
Наиболее вероятный из семантически равнозначных вариантов.

Если в анализе получается несколько деревьев, разумно допустить (для общности), что при синтезе также возникает множество вариантов финального предложения.
Да, конечно. I have a blue shirt — у меня есть голубая рубашка, у меня есть синяя рубашка.
Вернее, это я глупость сказал — причём тут перевод :) Если речь об отображении некоего «знания» на предложения языка, множественность выбора сохраняется.

Если есть информация о том, что некто владеет автомобилем, можно выбрать хотя бы варианты: «у Х есть автомобиль» и «Х владеет автомобилем».
exactly. А грамматически эти варианты могут быть не так и близки, чтобы их описать одной фиксированной грамматикой.
Ну дело не в фиксированной грамматике. У Паскаля фиксированная грамматика, однако одну и ту же задачу можно решить по-разному, и даже один и тот же алгоритм записать различными способами.
да. Здесь мы говорим о двух разных вещах:

интерпретации одной и той же мысли / идеи текстом (программы на Паскале или естественно-языковым)

и

генерированием конкретного предложения по его машинном представлению.

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