Векторное представление слов

Что такое векторное представление слов

Здравствуйте и вновь добро пожаловать на занятия по теме «Обработка естественных языков: глубокое обучение на Python, часть 6».

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

Простейшийспособ запомнить, зачем это нужно, – это вспомнить метод главных компонент, илиPCA. Одна из целей метода главных компонент состоит втом, чтобы убрать корреляцию в наблюдаемых данных, чтобы преобразованные данныеможно было представить в более компактном виде. К примеру, в 99% документов,содержащих слово «машина», также содержится и слово «транспорт». Следовательно,эти два слова сильно коррелируют, и для их представления нам не нужны дверазные размерности.

Незабывайте, что для хранения слов мы вначале используем метод прямогокодирования (one-hot encoding), поскольку они являютсякатегориальными переменными. Ввиду этого каждое слово занимает однуразмерность. Следовательно, если размер нашего словаря составляет один миллион,то нам понадобится вектор с размерностью в миллион, чтобы представить всевозможные слова. Помимо  того, чтомиллион размерностей – это чересчур много, есть и другая проблема, связанная спрямым кодированием. Задумайтесь над тем обстоятельством, что одна пара словможет быть сильнее связана между собой, нежели другая пара. Я дам вам минуткуподумать над тем, почему это является проблемой. Если вы не можете сразуответить, поставьте видео на паузу и потратьте минуту-вторую на размышления.

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

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

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

Итак,детский пример. Документ 1 содержит слова «кошка», «собака», «кролик», адокумент 2 – слова «кошка», «лев», «тигр», «кошка». Тогда размер словаря равен5, а N= 2, поскольку у нас два документа. Таким образом, у нас получается матрицаразмерностью 5×2 со значениями

Обратитевнимание, что это в некотором роде противоположность тому, с чем мы обычноработали. Обычно у нас была матрица размерностью NxD, где N – количество примеров, а D – количествопризнаков. Здесь же всё как бы наоборот, поскольку словарь идёт вдоль строк, адокументы – вдоль столбцов. Но если вдуматься, это логично, потому чтодокументы, в которых появляется данное слово, и есть признаки. Например, если унас есть набор слов, встречающихся в статьях по физике, то можно сказать, чтовсе эти отдельные статьи по физике коррелируют друг с другом, а значит, для ихпредставления нужна лишь одна новая размерность. Выражаясь в терминах обучениябез учителя, скрытая причина, или скрытая переменная, – это статья по физике, афактический документ генерируется из распределения, описывающего эти статьи пофизике.

Итак,предположим, что мы использовали метод главных компонент на этойтерм-документной матрице. Мы создали преобразование из размерности VxN в размерность VxD, где D намного меньше N. Допустим, N равно одномумиллиону документов, а D = 300, что соответствует сохранению 95%первоначальной дисперсии.

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

Итак,теперь у нас есть матрица размерностью VxD. Что теперь? Собственно, это всё.

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

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

Вследующем примере с кодом мы так и сделаем. Первый этап будет состоять всоздании TF-IDF матрицы, авторой – в использовании метода нелинейного снижения размерности t-SNE, который также былраскрыт в курсе по глубокому обучению без учителя, вместо метода главныхкомпонент, являющегося линейным.

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

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

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

Этоприводит нас к вопросу: как мы будем находить векторные представления слов вэтом курсе? Очевидно, мы будем и далее реализовывать его как первый этапсоздаваемой нейронной сети. Это значит, что на входе нейронной сети у нас будетматрица размерностью VxD, как вы увидите, когда мы перейдём крекурсивным нейронным сетям.

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

Другойочень эффективный, но не такой известный алгоритм называется GloVe – это то, что вы изучите следующим. GloVe расшифровывается как метод глобальных векторов дляпредставления слов. Я предпочитаю именно этот метод, поскольку он быстреесходится, а его теоретические основы, как вы увидите, более точны и легче вреализации, нежели word2vec.

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

Мыпроведём эксперимент, создав терм-документную матрицу с помощью TF-IDF, а затемиспользовав t-SNE для наглядногопредставления этой матрицы, и посмотрим, получится ли найти какие-нибудьинтересные закономерности.

И, наконец, мы охватим два новых способа создания векторного представления слов – word2vec и GloVe.

Использование предварительно подготовленного векторного представления слов

Многиеиз моих более поздних курсов связаны с тем, что изучалось в более ранних. Вотещё один пример этому. В курсе по обучению без учителя мы говорили о «жадном»предварительном обучении. Это полезная вещь, поскольку функция затрат нейронныхсетей имеет локальные минимумы и иногда при выполнении градиентного спуска можнозастрять в неудачном месте. Или вы можете столкнуться с исчезающим градиентом,когда изменения в весовых коэффициентах снижаются до нуля. Проводя жепредварительное обучение, как вы знаете, мы вначале помещаем весовые коэффициенты,полученные в сети, в «хорошее» место. Поэтому до запуска всеобъемлющегообратного распространения по всей сети первый её уровень уже имеет полезноесопоставление входных и исходящих данных. Это облегчает работу последующегоалгоритма обратного распространения ошибки.

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

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

В заключение отметим, что это очень простая идея – использовать word2vec или GloVe для предварительной подготовки векторных представлений слов, что потом несколько облегчит проведение алгоритма обратного распространения ошибки.

Словесные аналогии с применением векторного представления слов

Вэтой лекции мы поговорим о том, как на самом деле проводить вычисления вроде«король – мужчина + женщина = королева». Это довольно просто, но всё равностоит изучения.

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

Второйэтап – найти ближайшее фактическое слово в словаре в уравнении слева. Зачем этонужно? Затем, что результат операции «король – мужчина + женщина» даёт нам лишьвектор. Невозможно отобразить слово из вектора, поскольку векторноепространство непрерывно и потребуется бесконечное количество слов. Так что сутьв том, что мы просто находим ближайшее слово.

Естьразные способы нахождения расстояния. Иногда можно встретить обычное расстояниена плоскости:

||a-b||^{2}.

Обратитевнимание, что это в некотором роде противоположность тому, с чем мы обычноработали. Обычно у нас была матрица размерностью NxD, где N – количество примеров, а D – количествопризнаков. Здесь же всё как бы наоборот, поскольку словарь идёт вдоль строк, адокументы – вдоль столбцов. Но если вдуматься, это логично, потому чтодокументы, в которых появляется данное слово, и есть признаки. Например, если унас есть набор слов, встречающихся в статьях по физике, то можно сказать, чтовсе эти отдельные статьи по физике коррелируют друг с другом, а значит, для ихпредставления нужна лишь одна новая размерность. Выражаясь в терминах обучениябез учителя, скрытая причина, или скрытая переменная, – это статья по физике, афактический документ генерируется из распределения, описывающего эти статьи пофизике.

Итак,предположим, что мы использовали метод главных компонент на этойтерм-документной матрице. Мы создали преобразование из размерности VxN в размерность VxD, где D намного меньше N. Допустим, N равно одномумиллиону документов, а D = 300, что соответствует сохранению 95%первоначальной дисперсии.

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

Итак,теперь у нас есть матрица размерностью VxD. Что теперь? Собственно, это всё.

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

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

Вследующем примере с кодом мы так и сделаем. Первый этап будет состоять всоздании TF-IDF матрицы, авторой – в использовании метода нелинейного снижения размерности t-SNE, который также былраскрыт в курсе по глубокому обучению без учителя, вместо метода главныхкомпонент, являющегося линейным.

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

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

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

Этоприводит нас к вопросу: как мы будем находить векторные представления слов вэтом курсе? Очевидно, мы будем и далее реализовывать его как первый этапсоздаваемой нейронной сети. Это значит, что на входе нейронной сети у нас будетматрица размерностью VxD, как вы увидите, когда мы перейдём крекурсивным нейронным сетям.

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

Другойочень эффективный, но не такой известный алгоритм называется GloVe – это то, что вы изучите следующим. GloVe расшифровывается как метод глобальных векторов дляпредставления слов. Я предпочитаю именно этот метод, поскольку он быстреесходится, а его теоретические основы, как вы увидите, более точны и легче вреализации, нежели word2vec.

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

Мыпроведём эксперимент, создав терм-документную матрицу с помощью TF-IDF, а затемиспользовав t-SNE для наглядногопредставления этой матрицы, и посмотрим, получится ли найти какие-нибудьинтересные закономерности.

И, наконец, мы охватим два новых способа создания векторного представления слов – word2vec и GloVe.

Использование предварительно подготовленного векторного представления слов

Многиеиз моих более поздних курсов связаны с тем, что изучалось в более ранних. Вотещё один пример этому. В курсе по обучению без учителя мы говорили о «жадном»предварительном обучении. Это полезная вещь, поскольку функция затрат нейронныхсетей имеет локальные минимумы и иногда при выполнении градиентного спуска можнозастрять в неудачном месте. Или вы можете столкнуться с исчезающим градиентом,когда изменения в весовых коэффициентах снижаются до нуля. Проводя жепредварительное обучение, как вы знаете, мы вначале помещаем весовые коэффициенты,полученные в сети, в «хорошее» место. Поэтому до запуска всеобъемлющегообратного распространения по всей сети первый её уровень уже имеет полезноесопоставление входных и исходящих данных. Это облегчает работу последующегоалгоритма обратного распространения ошибки.

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

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

В заключение отметим, что это очень простая идея – использовать word2vec или GloVe для предварительной подготовки векторных представлений слов, что потом несколько облегчит проведение алгоритма обратного распространения ошибки.

Словесные аналогии с применением векторного представления слов

Вэтой лекции мы поговорим о том, как на самом деле проводить вычисления вроде«король – мужчина + женщина = королева». Это довольно просто, но всё равностоит изучения.

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

Второйэтап – найти ближайшее фактическое слово в словаре в уравнении слева. Зачем этонужно? Затем, что результат операции «король – мужчина + женщина» даёт нам лишьвектор. Невозможно отобразить слово из вектора, поскольку векторноепространство непрерывно и потребуется бесконечное количество слов. Так что сутьв том, что мы просто находим ближайшее слово.

Естьразные способы нахождения расстояния. Иногда можно встретить обычное расстояниена плоскости:

Такжераспространено косинусное расстояние:

Впоследнем случае, поскольку во время обучения значение имеет только угол, всеслова-векторы нормализуются, чтобы их длина была равна 1. Тогда все векторныепредставления будут лежать на единичной сфере.

Рассмотримподробнее, как работает косинусное расстояние. Не забывайте, что говоря орасстоянии, мы имеем в виду, что большее число означает, что слова находятсядальше друг от друга, а меньшее – что они ближе друг к другу. Но в случае скосинусным расстоянием получается наоборот. Действительно, если два векторапараллельны и направлены в одну сторону, то угол между ними равен нулю, а cos(0°) = 1 – максимальное значение косинуса. Если жедва вектора взаимно перпендикулярны , то угол между ними равен 90 градусов, а cos(90°) = 0. Ну, а если два вектора обращены впротивоположные стороны, то есть максимально далеки друг от друга, как толькомогут быть векторы, то угол будет равен 180 градусам, а cos(180°) = -1, то есть минимальное значение косинуса.

Отсюдавывод: нам не нужно использовать косинусное расстояние напрямую. На самом деленам нужно его отрицательное значение. Другой способ – использовать выражение 1– cos(a, b). В таком случае возможные расстояния будутследующими. Если два вектора направлены в одном и том же направлении, тополучим 1 – cos(0°) = 1 – 1 = 0. Если два вектора взаимноперпендикулярны – то получим 1 – cos(90°) = 1 – 0 =1. Ну, а если два вектора направлены в противоположные стороны, то получим 1 – cos(180°) = 1 – (–1) = 2.

Имеяфункцию расстояния, как найти нужное слово? Простейший способ – просмотреть всеслова в словаре и узнать расстояние между каждым вектором и рассматриваемым,отыскать наименьшее и вернуть соответствующее слово:

min_dist = Infinity; best_word = ‘’;

