[БЕЗ_ЗВУКА] Мы начинаем урок, посвященный продвинутым методам анализа текстов, и начнем его с того, что поговорим о таком подходе как word2vec, который позволяет представить каждое слово с помощью некоторого числового вектора. Но вначале поговорим о другой проблеме. Представьте, что есть два синонима: «идти» и «шагать». Эти слова имеют примерно одинаковый смысл, но для компьютера это просто строки, причем не очень похожие строки. Они имеют разную длину, у них встречаются разные буквы, и компьютер просто по этим двум строкам не сможем сказать, что они имеют одинаковый смысл. Но при этом при анализе текстов, разумеется, хотелось бы оценивать, насколько похожи два тех или иных слова. Как это можно сделать? Разумеется, по данным. Оказывается, что если два слова имеют схожий смысл, то они часто встречаются вместе с одними и теми же словами. Или, как говорят в науке, у них одинаковые контексты. Используя эту информацию, информацию о том, что у похожих по смыслу слов похожие контексты, можно как раз разработать метод, который называется word2vec. Итак, мы хотим описать каждое слово w с помощью числового вектора w с черточкой. Этот числовой вектор имеет размерность d, то есть состоит из d компонент. При этом мы хотели бы, чтобы d было не очень большим, мы хотим иметь компактные представления слов. Далее мы хотели бы, чтобы похожие слова имели близкие векторы, например, по евклидовой или косинусной метрике. Наконец, если мы каждое слово описываем числовым вектором, то эти векторы можно расскладывать, вычитать, умножать на коэффициент. И хотелось бы, чтобы эти арифметические операции имели некоторый смысл. И как мы видим, у них действительно будет очень хороший физический смысл. Итак, мы пытаемся найти векторные представления слов w с черточкой и при этом будем работать с вероятностями p от wi-тое при условии wj-тое. Эта функция показывает, насколько вероятно встретить слово wi-тое в контексте слова wj-тое, то есть рядом со словом wj-тое. Мы будем настраивать, мы будем искать векторные представления слов w с черточкой такими, чтобы вероятности встретить слова, которые находятся в одном контексте, были высокими. В функционале мы идем по всем словам в нашем тексте, берем k слов до него и k слов после него, то есть слова, которые идут рядом. И максимизируем вероятности встретить слова из контекста рядом с данным словом. Этот функционал можно оптимизировать обычным стохастическим градиентным спуском. Если мы обучим его на довольно большом корпусе текстов, то окажется, что векторы действительно имеют много интересных свойств. В частности, если слова имеют похожие смыслы, то их векторы близки по косинусной метрике. Далее, что касается арифметических операций. Если мы возьмем слово, например, «король», вычтем из него слово «мужчина», добавим слово «женщина», то мы получим вектор, который очень близок к вектору слова «королева». Далее, если мы возьмем слово «Москва», вектор слова «Москва», вычтем из него вектор слова «Россия» и прибавим вектор слова «Англия», то опять же получим вектор, который очень близок к вектору слова «Лондон». Более того, оказывается, что этот подход можно использовать и для перевода слов. Если обучить векторы одновременно на корпусе английских и испанских текстов, то если мы возьмем вектор от слова one, вычтем из него вектор слова uno и прибавим вектор слова four, то мы получим вектор, который близок к вектору quarto — «четыре» на испанском. Конечно же, эти подходы проигрывают тем подходам, которые специально разработаны для машинного перевода, но тем не менее с их помощью удается получать довольно интересные результаты. Наконец, поскольку мы научились использовать представления только для отдельных слов, мы можем попытаться перейти к представлениям для текстов. Для этого мы просто берем текст, векторы всех слов, которые в него входят, и усредняем их, после этого мы получаем признаковые описания уже целого текста, и с ним тоже можно работать. Как мы уже обсуждали, проблема мешка слов в том, что он дает очень большие, очень обширные признаковые описания, в которых могут быть десятки и сотни тысяч признаков. Если же мы воспользуемся подходом word2vec, в котором, например, размер вектора равен 100, то мы получим признаковые описания текста, размер которого тоже равен 100. И уже на этих признаках можно обучать любые методы машинного обучения, например, случайные леса или градиентный бустинг, а не только линейные модели. Таким образом, используя данный подход, можно существенно сжимать представления текстов и обучать сложные методы машинного обучения. Итак, мы выяснили, что такое word2vec, что это подход, который позволяет описать каждое слово числовым вектором, и при этом эти векторы будут иметь много интересных свойств. Например, похожие слова будут иметь очень близкие векторы. И мы обсудили, как использовать word2vec, чтобы вычислять признаки для текстов. Для этого мы просто усредняем векторы всех слов, которые в данном тексте имеются.