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

индекс
244,28

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

В преддверии Нового года решил начать небольшой цикл статей, посвящённых наиболее интересующему меня лично направлению в обработке текстов на естественном языке. (То есть NLP в заголовке означает natural language processing — ваш К.О.) Синтаксический анализ, семантика, машинный перевод, поиск смысла слова в контексте — в общем, вся радость компьютерного лингвиста :)

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

Сначала — немного об общей структуре нашего разговора. К области NLP можно отнести кучу самых разных вещей — от морфологического анализа слов до поиска адресов в текстовом файле. Я буду говорить лишь о том, чем занимаюсь. Подход — скорее научный, чем практический. Это не значит, что меня не волнуют применения, вовсе нет! Просто я не буду заниматься потенциально тупиковой ветвью, даже если она даёт некий быстрый (продавабельный) сиюминутный результат. Также меня не волнует, на каком языке что написано, будет это в интернете или на винчестере, виндоус или линукс и тому подобные вещи. Главное — качество идей, их потенциальная развиваемость, а также применимость в разных задачах и к разным языкам.

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

Извлечение фактов и разбивка текста

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

Примерно в ту же «корзину» я бы определил задачу нахождения концов предложений. Вроде бы NLP, но не совсем. В простейшем случае ищем точку, а за ней заглавную букву. Вот тебе и конец, вот и начало. Но на самом деле, конечно, находится миллион исключений: «На ул. Иванова находится наш офис», «At 10 p.m. London time, the Reuters reported...»

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

Обработка на уровне слов

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

Здесь же стоит и обратная задача синтеза: по данным атрибутам и начальной форме сгенерировать требуемую словоформу.

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

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

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

Обработка на уровне предложений

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

Основная цель анализа предложения — построить дерево зависимостей или дерево грамматического разбора (parse tree). Оно показывает структуру предложения, в частности, какие слова от каких зависят. Зачем это нужно? Например, в системе машинного перевода. Допустим, есть английское предложение «I have a red ball and a blue shovel». При переводе на русский компьютер должен понять, что red относится к ball, и переводить это слово надо в мужском роде («красный мяч»). А вот лопата женского рода, стало быть, она «синяя».

Надо сказать, гугл-переводчик в разборе совсем плох, и фразу «I have a blue shovel» переводит как «У меня есть синий лопатой». Это, конечно, никуда не годится.

Наверно, здесь же можно упомянуть об уточнении значений слов с помощью локального контекста. Например, слово «разбить» переводится на английский язык, по крайней мере, десятью различными способами: to break (разбить чашку), to defeat (разбить врага), to lay out (разбить парк) и т.п. Есть и явно экзотические варианты по типу «его разбил паралич»; понятно, что по-английски там никакого «разбивания» нет (he was paralysed). В сложных случаях нужно анализировать широкий контекст фразы, но на практике часто достаточно и локального контекста. Если разбивают чашку, значит to break, если сад / парк — to lay out и так далее.

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

Обработка на уровне текста

Конечно, уровнем предложений наши проблемы не ограничиваются (однако заметим, что без хорошего разбора предложения дальше ехать бесполезно). Очень часто требуется более глобальный контекст. Пример: «I have a sibling. She is beautiful». По-английски «sibling» — это «брат или сестра». Так как дальше речь идёт явно о женщине («she»), переводить «sibling» надо как «сестра». Это называется отслеживанием ссылок. Другие примеры из той же оперы: «Minulla on veli. Hänellä on auto» — «У меня есть брат. У него есть машина» (финский). Тут штука в том, что «Hänellä» — это и «у него» и «у неё» (в финском нет различия между «он» и «она»), и надо правильно выбрать вариант. Бывают штуки и похуже: как перевести на финский «он и она — одна сатана»? :) Иногда приходится собирать целый арсенал сведений об интересующем объекте. Например, на японский невозможно перевести фразу «мой брат — студент», так как в японском нет слова «брат» — есть только «старший брат» и «младший брат». Соответственно, будет «watashi no ani wa gakusei desu» или «watashi no ototo wa gakusei desu» (и это мы не упоминаем о степенях вежливости речи в японском, что тоже проблема).