for word, idx in word2idx.iteritems():

    v1 = We[idx]

    if dist(v0,v1) < min_dist:

        min_dist= dist(v0, v1)

       best_word = word

print ‘’Лучшее слово:’’, best_word

Приэтом можно пропустить слова из левой части уравнения: «король», «мужчина»,«женщина».

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

Эксперимент с TF-IDF и t-SNE

Наэтой лекции мы проведём эксперимент и посмотрим, что получится прииспользовании TF-IDF на нашейтерм-документной матрице вместе с t-SNE для нахождения низкоразмерного представления этойматрицы. Почему? Потому что это интересно. Мы не будем заниматься одним только word2vec, нерассматривая более фундаментальные вопросы, только потому, что сейчас word2vec стало оченьпопулярным.

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

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

Крометого, мы используем метод t-SNE, поскольку мы уже использовали линейные модели,такие как метод главных компонент, и возникает вопрос: может ли такойнелинейный метод, как t-SNE, обеспечить более значимые результаты?

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

Итак,начинаем с импорта библиотек. Библиотека Jsonнам нужна для сохранения и загрузки отображения слов в индексы, Numpy нам всегда нужен, Matplotlib– для выведения графиков. Кроме того, мы воспользуемся данными с курса порекуррентным нейронным сетям, это «Глубокое обучение, часть 5». Оттуда мывозьмём функцию get_wikipedia_data.Если вы проходили этот курс, то все данные у вас уже есть. Последняя строка –для преобразования данных в формат TF-IDF.

import json

import numpy as np

import matplotlib.pyplot as plt

from sklearn.utils import shuffle

from sklearn.manifold import TSNE

from datetime import datetime

import os

import sys

sys.path.append(os.path.abspath(‘..’))

from rnn_class.util import get_wikipedia_data

from util import find_analogies

from sklearn.feature_extraction.text importTfidfTransformer

Начинаем.Размер словаря установим равным 1500, поскольку t-SNE – нелинейный метод и занимает много времени, а в 1500содержится большинство нужных нам слов.

def main():

    sentences,word2idx = get_wikipedia_data(n_files=10,n_vocab=1500, by_paragraph=True)

    with open(‘tfidf_word2idx.json’, ‘w’) as f:

        json.dump(word2idx, f)

Создаёмтерм-документную матрицу. V – длинаиндексов слов, N – длина предложений,так что у нас будет матрица размерностью VxN.

    # build termdocument matrix

    V =len(word2idx)

    N = len(sentences)

Создаёмматрицу VxN, после чего проводим цикл по каждому предложению икаждому слову в предложении. i – слово, j – предложение.

    # createraw counts first

    A =np.zeros((V, N))

    j = 0

    for sentencein sentences:

        for i insentence:

           A[i,j] += 1

        j += 1

   print(“finished getting raw counts”)

Следующее– преобразование данных в формат TF-IDF.

    transformer= TfidfTransformer()

    A =transformer.fit_transform(A.T).T

TfidfTransformer возвращает результат в виде, с которым t-SNE не можетработать, поэтому нам нужно преобразовать его обратно в массив Numpy. Именно это и делает toarray.Кроме того, для вывода данных на экран нам необходимо сделать обратноеотображение индексов слов. Преобразовав данные, мы можем их вывести на экран,пометив для каждой точки соответствующее ей слово.

    A =A.toarray()

    idx2word ={v:k for k, v in iteritems(word2idx)}

    tsne =TSNE()

    Z =tsne.fit_transform(A)

   plt.scatter(Z[:,0], Z[:,1])

    for i in xrange(V):

        try:

           plt.annotate(s=idx2word[i].encode(“utf8”).decode(“utf8”),xy=(Z[i,0], Z[i,1]))

        except:

           print(“bad string:”, idx2word[i])

    plt.show()

Ипоследний этап, необязательный. Можно попробовать метод t-SNE на болеевысокоразмерном представлении. Если мы не хотим всего лишь двухмерногопредставления, то аргументу n_components можно присвоить более высокое значение,чем 2.

    #  tsne = TSNE(n_components=3)

    #  We =tsne.fit_transform(A)

    We = Z

   find_analogies(‘king’, ‘man’, ‘woman’, We, word2idx, idx2word)

   find_analogies(‘france’, ‘paris’, ‘london’, We, word2idx, idx2word)

   find_analogies(‘france’, ‘paris’, ‘rome’, We, word2idx, idx2word)

   find_analogies(‘paris’, ‘france’, ‘italy’, We, word2idx, idx2word)

if __name__ == ‘__main__’:

main()

Запустимпрограмму и посмотрим, что получилось.

Итак,у нас есть облако слов. При увеличении видим ряд слов, которые в некотором родеявляются общими и связаны между собой: «кто», «имел», «у», «был», «только»,«между», «после».

Далеемы видим ещё больше слов такого рода: «в», «о», «как», «к», «и», «то», «есть».

Ещёвидим область, связанную с семьей: «женат», «свадьба», «женщина», «дети»,«брак», «рождение».

Слова,связанные с политикой: «политический», «конституционный», «правительство»,«парламент», «сила», «министр».

Слова,связанные со странами: «Канада», «канадский», «Австралия», «австралийский»,«лидеры», «сила», «свобода» – как видим, тут со словесными аналогиями дела неочень, хотя «Канада» расположена возле «канадский», а «Австралия» – возле«австралийский».

Далееопять видим слова, больше относящиеся к политике: «избранный», «президент»,«совет», «комитет».

Теперьслова, связанные с экономикой: «экономический», «банк», «развитие»,«глобальный», «финансовый», «рынок», «международный», «торговля». Прямо за нимирасположились «солдаты», хотя непонятно, при чём тут они.

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

Далееслова, относящиеся к местам: «западный», «провинция», «регион», «северный»,«южный», «страна», «стена».

Далеевидим отдельные буквы: «с», «б», «в», «д», «ж», «ф».

Мытакже находим ряд чисел, прямо в центре – месяцы года, а под ними – годы. Такимобразом, t-SNE «знает», чтоони взаимосвязаны.

Далеевидим военные слова: «войска», «армия», «военный», «безопасность», «силы»,«военно-морской», «оборона».

Далеевидим слова, связанные с обучением: «университет», «колледж», «степень»,«программы», а затем – слова связанные конкретно с программами, в частности,«оперативная», «память», «код», «устройства», «устройство». Слово «программа»является своего рода гранью между этими сферами, поскольку оно может означатькак университетскую программу, так и компьютерную, поэтому слева расположеныслова, относящиеся к компьютерной технике.

Далеефизические слова: «электроны», «электрон», «нагрев», «температура», «объём»,«константа», «расширение»… Слова, относящиеся к физической химии.

Далеебиологическая химия: «ячейки», «ячейка», «ДНК», «базовый», «кислота»,«реакция», «цикл».

Нашлисьи спортивные слова: «команды», «команда», «сезон», «игры», «лига», «футбол».

Имы нашли медицинские термины, такие как «мозг», «заболевание», «риск»,«эффекты», «кровь», «причина» – всё это слова, относящиеся к медицине.

Атеперь посмотрим на словесные аналогии. Аналогии у нас получились не оченьудачными.

Впоследнем случае, поскольку во время обучения значение имеет только угол, всеслова-векторы нормализуются, чтобы их длина была равна 1. Тогда все векторныепредставления будут лежать на единичной сфере.

Рассмотримподробнее, как работает косинусное расстояние. Не забывайте, что говоря орасстоянии, мы имеем в виду, что большее число означает, что слова находятсядальше друг от друга, а меньшее – что они ближе друг к другу. Но в случае скосинусным расстоянием получается наоборот. Действительно, если два векторапараллельны и направлены в одну сторону, то угол между ними равен нулю, а cos(0°) = 1 – максимальное значение косинуса. Если жедва вектора взаимно перпендикулярны , то угол между ними равен 90 градусов, а cos(90°) = 0. Ну, а если два вектора обращены впротивоположные стороны, то есть максимально далеки друг от друга, как толькомогут быть векторы, то угол будет равен 180 градусам, а cos(180°) = -1, то есть минимальное значение косинуса.

Отсюдавывод: нам не нужно использовать косинусное расстояние напрямую. На самом деленам нужно его отрицательное значение. Другой способ – использовать выражение 1– cos(a, b). В таком случае возможные расстояния будутследующими. Если два вектора направлены в одном и том же направлении, тополучим 1 – cos(0°) = 1 – 1 = 0. Если два вектора взаимноперпендикулярны – то получим 1 – cos(90°) = 1 – 0 =1. Ну, а если два вектора направлены в противоположные стороны, то получим 1 – cos(180°) = 1 – (–1) = 2.

Имеяфункцию расстояния, как найти нужное слово? Простейший способ – просмотреть всеслова в словаре и узнать расстояние между каждым вектором и рассматриваемым,отыскать наименьшее и вернуть соответствующее слово:

min_dist = Infinity; best_word = ‘’;

for word, idx in word2idx.iteritems():

    v1 = We[idx]

    if dist(v0,v1) < min_dist:

        min_dist= dist(v0, v1)

       best_word = word

print ‘’Лучшее слово:’’, best_word

Приэтом можно пропустить слова из левой части уравнения: «король», «мужчина»,«женщина».

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

Эксперимент с TF-IDF и t-SNE

Наэтой лекции мы проведём эксперимент и посмотрим, что получится прииспользовании TF-IDF на нашейтерм-документной матрице вместе с t-SNE для нахождения низкоразмерного представления этойматрицы. Почему? Потому что это интересно. Мы не будем заниматься одним только word2vec, нерассматривая более фундаментальные вопросы, только потому, что сейчас word2vec стало оченьпопулярным.

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

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

Крометого, мы используем метод t-SNE, поскольку мы уже использовали линейные модели,такие как метод главных компонент, и возникает вопрос: может ли такойнелинейный метод, как t-SNE, обеспечить более значимые результаты?

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

Итак,начинаем с импорта библиотек. Библиотека Jsonнам нужна для сохранения и загрузки отображения слов в индексы, Numpy нам всегда нужен, Matplotlib– для выведения графиков. Кроме того, мы воспользуемся данными с курса порекуррентным нейронным сетям, это «Глубокое обучение, часть 5». Оттуда мывозьмём функцию get_wikipedia_data.Если вы проходили этот курс, то все данные у вас уже есть. Последняя строка –для преобразования данных в формат TF-IDF.

import json

import numpy as np

import matplotlib.pyplot as plt

from sklearn.utils import shuffle

from sklearn.manifold import TSNE

from datetime import datetime

import os

import sys

sys.path.append(os.path.abspath(‘..’))

from rnn_class.util import get_wikipedia_data

from util import find_analogies

from sklearn.feature_extraction.text importTfidfTransformer

Начинаем.Размер словаря установим равным 1500, поскольку t-SNE – нелинейный метод и занимает много времени, а в 1500содержится большинство нужных нам слов.

def main():

    sentences,word2idx = get_wikipedia_data(n_files=10,n_vocab=1500, by_paragraph=True)

    with open(‘tfidf_word2idx.json’, ‘w’) as f:

        json.dump(word2idx, f)

Создаёмтерм-документную матрицу. V – длинаиндексов слов, N – длина предложений,так что у нас будет матрица размерностью VxN.

    # build termdocument matrix

    V =len(word2idx)

    N = len(sentences)

Создаёмматрицу VxN, после чего проводим цикл по каждому предложению икаждому слову в предложении. i – слово, j – предложение.

    # createraw counts first

    A =np.zeros((V, N))

    j = 0

    for sentencein sentences:

        for i insentence:

           A[i,j] += 1

        j += 1

   print(“finished getting raw counts”)

Следующее– преобразование данных в формат TF-IDF.

    transformer= TfidfTransformer()

    A =transformer.fit_transform(A.T).T

TfidfTransformer возвращает результат в виде, с которым t-SNE не можетработать, поэтому нам нужно преобразовать его обратно в массив Numpy. Именно это и делает toarray.Кроме того, для вывода данных на экран нам необходимо сделать обратноеотображение индексов слов. Преобразовав данные, мы можем их вывести на экран,пометив для каждой точки соответствующее ей слово.

    A =A.toarray()

    idx2word ={v:k for k, v in iteritems(word2idx)}

    tsne =TSNE()

    Z =tsne.fit_transform(A)

   plt.scatter(Z[:,0], Z[:,1])

    for i in xrange(V):

        try:

           plt.annotate(s=idx2word[i].encode(“utf8”).decode(“utf8”),xy=(Z[i,0], Z[i,1]))

        except:

           print(“bad string:”, idx2word[i])

    plt.show()

Ипоследний этап, необязательный. Можно попробовать метод t-SNE на болеевысокоразмерном представлении. Если мы не хотим всего лишь двухмерногопредставления, то аргументу n_components можно присвоить более высокое значение,чем 2.

    #  tsne = TSNE(n_components=3)

    #  We =tsne.fit_transform(A)

    We = Z

   find_analogies(‘king’, ‘man’, ‘woman’, We, word2idx, idx2word)

   find_analogies(‘france’, ‘paris’, ‘london’, We, word2idx, idx2word)

   find_analogies(‘france’, ‘paris’, ‘rome’, We, word2idx, idx2word)

   find_analogies(‘paris’, ‘france’, ‘italy’, We, word2idx, idx2word)

if __name__ == ‘__main__’:

main()

Запустимпрограмму и посмотрим, что получилось.

Итак,у нас есть облако слов. При увеличении видим ряд слов, которые в некотором родеявляются общими и связаны между собой: «кто», «имел», «у», «был», «только»,«между», «после».

Далеемы видим ещё больше слов такого рода: «в», «о», «как», «к», «и», «то», «есть».

Ещёвидим область, связанную с семьей: «женат», «свадьба», «женщина», «дети»,«брак», «рождение».

Слова,связанные с политикой: «политический», «конституционный», «правительство»,«парламент», «сила», «министр».

Слова,связанные со странами: «Канада», «канадский», «Австралия», «австралийский»,«лидеры», «сила», «свобода» – как видим, тут со словесными аналогиями дела неочень, хотя «Канада» расположена возле «канадский», а «Австралия» – возле«австралийский».

Далееопять видим слова, больше относящиеся к политике: «избранный», «президент»,«совет», «комитет».

Теперьслова, связанные с экономикой: «экономический», «банк», «развитие»,«глобальный», «финансовый», «рынок», «международный», «торговля». Прямо за нимирасположились «солдаты», хотя непонятно, при чём тут они.

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

Далееслова, относящиеся к местам: «западный», «провинция», «регион», «северный»,«южный», «страна», «стена».

Далеевидим отдельные буквы: «с», «б», «в», «д», «ж», «ф».

Мытакже находим ряд чисел, прямо в центре – месяцы года, а под ними – годы. Такимобразом, t-SNE «знает», чтоони взаимосвязаны.

Далеевидим военные слова: «войска», «армия», «военный», «безопасность», «силы»,«военно-морской», «оборона».

Далеевидим слова, связанные с обучением: «университет», «колледж», «степень»,«программы», а затем – слова связанные конкретно с программами, в частности,«оперативная», «память», «код», «устройства», «устройство». Слово «программа»является своего рода гранью между этими сферами, поскольку оно может означатькак университетскую программу, так и компьютерную, поэтому слева расположеныслова, относящиеся к компьютерной технике.

Далеефизические слова: «электроны», «электрон», «нагрев», «температура», «объём»,«константа», «расширение»… Слова, относящиеся к физической химии.

Далеебиологическая химия: «ячейки», «ячейка», «ДНК», «базовый», «кислота»,«реакция», «цикл».

Нашлисьи спортивные слова: «команды», «команда», «сезон», «игры», «лига», «футбол».

Имы нашли медицинские термины, такие как «мозг», «заболевание», «риск»,«эффекты», «кровь», «причина» – всё это слова, относящиеся к медицине.

Атеперь посмотрим на словесные аналогии. Аналогии у нас получились не оченьудачными.

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: