Как стать автором
Обновить

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

Время на прочтение 5 мин
Количество просмотров 15K
В преддверии Нового года решил начать небольшой цикл статей, посвящённых наиболее интересующему меня лично направлению в обработке текстов на естественном языке. (То есть 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
Комментарии 54
Комментарии Комментарии 54

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн