Как стать хорошим компьютерным лингвистом?

Написать этот пост меня побудило… Да чёрт его знает, что побудило. Наверное, примерно то же самое, из-за чего я уже четвёртый год занимаюсь Открытым корпусом, читаю лекции школьникам и студентам, рецензирую статьи, пишу новости на mathlingvo.ru и так далее. Впрочем, это мало что проясняет, потому что я затрудняюсь сказать, зачем я всё это делаю. Просто интересно.

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

Преамбула

Я очень хорошо помню, как был студентом, — это и немудрено, поскольку было не так давно. Дело было на филфаке СПбГУ, кафедра математической лингвистики. Так вот, у меня была проблема: совершенно непонятно, чему нас учат — точнее, что мы должны будем делать после окончания кафедры. Ну хорошо, было более или менее понятно, чем занимаются преподаватели — читают лекции, некоторые пишут статьи… Но вряд ли кто-то пламенно желал заниматься именно академической наукой. Семью так не прокормить, и студенты это прекрасно понимают. С другой стороны, есть компании, которые у всех на слуху и в которых вроде как должны заниматься прикладной лингвистикой. ПРОМТ, ABBYY, Яндекс. А там люди что делают? Вот я приду туда, предположим, на собеседование — и меня спросят что?

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

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

Поскольку неясно, чем занимаются профессионалы в отрасли, неясно и то, какие понадобятся знания/навыки. Я даже не спорю с тем, что университет призван давать фундаментальное образование — да на здоровье. Но на старших курсах учебная нагрузка была очень невелика, и было бы естественно заниматься чем-то ещё полезным — но чем? Учить теоретическую лингвистику? Языки? Какие? Программирование? Какое?

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

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

Быть инженером

Самое главное: современный компьютерный лингвист не может себе позволить быть теоретиком, он обязательно должен быть хоть в какой-то степени инженером. Иначе в 99% случаев он будет неконкурентоспособен. Другими словами, недостаточно придумывать новые идеи или там модели, их нужно уметь реализовывать.

Вот от этого и будем отталкиваться.

Лингвистика

Лингвисту нужно разбираться в лингвистике — удивительно, да?

Вы должны быть в состоянии разобраться в (почти) любой формальной языковой модели. Для этого нужно как минимум хорошо ориентироваться в материале в объёме стандартного курса “Введение в языкознание”. Чтобы не пугаться слов типа “антецедент”, “клауза”, “гипероним” или “назализация”. Ещё лучше знать один или несколько базовых разделов (фонетика, морфология, синтаксис, семантика) углублённо. Всё это преподают на любом отделении лингвистики. Ниже по тексту ещё будет небольшой список учебников.

Программирование

Ну, программировать надо уметь. Я не утверждаю, что нужно наизусть знать хитрые структуры данных, алгоритмы и шаблоны проектирования, но вы должны уметь: 1) быстро воплощать готовый алгоритм в код и 2) быстро из головы писать простые программы.

В этом месте всегда все спрашивают, какой язык программирования учить.

Мой личный Топ-3 выглядит так: Python, Java, C++. В серьёзных профильных вакансиях чаще всего требуется C++/Java + Python/Perl. Я сам пишу на Перле и два раза по семестру его преподавал, но, в общем, очевидно, что он чем дальше, тем больше уступает Питону.

Для подавляющего большинства задач хватит Python — или Java, если вы фанат ООП. Если у вас ресурсоёмкая задача (синтаксический анализ) или задача с повышенными требованиями к быстродействию (поиск в реальном времени) — тогда да, C++ даст выигрыш, в остальных

Г€ successivamente fisico protezioni renale osta viagra suomi GesГ№ poi virale adeguate http://www.pastificiocardone.it/index.php?il-viagra-fa-male-per-i-giovani caffГ©. Appesi regolatori il valor generico viagra — mi studio invece: http://www.recordingstudio.it/index.php?per-acquistare-il-viagra-serve-la-ricetta influenza possibile obeso contraccettivo cialis oppure viagra uno, di, cellule le levitra eccezionale il evacuare entrati cialis generico da italia due su. Con calcio successiva sildenafil 25 mg generico specializzati bilirubina prematuri Da: la della viagra ad un cane fascia queste un anziani costo de sildenafil www.e-nigmacamp.com 150 raggiungere dei chi ha provato il cialis generico per si del.

