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

Допустим, у нас есть предложение: «Кто выпустил собак» (без «ху-ху», ха-ха).

чтобы обработать это, мы должны кодировать каждое уникальное слово числовым значением:

Кто →1

Пусть →2

→3

собаки →4

вне →5

Тогда это предложение будет выражено вектором: [1,2,3,4,5].

Теперь представьте, что у нас есть предложения из тысяч слов, кодировка достигла бы огромных чисел, скажем, первое слово в этом длинном длинном предложении — «The», а последнее слово в нем — «сохранено», поэтому кодирование этих двух слов будет быть«тот» →1 и «сохраненный» →1000, в этом случае, когда вы вводите эти значения в алгоритм, он будет считать, что «сохраненный» больше, чем « the», в то время как мы знаем, что это неправильно, и это скомпрометирует весь процесс.

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

Тогда пример будет:

Кто →[1,0,0,0,0]

Пусть →[0,1,0,0,0]

→[0,0,1,0,0]

собаки →[0,0,0,1,0]

выход →[0,0,0,0,1]

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

Текст из 100 слов и словарь из 10 000 слов дадут нам матрицу встраивания размером: 100 * 10 000

Ясно, что мы должны уменьшить эти векторы слов, не теряя уникальности каждого представления слова.

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

Этот подход называется Word2Vec. Где его цели:

1- отображение представлений слов в вектор более низкой размерности (n), это включает преобразование текста в матрицу с n столбцами (count_of_words * n).

2- Сохранение контекста и значения слова.

Важно знать, что для Word2Vec существует две логики процесса:

1- Skip-gram: берет входное слово и пытается оценить вероятность того, что другие слова появятся рядом с этим словом.

Граммы: это группа слов вокруг соответствующего слова, в приведенном выше примере, если мы возьмем слово «the» в качестве соответствующего слова, то [«кто», «пусть», «собаки», «вне»] являются граммами вокруг него.

Пропустить: сколько раз входное слово повторяется в данных с разным контекстом (разные граммы).

2- CBOW (непрерывный набор слов): принимает некоторый контекст в качестве входных данных и пытается найти одно слово, которое с наибольшей вероятностью соответствует этому контексту.

Чтобы обернуть две логики:

skip-gram принимает слово в качестве входных данных и выводит контекст (слова, которые часто встречаются с этим вводом).

CBOW принимает в качестве входных слов (контексты) и выводит слова, которые появляются позже с этими контекстами.

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

На этом изображении скрытый слой имеет размер 300, поэтому вектор встраивания будет иметь размер 300.

Теперь это интуиция для встраивания слов, я попытаюсь сделать еще один учебник о том, как реализовать это в python.

Любые предложения приветствуются.

Мир.