Но тут, как видите, получается крутой коктейль из data mining, natural language processing, всякой эвристики и даже трудно предположить чего ещё. Задачи интересные, но я пока в них соваться не готов :)

Наверно, на этом статью пора заканчивать (ибо объём). Виноват, если получилось пока что не слишком информативно — дальше будет интереснее.
+47
31 декабря 2009, 16:51
71

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

+9
Pechkin1007 #
При аббревиатуре NLP сразу почему-то вспомнилось нейролингвистическое программирование)
+1
salvator #
я тоже по началу не смог связать содержимое статьи с психологией)
+9
rg_software #
Именно поэтому аббревиатура расшифрована во второй строчке сверху, ещё до ката. По ошибке прочесть две строчки не страшно :)
+2
Error_403_Forbidden #
Обычная ошибка тех, кто не в теме.
НЛО прилетело и опубликовало эту надпись здесь
0
objMihail #
Очень даже информативно, т.к. разложено по полочкам :)
0
Kpblc #
Добавил в закладки, буду следить!
0
FTM #
Заинтересовали вы меня. С наступающим.
0
mikhailian #
Совершенно неинформативно. Хабралюдям надо что-нибудь полезное рассказывать, например про словарь Зализняка-Старостина и как его использовать для поиска словоформ. А вы даже терминологию предметной области ввести не удосужились.
+1
rg_software #
Не всё сразу.
Касательно словаря Зализняка — как раз указал, что вряд ли будем заниматься морфологией, меня больше интересует синтаксический анализ фраз.
0
kmike #
Кстати, а никто не знает, как дело обстоит с лицензированием словаря Зализняка? Кому на него права принадлежат, можно ли его свободно использовать? А то у нас вся морфология на Зализняке. Просто берут и используют, или все договариваются как-то?
+1
mikhailian #
Лет 10 назад то со Старостиным мой тогдашний работодатель подписывал договор на использование словаря Зализняка. Стоило это дело где-то тыщи две евро, ЕМНИП. Но это скорее исключение, где-то в инете есть цитата Зализняка по поводу того, что он не претендует на лицензионные отчисления от использование оцифрованной версии его словаря для морфологического анализа в ПО.
0
kmike #
Спасибо, интересная информация.
0
xintrea #
> Например, на японский невозможно перевести фразу «мой брат — студент», так как в японском нет слова «брат» — есть только «старший брат» и «младший брат»

Во блин. А как же они обозначают брата-близнеца? Ведь он не старше и не младше.
+2
gbezyuk #
Строго говоря, всё же младше или старше, хотя и незначительно.
Если не по времени зачатия, то по времени рождения уж точно, интерфейс родовых путей строго последовательный )
По теме же, онлайн-переводчики выдали действительно два варианта перевода для слова «брат»:
兄弟 и ブラト; а в таком аниме как Shingetsutan Tsukihime я и вовсе третий слышал.
0
rg_software #
Второе — врут :)
Это просто транслитерация на катакану русского слова «брат» :)))
–1
kurokikaze #
Если не по времени зачатия, то по времени рождения уж точно, интерфейс родовых путей строго последовательный )


Есть запасной интерфейс — КС.
0
Nashev #
Этот запасной тоже не сильно параллелен…
0
rg_software #
В японском есть слово «близнецы» :) Наверно, его и используют.
+1
gbezyuk #
Спасибо за пост.
Было бы здорово прочитать небольшой обзор «who is who» в среде NLP, от инсайдера. Персоналии, фирмы, продукты — чтобы понять положение дел в отрасли.
+1
rg_software #
К сожалению, не обещаю. Попробуем.

Проблема в том, что «масло слишком тонко размазано». Одни занимаются морфологией, другие синтаксисом, третьи — извлечением фактов… К тому же, всё завязано на конкретные языки. Если вас интересует, скажем, русский, толку с того, что такая-то фирма имеет кучу алгоритмов для работы с английским или немецким. И борьба подходов, методов ещё не завершена :)
0
fxposter #
Заинтересовался. Хочу продолжения, и в первую очередь интересуют практические мысли по поводу разбора предложений — не в смысле программного кода, а в смысле идей, которые можно использовать для распознавания смысла написанного.
0
chukharev #
«Надо сказать, гугл-переводчик в разборе совсем плох»

Гугл-переводчик не разбирает синтаксис, так как работает по статистическому принципу, на основе параллельных (выравненных) корпусов, лингвистическое описание системы языка при таком подходе не используется. Описанная в статье схема морфологического — синтаксического — семантического анализа соответствует «алгебраическому» (= алгоритмическому) подходу к автоматической переработе текста, который работает на основе формализованных описаний соответствующих уровней языка.
0
rg_software #
Да, об этом ещё будет идти речь.
И своё мнение о подходах гугла я ещё выскажу :))
0
qmax #
«o, bella, ciao! bella, ciao! bella, ciao, ciao, ciao!!»
с итальянского на русский переводится как
«или, лучше сказать, Hello! Ницца, Hello! Ницца, алло, алло, алло!»

«Ницца» тут возникла ну совсем не из выровненного корпуса :)

да и «статистики» по конкретно этой фразе более, чем достаточно.
0
chukharev #
Откуда возникла «Ницца»?
0
qmax #
я тоже не сразу догадался :)
но ответ очевидный :)

bella — nice — Ницца
0
chukharev #
Изумительно! Оно, оказывается, «через английский» не гнушается переводить… Совсем как переводчики на конференциях ООН :-) Спасибо за пример.
0
Antigluk #
Год назад делал программу, которая автоматически генерит транскрипцию введенного слова. и, заодно, делает фонетический разбор :)
0
Antigluk #
некоторые мелочи правда не учтены, но в целом работает правильно
0
chukharev #
Для какого языка?
0
Antigluk #
для украинского
0
chukharev #
А в украинском есть случаи, когда произношение отличается от написания? Там ведь весьма однозначное соответствие орфографии и транскрипции, разве нет?
+1
Antigluk #
Да, благодаря таким эффектам как ассимиляция по звонкости-глухости, мягкости, упрощения (выпадение согласных), удлинение шипящих, сочетания свистящих и шипящих звуков, и многих других.
А соответствие достаточно однозначное, поэтому и есть возможность автоматизировать получение транскрипции. На самом деле нужно просто знать правила и в любом языке будет однозначное соответствие. По крайней мере во многих.
0
rg_software #
:) Ну если все исключения запихать в правила, конечно, исключений не будет вообще :))
В разных языках транскрипция разной степени сложности.

В русском средне, в английском сложно… слишком уж разнообразны источники, откуда в английский приходили слова, сохраняя произношение.
0
chukharev #
В английском языке даже исконно английские слова произносятся совсем не так, как пишутся. Английский язык немного похож в этом смысле на языки с иероглифической письменностью, в которых связи между написанием и произношением никакой нет.

Причина этого — в истории английского языка. Современная английская орфография фиксирует произношение среднеанглийского периода. С тех пор в языке произошло множество фонетических процессов, полностью изменивших произношение, а орфография осталась прежней.

Вообще скорость изменений в английском языке потрясает по сравнению с другими языками. Разумеется, на то есть исторические причины. Сравните с русским. Носитель современного русского языка вполне поймёт «Слово о полку Игореве» (12 в.): «Не лепо ли ны бяшеть, братiе, начяти старыми словесы трудныхъ повестiи о пълку Игореве, Игоря Святъславличя! Начяти же ся тои песни по былинамъ сего времени, а не по замышленiю Бояню...» А попробуйте показать носителю современного английского языка (11 в.): «Hwæt! We Gardena in geardagum, þeodcyninga, þrym gefrunon, hu ða æþelingas ellen fremedon...» Узнаются, наверно, только we и in :-)
0
chukharev #
(Это «Беовульф», конечно.)
0
metamorph #
Интересная тема. Не подкинете ли список рекомендованой литературы?
0
rg_software #
С этим та же проблема, что и с выбором метода и т.п. — слишком велико разнообразие вариантов, чтобы все их охватить в одной книге.
Например, много где цитируют монографию Журафски. Быть может, по уровню охвата и вправду это самая обширная книга.
Однако про dependency parsing в ней вообще ничего или два слова (могу ошибаться, давно её листал).

К сожалению, вам сначала придётся определиться с узкой задачей, а потом уже смотреть литературу по теме. По крайней мере, для меня самого это проблема.
0
Irkin #
Практическое воплощение dependency parsing для русского языка описано 15 лет назад в этой книге (формат DjVu)

Лингвистический процессор

Книга выпущена лабораторией компьютерной лингвистики ИППИ

ИППИ

0
rg_software #
Ох, видел эту книгу. Не хочу никого обижать, но как-то я скептически к ней отношусь, хотя написано много чего любопытного… Грубо говоря, если бы всё и вправду было бы так хорошо, про переводчики ПРОМТ бы вообще никто не услышал.
0
chukharev #
Коллеги, знающие японский, подсказали, что в японском всё-таки есть общее слово для старшего и младшего брата — «nii (nii-chan)». Сам я японского не знаю, потому корректность примера не могу оценить. Пример с финским, в котором нет грамматической категории рода («он — она — оно»), разумеется, корректен.
0
rg_software #
Хм, интересно…
Я сейчас проверил по большому словарю — да, «нии-чан» даётся как «просто брат», хотя в электронном словаре такой расшифровки нет.

Но что характерно, это явно контекстно-зависимый перевод, т.к. для написания используется тот же иероглиф, что и для «старшего брата». Хотя лучше уточнить, я пока ещё специалистом в японском себя назвать не могу.
0
zencd #
А вот меня сопутствующая тема сильно интересует. Хотелось бы почитать научно-популярную (более популярную чем научную) статью о различиях и сходствах языков, о всяких интересных особенностях. Не знаете таких трудов? Или может сами напишете? Знания-то и умения, я вижу, имеются :-)

Вот например о чём я: в финском нет различия между «он» и «она», где-то нет падежей, в японском много разных слов для обозначения одного и того же различного уровня вежливости.
0
rg_software #
Ну если вот так сходу, почитайте статью о лингвистической относительности в «Кругосвете». Там и по ссылкам побродить можно.
0
zencd #
спасибо!
0
Fractalus #
задача создания синтаксического анализатора более менее разрешена, было разработано десятки различных грамматик на эту тему, начиная с грамматик Холмского до стохастических грамматик.Проблема как раз состоит в анализе семантическом. На сегодняшний день пока не известно ни одной системы которая была бы сдана в промышленную эксплуатацию, поэтому на месте автора я бы занялся именно этой темой. И вот это как раз действительно то, чем сейчас занимается наука. Последний интересный проект на эту тему известен как «интерсемантика», в основе которого лежит построение так называемого единого семантического кода языка (рус, укр, англ и т.д.)
0
Fractalus #
извините Хомского
0
rengo #
А нет случайно ссылок на алгоритмы или на готовые реализации разбора текста на предложения? Мне сейчас как раз нужно разбивать на предложения тексты на европейских языках, так не нашёл решения лучше по качеству, чем открывать на сервере документы вордом и использовать встроенные коллекции текста sentences[] и words[].

Всё бы хорошо, да работает аццки долго, смерть просто… Было бы круто, если бы у Вас нашлась ссылочка другая на невордовые реализации =)
0
rg_software #
Тут главное знать, что гуглить :) Штука популярная, ищите «sentence splitter»… не даю конкретных ссылок, т.к. можете найти довольно много разного — на нужном языке программирования, для нужного языка входного текста; это не редкость.
0
rengo #
Это я гуглил, но мною нагугливается только шлак один, да к тому же в основном для инглиша.
Есть у меня внутреннее ощущение, что придумана библиотечка умеющая сплиттить кучу языков, точно придумана. На каком языке — без разницы, прикручу к своему дотнету по любому.
0
rg_software #
Ох, тогда не знаю — что шлак, а что не шлак… Для начала хотя бы эти: opennlp.sourceforge.net/projects.html
В OpenNLP Tools есть sentence detector/splitter, да и вроде там не сильно завязано на конкретные языки…
0
rg_software #
Ещё вот это вроде на язык не завязано: alias-i.com/lingpipe/
0
rengo #
Вот за это спасибо, кажется весьма гут)

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