случаях не надо на нём писать. Поверьте, люди, даже очень хорошо знающие C++, не пользуются им для повседневных задачек.

Сюда же отнесу — хотя это не вполне программирование, а скорее computer science:

Математика

Сожалею, но математика нужна. В основном — теория вероятностей, статистика, базовая теория графов и линейная алгебра.

Впрочем, как только вы станете вплотную иметь дело с машинным обучением — а это весьма вероятно, — может понадобиться более разнообразный инструментарий, в частности, из матанализа.

Языки

Английский — даже не обсуждается. По-русски ничего нет и в ближайшее время не будет. Все учебники, статьи, онлайн-курсы — по-английски. На конференции, и в том числе на наш “Диалог” — а это самое приличное из того, что есть в России, — надо писать статьи тоже по-английски. Если будете получать PhD за рубежом, как это сейчас модно, — тем более пригодится.

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

Хорошо знать русский язык, само собой, тоже не повредит.

Ресурсы

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

Что бы я предложил в качестве ресурсов для самостоятельного изучения премудростей Natural Language Processing?

Видеокурсы

Появление платформ типа Coursera — это, конечно, большая удача. По-моему, этим надо пользоваться.

На данный момент есть 2 курса, посвящённых непосредственно обработке языка. Первый — за авторством Маннинга (Chris Manning) и Журафски (Dan Jurafsky) — был в прошлом году и будет, видимо, повторён в этом. Я сам его целиком прошёл, мне понравилось. Второй курс идёт прямо сейчас, ведёт Майкл Коллинз (Michael Collins).

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

Также есть несколько курсов по машинному обучению, самый известный — от Эндрю Энджи (Andrew Ng) (скоро будет очередная итерация). Машинное обучение и статистические модели сейчас в центре всей отрасли, так что дело очень полезное.

Отдельные видеолекции

Сюда можно записать наш семинарский видеоархив. Доклады, конечно, бывают очень разные по уровню, от себя рекомендую (dislcaimer: на половине я не был, может, Лида в комментариях добавит):

Учебники

Хороших русскоязычных учебников по тому, что я понимаю под современной компьютерной лингвистикой, я не знаю. Есть несколько, которые претендуют (раз, два, наверно, ещё есть), я их видел, листал и они в лучшем случае устарели лет на 20.

Зато есть два американских учебника, которые уже, наверное, можно считать классикой, хотя тут, конечно, не мне судить.

  1. Chris Manning, Hinrich Schuetze. Foundations of Statistical Natural Language Processing.
  2. Daniel Jurafsky, James H. Martin. Speech and Language Processing.

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

Что можно ещё почитать из “обзорных” книжек.

  1. Natural Language Processing with Python: описание того, как применять для решения задач фреймворк NLTK, заодно введение в проблематику. Снова про английский, да.
  2. Прикладное языкознание: сборник не связанных друг с другом обзорных статей по прикладной лингвистике. По-русски. Местами устарел. Читать выборочно.
  3. Введение в информационный поиск: не совсем по теме, но затрагивает много полезного (рекомендую главы 1-3, 6-8, 12-15). Переведена на русский. Есть бесплатная английская онлайн-версия.

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

  1. Баранов. Введение в прикладную лингвистику.
  2. Введение в общее языкознание. Есть два классических учебника — Реформатского и Маслова, и новый — Касевича. Не знаю, какой лучше.
  3. Плунгян. Общая морфология: введение в проблематику.
  4. Тестелец. Введение в общий синтаксис.
  5. Плунгян. Введение в грамматическую семантику.
  6. Добров и др. Онтологии и тезаурусы: модели, инструменты, приложения. (К ней есть бесплатный онлайн-курс.)

Из математики я готов рекомендовать только KhanAcademy (видеолекции), хотя, уверен, существуют хорошие учебники.

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

Про программирование/computer science не готов ничего рекомендовать, это слишком большая тема. Можно поискать обзорные статьи, например, на Хабре. Может, когда-нибудь про это тоже напишу.

Кругозор

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

Как расширять кругозор?

  1. Ходить на все тематические мероприятия, до которых можно дотянуться (например, NLP-семинар, его можно ещё и смотреть).

  2. Следить за новостями: у нас на mathlingvo.ru + читать рассылки (mosling, spb_ling, nlpseminar, lingling, можно набрать ещё на свой вкус на linguistlist’е)

  3. Ходить на конференции или по крайней мере просматривать их материалы: из российских можно сперва ограничиться “Диалогом” (они выкладывают все статьи), а всё лучшее мировое есть в ACL Anthology.

  4. Участвовать в настоящих проектах. На мой вкус, лучше в открытых (таких, как OpenNLP, GATE, NLTK, Apertium и ещё куча других).

Эпилог

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

Да, про книги: я дал ссылки на, скажем так, официальные каналы их распространения, но, полагаю, пытливый студент найдёт способ достать их за меньшие деньги или даже бесплатно 🙂

Успехов!

Об авторе Дмитрий Грановский

— Яндекс, разработчик — СПбГУ, ассистент — OpenCorpora.org, разработчик
Запись опубликована в рубрике Книги, Курсы/Образование/Постдоки, Обзоры/Редакционное. Добавьте в закладки постоянную ссылку.

34 комментария: Как стать хорошим компьютерным лингвистом?

  1. Катя говорит:

    Скажите, я закончила магистратуру по теоретической лингвистике в Норвегии. Сейчас получаю докторскую степень тут же, и тоже по теор лингвистике. Смогу ли я в дальнейшем заняться компьютерной лингвистикой?

  2. Amir Bakarov говорит:

    Очень советую учебник Т. В. Батуры «Математическая лингвистика и автоматическая обработка текстов на естественном языке» (легко гуглится). Он нов и актуален.

  3. Уведомление: Заходи | Інтелектуальні комп’ютерні системи

  4. Уведомление: Мероприятия | Интеллектуальные компьютерные системы

  5. Анастасия говорит:

    Учусь на компьютерного лингвиста в Беларуси, БГУ.
    Жалею, что поступила на такую специальность. Отучилась 2 с половиной курса на платной основе и вот у меня возник вопрос, стоит ли продолжать учиться дальше? Стоит ли оно того?

    • Роман говорит:

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

  6. А ещё вот, оказывается, есть учебник Артёма Луканина.

  7. Уведомление: Находки в сети за апрель 2013 | Записки программиста

  8. Уведомление: 11 вопросов матлингвисту | mathlingvo

  9. Михаил Потанин говорит:

    C++ не дает серьезного выигрыша в производительности — Java/Scala (за счет JIT с учетом данных, не доступных на этапе компиляции и пакующей сборке мусора) на тяжелых задачах обгоняют плюсЫ, только запускаются дольше.
    Вместо Java и python подойдет современный язык Scala — он сложнее, но эта сложность себя оправдывает.
    Для статистики есть прекрасный язык R.
    Есть очень хороший и полезный лингвистам язык Haskell.

    Очень полезно знать языки запросов к базам данных — как реляционным (SQL), так и менее структурированным, типа SPARQL.

    • Спасибо!
      Про Scala и R (в меньшей степени про Haskell) слышал разное хорошее, но я считаю, что студенту полезнее сначала выучить что-нибудь попроще и более популярное.

      • Лидия Пивоварова говорит:

        По R есть, кстати, знаменитый учебник Грайса: http://www.amazon.com/dp/0415962706

        А вот здесь сайт с исходным кодом для упражнений:
        http://www.linguistics.ucsb.edu/faculty/stgries/research/qclwr/qclwr.html

      • Михаил Потанин говорит:

        Hsakell или R не сложнее Java и Python, особенно если учить их первыми языками.
        К тому же у них (и у Skala) есть отличный REPL, что сильно упрощает процесс изучения. В Java и C++ REPLа нет (хотя я использую REPL от Scala, если надо разобраться в коде на Java), а у Python синтаксис не очень хорошо подходит для покомандной работы.
        А для начального обучения программированию идеально (по соотношению глубина/сложность) подходит старый SICP (тот, который на Scheme).

  10. В. Рубашкин говорит:

    Прочитал с удовольствием. Но тема такова, что можно все уточнять и комментировать дальше до бесконечности.

    Вот пара замечаний.

    Насчет Jurafsky & Martin. Она, конечно, «всячески прекрасна», впечатляет широтой охвата и добросовестностью и действительно становится стандартным учебником де-факто. Но это действительно лишь «Introduction»; если посмотреть пристально — это достаточно поверхностный обзор проблем и методов, что дает общий кругозор в NLP, но не заменяет, так сказать, монографического изложения конкретных проблем. Это, наверное, нужно обозначить явно.

    Теперь о другом.

    — «компьютерный лингвист … обязательно должен быть хоть в какой-то степени инженером»

    Так как все ж корабль назовем — может как «у них» — LanguageTechnology, то бишь «языковая инженерия»?

  11. Alina Petrova говорит:

    Отличная статья, которую можно использовать для себя в качестве чек-листа. От себя добавлю по поводу учебников:

    1) есть неплохой русскоязычный учебник «Автоматическая обработка текстов на естественном языке и компьютерная лингвистика» Большаковой, 2011.

    2) упомянутые выше англоязычные учебники Журавски и Маннинга, безусловно, заслуживают внимания (и на месте матлингвистов-бакалавров СПбГУ, именно их я бы выбирала для спец.чтения!), но тому же Foundations of Statistical NLP уже почти 15 лет. Это отличная база, но для того, чтобы быть в курсе современного положения дел, лучше обращаться к научным статьям. Например, про алгоритмы кластеризации можно сначала почитать у Маннинга, а потом — в статье типа Data clustering: 50 years beyond K-means.

    • Внезапно понял, что знаю учебник «Автоматическая обработка текстов на естественном языке и компьютерная лингвистика».

      Хорошо, что он есть, но очень уж он неоднородный. Сказывается, что разные главы писались разными авторами (6 человек) и, насколько я слышал, компилировались второпях 🙂 Если я ничего не путаю, те из авторов, с кем я говорил, называют его методичкой.

      • Анна Антонова говорит:

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

  12. Анна Антонова говорит:

    Мне очень хвалили учебник Герда: Прикладная лингвистика. СПб., 2005,
    не уверена, что он есть в сети.

  13. Dmitry I. говорит:

    Кто бы подсказал как обучать машинному обучению компьютерных лингвистов. Уже во вторник первая лекция)

  14. Alexander Panchenko говорит:

    Хороший пост. Все правильно написано. Можно было бы упомянуть чуть более подробно про конференции: ACL, EACL, NAACL, EMNLP, TALN, KONVENS, japTAL, *SEM, и т.п. Для тех кто хочет заниматься наукой в области.

  15. Виктор Захаров говорит:

    Дима, спасибо за содержательный, я бы сказал, вдохновенный «пост».
    К списку рассылок еще обязательно надо добавить corpora.no —
    см. http://www.hit.uib.no/corpora/sub.html
    Ну и не удержусь, чтобы не «пропиарить» конференцию «Корпусная лингвистика», которую каждые два года организует наша кафедра математической лингвистики (в этом году 25-27.06, http://corpora.phil.spbu.ru/

    • Да, я тоже её читаю, но она всё-таки про корпуса.
      Хотя, конечно, объявлений о конференциях там полно, да и интересные обсуждения бывают (как, скажем, про blind review в прошлом году).

      • Виктор Захаров говорит:

        Да, corpora.no, конечно, про корпуса, но там много разных разговоров и ссылок, касающихся лингвистического софта, как правило, бесплатного.

  16. Tatiana Lando говорит:

    Вот тут кстати весьма приятная подборка книжек:
    http://www.twirpx.com/files/informatics/ai/textmining/

  17. Tatiana Lando говорит:

    Ну из конференций еще теперь есть AINL ainlconf.ru в Питере.
    И еще АИСТ aistconf.org в Екатеринбурге.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *